Spaces:
Paused
Paused
import gradio as gr | |
from musc.model import PretrainedModel | |
from json import load as json_load | |
from mido import MidiFile,MidiTrack | |
from os import remove as os_remove | |
Model = PretrainedModel(json_load(open("violin.json")),"violin_model.pt").to("cpu") | |
def merge_violin_tracks(input_midi, output_midi): | |
mid = MidiFile(input_midi) | |
new_mid = MidiFile(ticks_per_beat=mid.ticks_per_beat) | |
new_track = MidiTrack() | |
new_mid.tracks.append(new_track) | |
events = [] | |
for track in mid.tracks: | |
current_time = 0 | |
for msg in track: | |
current_time += msg.time | |
events.append((current_time, msg)) | |
events.sort(key=lambda x: x[0]) | |
last_time = 0 | |
for event_time, msg in events: | |
delta_time = event_time - last_time | |
new_track.append(msg.copy(time=delta_time)) | |
last_time = event_time | |
for track in mid.tracks: | |
for msg in track: | |
if msg.type == 'set_tempo': | |
new_track.insert(0, msg) | |
new_mid.save(output_midi) | |
def transcribe_and_generate_midi(music_file_path, model=Model, batch_size=32): | |
model.transcribe(music_file_path, batch_size=batch_size).write("output.mid") | |
merge_violin_tracks("output.mid","output.mid") | |
os_remove(music_file_path) | |
return "output.mid" | |
gr.Interface( | |
fn=transcribe_and_generate_midi, | |
inputs=gr.Audio(label="Upload your Audio file",type="filepath"), | |
outputs=gr.File(label="Download MIDI file"), | |
title="Audio2Violin", | |
description="Upload a Audio file, and it will be transcribed into Violin MIDI format." | |
).launch() |