Audio2Violin / app.py
shethjenil's picture
Update app.py
c3ca849 verified
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()