DurreSudoku's picture
Update app.py
cbbff9c verified
raw
history blame
4.03 kB
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)