midi-ddsp / app.py
vedmistry's picture
fix: use synthesize_mono_midi directly with explicit instrument_id
07c6778
Raw
History Blame Contribute Delete
2.95 kB
import os
import subprocess
import tempfile
import soundfile as sf
import numpy as np
import gradio as gr
from pyharp import ModelCard, build_endpoint
synthesis_generator = None
expression_generator = None
INSTRUMENTS = [
"violin", "viola", "cello", "double bass", "flute", "oboe",
"clarinet", "saxophone", "bassoon", "trumpet", "horn", "trombone", "tuba"
]
def get_model():
global synthesis_generator, expression_generator
if synthesis_generator is None:
print("Downloading MIDI-DDSP model weights...", flush=True)
subprocess.run(["midi_ddsp_download_model_weights"], check=True)
print("Loading MIDI-DDSP model...", flush=True)
from midi_ddsp import load_pretrained_model
synthesis_generator, expression_generator = load_pretrained_model()
print("Model loaded.", flush=True)
return synthesis_generator, expression_generator
model_card = ModelCard(
name="MIDI-DDSP",
description="Synthesize MIDI files into expressive audio using DDSP. Supports 13 orchestral instruments with realistic performance rendering.",
author="Yusong Wu, Ethan Manilow, Yi Deng, et al. (Google Magenta)",
tags=["midi", "synthesis", "ddsp", "performance-rendering", "orchestral"],
)
def process_fn(input_midi_path: str, instrument: str) -> str:
print(f"Synthesizing {instrument}...", flush=True)
syn_gen, exp_gen = get_model()
from midi_ddsp.utils.midi_synthesis_utils import synthesize_mono_midi
from midi_ddsp.data_handling.instrument_name_utils import INST_NAME_TO_ID_DICT
instrument_id = INST_NAME_TO_ID_DICT[instrument]
print(f"instrument_id: {instrument_id}", flush=True)
output_dir = tempfile.mkdtemp()
midi_audio, midi_control_params, midi_synth_params, conditioning_df = synthesize_mono_midi(
syn_gen, exp_gen, input_midi_path, instrument_id, output_dir=None
)
audio = midi_audio.numpy()
if audio.ndim > 1:
audio = audio.squeeze()
output_path = tempfile.mktemp(suffix=".wav")
sf.write(output_path, audio, 16000)
print("Done.", flush=True)
return output_path
with gr.Blocks() as demo:
input_components = [
gr.File(
type="filepath",
label="Input MIDI File",
file_types=[".mid", ".midi"],
).harp_required(True),
gr.Dropdown(
choices=INSTRUMENTS,
value="violin",
label="Instrument",
),
]
output_components = [
gr.Audio(
type="filepath",
label="Synthesized Audio",
).set_info("Expressive audio rendered from MIDI using DDSP."),
]
app = build_endpoint(
model_card=model_card,
input_components=input_components,
output_components=output_components,
process_fn=process_fn,
)
print("Launching Gradio...", flush=True)
demo.queue().launch(server_name="0.0.0.0", server_port=7860, show_error=True, pwa=True)