Spaces:
Sleeping
Sleeping
Upload app.py with huggingface_hub
Browse files
app.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Stem Splitter — separa cualquier canción en 4 pistas (voz, batería, bajo, otros)
|
| 3 |
+
con HTDemucs v4. Gratis. Esta demo procesa los primeros 30 s (CPU gratuita de HF);
|
| 4 |
+
la versión completa (canción entera) está en adrianmoreno-dev.com.
|
| 5 |
+
|
| 6 |
+
Por Adrián Moreno · https://adrianmoreno-dev.com
|
| 7 |
+
"""
|
| 8 |
+
import os
|
| 9 |
+
import subprocess
|
| 10 |
+
import tempfile
|
| 11 |
+
|
| 12 |
+
import gradio as gr
|
| 13 |
+
|
| 14 |
+
MAX_SECONDS = 30
|
| 15 |
+
MODEL = "htdemucs"
|
| 16 |
+
STEMS = [("vocals", "🎤 Voz"), ("drums", "🥁 Batería"), ("bass", "🎸 Bajo"), ("other", "🎹 Otros")]
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def separate(audio_path):
|
| 20 |
+
if not audio_path:
|
| 21 |
+
raise gr.Error("Sube una canción primero.")
|
| 22 |
+
|
| 23 |
+
workdir = tempfile.mkdtemp()
|
| 24 |
+
trimmed = os.path.join(workdir, "input.wav")
|
| 25 |
+
|
| 26 |
+
# 1) Recorta a 30 s y normaliza a wav estéreo 44.1 kHz (ffmpeg lee mp3/wav/flac/ogg).
|
| 27 |
+
subprocess.run(
|
| 28 |
+
["ffmpeg", "-y", "-i", audio_path, "-t", str(MAX_SECONDS),
|
| 29 |
+
"-ac", "2", "-ar", "44100", trimmed],
|
| 30 |
+
check=True, capture_output=True)
|
| 31 |
+
|
| 32 |
+
# 2) Separa con HTDemucs (CLI estable).
|
| 33 |
+
subprocess.run(
|
| 34 |
+
["python", "-m", "demucs", "-n", MODEL, "-o", workdir, trimmed],
|
| 35 |
+
check=True, capture_output=True)
|
| 36 |
+
|
| 37 |
+
out_dir = os.path.join(workdir, MODEL, "input")
|
| 38 |
+
results = []
|
| 39 |
+
for stem, _label in STEMS:
|
| 40 |
+
p = os.path.join(out_dir, f"{stem}.wav")
|
| 41 |
+
results.append(p if os.path.exists(p) else None)
|
| 42 |
+
return results
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
with gr.Blocks(title="Stem Splitter", theme=gr.themes.Soft(primary_hue="teal")) as demo:
|
| 46 |
+
gr.Markdown(
|
| 47 |
+
"# 🎵 Stem Splitter — separa cualquier canción en 4 pistas\n"
|
| 48 |
+
"Sube una canción y la IA (**HTDemucs v4**) la separa en **voz, batería, bajo y melodía**. "
|
| 49 |
+
"Gratis y open source. *Esta demo procesa los primeros 30 segundos (CPU gratuita); puede tardar ~1 min.*\n\n"
|
| 50 |
+
"👉 Canción completa y remezcla en tiempo real en "
|
| 51 |
+
"[adrianmoreno-dev.com](https://adrianmoreno-dev.com/demo/stem-splitter?utm_source=huggingface)"
|
| 52 |
+
)
|
| 53 |
+
inp = gr.Audio(type="filepath", label="Sube una canción (mp3, wav…)")
|
| 54 |
+
btn = gr.Button("🎚️ Separar en stems", variant="primary")
|
| 55 |
+
with gr.Row():
|
| 56 |
+
out_v = gr.Audio(label="🎤 Voz")
|
| 57 |
+
out_d = gr.Audio(label="🥁 Batería")
|
| 58 |
+
with gr.Row():
|
| 59 |
+
out_b = gr.Audio(label="🎸 Bajo")
|
| 60 |
+
out_o = gr.Audio(label="🎹 Otros")
|
| 61 |
+
btn.click(separate, inp, [out_v, out_d, out_b, out_o])
|
| 62 |
+
gr.Markdown("<sub>Open source de **Adrián Moreno** · [portfolio](https://adrianmoreno-dev.com?utm_source=huggingface) · modelo HTDemucs v4 (MIT)</sub>")
|
| 63 |
+
|
| 64 |
+
if __name__ == "__main__":
|
| 65 |
+
demo.launch()
|