""" Stem Splitter — separa cualquier canción en 4 pistas (voz, batería, bajo, otros) con HTDemucs v4. Gratis. Esta demo procesa los primeros 30 s (CPU gratuita de HF); la versión completa (canción entera) está en adrianmoreno-dev.com. Por Adrián Moreno · https://adrianmoreno-dev.com """ import os import subprocess import tempfile import gradio as gr MAX_SECONDS = 30 MODEL = "htdemucs" STEMS = [("vocals", "🎤 Voz"), ("drums", "🥁 Batería"), ("bass", "🎸 Bajo"), ("other", "🎹 Otros")] def separate(audio_path): if not audio_path: raise gr.Error("Sube una canción primero.") workdir = tempfile.mkdtemp() trimmed = os.path.join(workdir, "input.wav") # 1) Recorta a 30 s y normaliza a wav estéreo 44.1 kHz (ffmpeg lee mp3/wav/flac/ogg). subprocess.run( ["ffmpeg", "-y", "-i", audio_path, "-t", str(MAX_SECONDS), "-ac", "2", "-ar", "44100", trimmed], check=True, capture_output=True) # 2) Separa con HTDemucs (CLI estable). subprocess.run( ["python", "-m", "demucs", "-n", MODEL, "-o", workdir, trimmed], check=True, capture_output=True) out_dir = os.path.join(workdir, MODEL, "input") results = [] for stem, _label in STEMS: p = os.path.join(out_dir, f"{stem}.wav") results.append(p if os.path.exists(p) else None) return results with gr.Blocks(title="Stem Splitter", theme=gr.themes.Soft(primary_hue="teal")) as demo: gr.Markdown( "# 🎵 Stem Splitter — separa cualquier canción en 4 pistas\n" "Sube una canción y la IA (**HTDemucs v4**) la separa en **voz, batería, bajo y melodía**. " "Gratis y open source. *Esta demo procesa los primeros 30 segundos (CPU gratuita); puede tardar ~1 min.*\n\n" "👉 Canción completa y remezcla en tiempo real en " "[adrianmoreno-dev.com](https://adrianmoreno-dev.com/demo/stem-splitter?utm_source=huggingface)" ) inp = gr.Audio(type="filepath", label="Sube una canción (mp3, wav…)") btn = gr.Button("🎚️ Separar en stems", variant="primary") with gr.Row(): out_v = gr.Audio(label="🎤 Voz") out_d = gr.Audio(label="🥁 Batería") with gr.Row(): out_b = gr.Audio(label="🎸 Bajo") out_o = gr.Audio(label="🎹 Otros") btn.click(separate, inp, [out_v, out_d, out_b, out_o]) gr.Markdown("Open source de **Adrián Moreno** · [portfolio](https://adrianmoreno-dev.com?utm_source=huggingface) · modelo HTDemucs v4 (MIT)") if __name__ == "__main__": demo.launch()