Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import tensorflow as tf | |
| from scipy.io.wavfile import write | |
| import keras.backend as K | |
| import librosa.display | |
| import cv2 | |
| import librosa | |
| import matplotlib.pyplot as plt | |
| import librosa.display | |
| import numpy as np | |
| from keras.applications import VGG16 | |
| import os | |
| import scipy | |
| # Define function to preprocess input audio | |
| #convert song to mel spectogram as siamese network doesn't work on sound directly | |
| def create_spectrogram(clip,sample_rate,save_path): | |
| plt.interactive(False) | |
| fig=plt.figure(figsize=[0.72,0.72]) | |
| S=librosa.feature.melspectrogram(y=clip,sr=sample_rate) | |
| librosa.display.specshow(librosa.power_to_db(S,ref=np.max)) | |
| fig.savefig(save_path,dpi=400,bbox_inches='tight',pad_inches=0) | |
| plt.close() | |
| fig.clf() | |
| plt.close(fig) | |
| plt.close('all') | |
| del save_path,clip,sample_rate,fig,S | |
| def load_img(path): | |
| img=cv2.imread(path) | |
| img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) | |
| img=cv2.resize(img,(150,150)) | |
| return img | |
| import pickle | |
| def main_loop(): | |
| with open('dict.pickle', 'rb') as handle: | |
| songspecdict = pickle.load(handle) | |
| # Load the song to match | |
| song, sr = librosa.load("my_audio.wav") | |
| to_match = np.copy(song[0:220500]) | |
| print("Loaded data into librosa...") | |
| # Create spectrogram image of the song to match | |
| create_spectrogram(to_match, sr, 'test.png') | |
| print("Created spectogram...") | |
| # Load the spectrogram image of the song to match | |
| to_match_img = load_img('test.png') | |
| to_match_img = np.expand_dims(to_match_img, axis=0) | |
| print("Loaded spectrum image...") | |
| # Get the embedding of the song to match | |
| # Load the tune recognition model | |
| model = tf.keras.models.load_model('./embdmodel_1.hdf5') | |
| embedding_model=model.layers[2] | |
| to_match_emb = embedding_model.predict(to_match_img) | |
| print("Get song embedding...") | |
| # Calculate the distances between the song to match and the songs in the database | |
| songsdistdict = {} | |
| for key, values in songspecdict.items(): | |
| dist_array = [] | |
| for embd in values: | |
| dist_array.append(np.linalg.norm(to_match_emb - embd)) | |
| songsdistdict[key] = min(dist_array) | |
| song_titles=list(songsdistdict.keys()) | |
| distances=list(songsdistdict.values()) | |
| # Get the title and artist of the recognized song | |
| recognized_song_artist, recognized_song_title = song_titles[distances.index(min(distances))].split('-') | |
| recognized_song_title = os.path.splitext(recognized_song_title)[0] | |
| print(f'Artist: {recognized_song_artist}') | |
| print(f'Title: {recognized_song_title}') | |
| return recognized_song_title |