Chupacharcos commited on
Commit
36ae49a
·
verified ·
1 Parent(s): 2e018cc

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +65 -0
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()