import gradio as gr import keras import librosa #import hopsworks import os import numpy as np import shutil from functions import log_mel_spectrogram, split_spectrogram, load_audio_file, image_transformer, save_spectrogram_as_png from datasets import load_dataset def return_input(input): return input def create_image_folder(folder): try: os.mkdir(folder) except: FileExistsError() return def delete_folder(folder): try: shutil.rmtree(folder) except: FileNotFoundError() return def create_dataset(image_folder): image_dataset = load_dataset(image_folder, split=None)["train"] print(image_dataset) image_dataset = image_dataset.map(image_transformer, batched=True, fn_kwargs={"mode": "L"}) image_dataset_tf = image_dataset.to_tf_dataset(batch_size=1, columns="image") return image_dataset_tf def majority_vote(raw_predictions): label_predictions = np.argmax(raw_predictions, axis=1) labels, count = np.unique(label_predictions, return_counts=True) winner = labels[np.argmax(count)] return label_decoding[winner] def predict(audio): create_image_folder(folder) try: audio_array = load_audio_file(audio, sample_rate, res_type, duration) except: return "Error when loading audio. Did you submit a file?" spectrogram = log_mel_spectrogram(audio_array, sample_rate, nfft, hop_length, window) spec_splits = split_spectrogram(spectrogram, output_shape) for idx, split in enumerate(spec_splits): save_path = os.path.join(folder, f"{idx+1}_spec.png") save_spectrogram_as_png(split, save_path, sample_rate, nfft, hop_length) image_dataset = create_dataset(folder) raw_preds = model.predict(image_dataset, verbose=0) genre_pred = majority_vote(raw_preds) return f"The submitted audio belongs to the {genre_pred} genre!" sample_rate = 22050 res_type = "kaiser_fast" nfft = 2048 hop_length = 512 window = "hann" output_shape = (128, 256) duration = 0 folder = "images" label_decoding = {0: "Electronic", 1: "Experimental", 2: "Folk", 3: "Hip-Hop", 4: "Instrumental", 5: "International", 6: "Pop", 7: "Rock"} model_path = "best_model.keras" model = keras.models.load_model(model_path) """ model_version = 1 project = hopsworks.login() mr = project.get_model_registry() model = mr.get_model("cnn_genre_classifier", version=model_version) model_dir = model.download() model = keras.models.load_model(model_dir) """ with gr.Blocks() as demo: with gr.Row(): gr.Markdown( """ # Music Genre Classifier Hello! This is a prototype for a genre classification service, where you can upload an audio file, and the model will predict which genre it belongs to! The model has been trained to predict 8 top-level genres, that each encompasses a multitude of sub-genres. The top-level genres are: 1. Electronic 2. Experimental 3. Folk 4. Hip-Hop 5. Intrumental 6. International 7. Pop 8. Rock Upload your favorite song or choose one of the example tracks and give it a try! """ ) with gr.Row(): with gr.Column(): audio = gr.Audio(sources="upload", type="filepath", label="Upload your song here", format="wav") with gr.Column(): files = gr.FileExplorer(label="Example songs", file_count="single", root="examples", interactive=True) files.change(fn=return_input, inputs=files, outputs=audio) with gr.Row(): answer_box = gr.Text(label="Answer appears here", interactive=False) with gr.Row(): submit_audio = gr.Button(value="Submit audio for prediction") submit_audio.click(fn=predict, inputs=audio, outputs=answer_box, trigger_mode="once") submit_audio.click(fn=delete_folder) demo.launch(share=True)