File size: 2,574 Bytes
36ae49a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""
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("<sub>Open source de **Adrián Moreno** · [portfolio](https://adrianmoreno-dev.com?utm_source=huggingface) · modelo HTDemucs v4 (MIT)</sub>")

if __name__ == "__main__":
    demo.launch()