"""Lambda handler for defining audio track similarity.""" import os import time import uuid import ffmpy import librosa from fastdtw import fastdtw DEFAULT_TMP_DIR = os.environ.get('DEFAULT_TMP_DIR') # without ending backslash FFMPEG_PATH = os.environ.get('FFMPEG', '/usr/local/bin/ffmpeg') PCM_S16LE_CODEC = '-acodec pcm_s16le -ar 16000 -ac 1' def time_usage(func): def wrapper(*args, **kwargs): beg_ts = time.time() retval = func(*args, **kwargs) end_ts = time.time() print("elapsed time: %f" % (end_ts - beg_ts)) return retval return wrapper def transcode_to_pcm(input_path): """Transcode input file to pcm encoded audio file by ffmpeg. Args: input_path (str): input file path Result: str: output wav file path. File has unique filename. """ output_path = '{}/{}.wav'.format(DEFAULT_TMP_DIR, uuid.uuid4()) ff = ffmpy.FFmpeg( executable=FFMPEG_PATH, # add path to executable ffmpeg inputs={input_path: None}, outputs={output_path: PCM_S16LE_CODEC} ) ff.run() return output_path @time_usage def handler(event, context): """Handler method.""" # Loading audio files y1, sr1 = librosa.load(transcode_to_pcm(event['output_path'])) y2, sr2 = librosa.load(transcode_to_pcm(event['source_path'])) mfcc1 = librosa.feature.mfcc(y1, sr1) # Computing MFCC values mfcc2 = librosa.feature.mfcc(y2, sr2) dist = fastdtw(mfcc1.T, mfcc2.T) # print("The normalized distance between the two : ", dist) return {event['output_path']: dist[0]} if __name__ == '__main__': events = [ { 'output_path': '/Users/maximov/Desktop/tmp/b-flac.flac', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-mp3.mp3', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-m4.m4a', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-wav.wav', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-1-muted.wav', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-5-muted.wav', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' }, { 'output_path': '/Users/maximov/Desktop/tmp/b-001-muted.wav', 'source_path': '/Users/maximov/Desktop/tmp/b.wav' } ] result_correlation = [] for e in events: result_correlation.append(handler(e, None)) for item in result_correlation: print(item)