File size: 1,586 Bytes
5cc486d
c3ca849
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5cc486d
c3ca849
 
 
 
 
5cc486d
 
c3ca849
 
 
 
 
cc3cb59
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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()