Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,57 +1,42 @@
|
|
1 |
import gradio as gr
|
2 |
-
|
3 |
-
from
|
4 |
-
from
|
5 |
-
from
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
-
def
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
return
|
19 |
|
20 |
-
def inference(file_upload, composer, sf2_files):
|
21 |
-
sf2_files = ["soundfonts/" + i + ".sf2" for i in sf2_files]
|
22 |
-
audio_data, audio_sr = librosa_load(file_upload, sr=None)
|
23 |
-
inputs = processor(audio=audio_data, sampling_rate=audio_sr, return_tensors="pt").to("cpu")
|
24 |
-
midi = processor.batch_decode(
|
25 |
-
token_ids=model.generate(input_features=inputs["input_features"], composer="composer" + str(composer)),
|
26 |
-
feature_extractor_output=inputs
|
27 |
-
)["pretty_midi_objects"][0]
|
28 |
-
with open("output.mid", "wb") as midi_file:
|
29 |
-
midi.write(midi_file)
|
30 |
-
midi = PrettyMIDI("output.mid")
|
31 |
-
final_mix = librosa_to_audiosegment(audio_data, audio_sr).apply_gain(-16)
|
32 |
-
for sf2_file in sf2_files:
|
33 |
-
sf_audio_data = midi.fluidsynth(fs=44100, sf2_path=sf2_file)
|
34 |
-
epsilon = 1e-8
|
35 |
-
sf_audio_data = np.int16(sf_audio_data / (np.max(np.abs(sf_audio_data)) + epsilon) * 32767)
|
36 |
-
sf_audio_segment = librosa_to_audiosegment(sf_audio_data, 44100)
|
37 |
-
if len(sf_audio_segment) < len(final_mix):
|
38 |
-
sf_audio_segment = sf_audio_segment.append(AudioSegment.silent(duration=len(final_mix) - len(sf_audio_segment)))
|
39 |
-
elif len(sf_audio_segment) > len(final_mix):
|
40 |
-
sf_audio_segment = sf_audio_segment[:len(final_mix)]
|
41 |
-
final_mix = final_mix.overlay(sf_audio_segment)
|
42 |
-
final_mix.export("output.mp3", format="mp3")
|
43 |
-
os_remove(file_upload)
|
44 |
-
return "output.mid", "output.mp3", f'<div style="display: flex; justify-content: center; align-items: center;"><iframe style="width: 100%; height: 500px; overflow:hidden" srcdoc=\'{open("midi_viz.html").read().replace("{midi_data}", b64encode(open("output.mid","rb").read()).decode("utf-8"))}\'></iframe></div>'
|
45 |
gr.Interface(
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
],
|
52 |
-
[
|
53 |
-
gr.File(label="MIDI"),
|
54 |
-
gr.Audio(label="Instrument Audio"),
|
55 |
-
gr.HTML()
|
56 |
-
]
|
57 |
).launch()
|
|
|
1 |
import gradio as gr
|
2 |
+
from musc.model import PretrainedModel
|
3 |
+
from json import load as json_load
|
4 |
+
from mido import MidiFile,MidiTrack
|
5 |
+
from os import remove as os_remove
|
6 |
+
Model = PretrainedModel(json_load(open("violin.json")),"violin_model.pt").to("cpu")
|
7 |
+
def merge_violin_tracks(input_midi, output_midi):
|
8 |
+
mid = MidiFile(input_midi)
|
9 |
+
new_mid = MidiFile(ticks_per_beat=mid.ticks_per_beat)
|
10 |
+
new_track = MidiTrack()
|
11 |
+
new_mid.tracks.append(new_track)
|
12 |
+
events = []
|
13 |
+
for track in mid.tracks:
|
14 |
+
current_time = 0
|
15 |
+
for msg in track:
|
16 |
+
current_time += msg.time
|
17 |
+
events.append((current_time, msg))
|
18 |
+
events.sort(key=lambda x: x[0])
|
19 |
+
last_time = 0
|
20 |
+
for event_time, msg in events:
|
21 |
+
delta_time = event_time - last_time
|
22 |
+
new_track.append(msg.copy(time=delta_time))
|
23 |
+
last_time = event_time
|
24 |
+
for track in mid.tracks:
|
25 |
+
for msg in track:
|
26 |
+
if msg.type == 'set_tempo':
|
27 |
+
new_track.insert(0, msg)
|
28 |
+
new_mid.save(output_midi)
|
29 |
|
30 |
+
def transcribe_and_generate_midi(music_file_path, model=Model, batch_size=32):
|
31 |
+
model.transcribe(music_file_path, batch_size=batch_size).write("output.mid")
|
32 |
+
merge_violin_tracks("output.mid","output.mid")
|
33 |
+
os_remove(music_file_path)
|
34 |
+
return "output.mid"
|
35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
gr.Interface(
|
37 |
+
fn=transcribe_and_generate_midi,
|
38 |
+
inputs=gr.Audio(label="Upload your Audio file",type="filepath"),
|
39 |
+
outputs=gr.File(label="Download MIDI file"),
|
40 |
+
title="Audio2Violin",
|
41 |
+
description="Upload a Audio file, and it will be transcribed into Violin MIDI format."
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
).launch()
|