Spaces:
Sleeping
Sleeping
| 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, compile=False) | |
| """ | |
| 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) |