File size: 3,420 Bytes
a20b9cf
20bfe49
a20b9cf
 
 
20bfe49
3697795
a20b9cf
20bfe49
 
a20b9cf
20bfe49
a20b9cf
3697795
 
a20b9cf
20bfe49
a20b9cf
20bfe49
3697795
20bfe49
a20b9cf
11c328a
20bfe49
3697795
a20b9cf
20bfe49
 
 
 
 
 
a20b9cf
 
20bfe49
3697795
 
 
a20b9cf
20bfe49
 
 
a20b9cf
20bfe49
 
a20b9cf
20bfe49
 
 
 
 
a20b9cf
20bfe49
 
a20b9cf
20bfe49
a20b9cf
20bfe49
 
 
a20b9cf
 
20bfe49
 
 
a20b9cf
 
20bfe49
a20b9cf
20bfe49
 
 
 
 
a20b9cf
20bfe49
 
 
 
 
 
a20b9cf
20bfe49
 
a20b9cf
20bfe49
a20b9cf
20bfe49
 
 
 
 
 
 
a20b9cf
20bfe49
 
a20b9cf
20bfe49
a20b9cf
20bfe49
 
 
 
a20b9cf
 
20bfe49
a20b9cf
 
20bfe49
3697795
20bfe49
 
a20b9cf
 
20bfe49
 
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
import tempfile
import subprocess
import gradio as gr
import logging
from pathlib import Path
import sys

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("demucs")

DEFAULT_MODEL = "htdemucs"

print("✅ App is starting...")
print(f"✅ Using Python at {sys.executable}")

def run_demucs(audio_path, selected_stems, model_name=DEFAULT_MODEL):
    try:
        logger.info(f"Running Demucs on {audio_path}")
        print("🔄 Starting demucs process...")
        output_dir = tempfile.mkdtemp()

        cmd = f"{sys.executable} -m demucs -n {model_name} -o {output_dir} \"{audio_path}\""
        logger.info(f"Executing command: {cmd}")
        print(f"🧪 Running command: {cmd}")

        process = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )

        stdout, stderr = process.communicate()
        print("✅ Process finished.")
        print("STDOUT:\n", stdout)
        print("STDERR:\n", stderr)

        if process.returncode != 0:
            logger.error(f"Demucs error: {stderr}")
            raise gr.Error(f"Demucs failed: {stderr}")

        track_name = Path(audio_path).stem
        stem_dir = Path(output_dir) / model_name / track_name

        output_files = []
        for stem in selected_stems:
            stem_path = stem_dir / f"{stem}.wav"
            if stem_path.exists():
                output_files.append(str(stem_path))

        if not output_files:
            raise gr.Error("No stems were generated")

        return output_files

    except Exception as e:
        logger.error(f"Error: {str(e)}")
        raise gr.Error(f"Process failed: {str(e)}")


def create_interface():
    with gr.Blocks() as interface:
        gr.Markdown("# 🎚️ Demucs Stem Splitter")

        with gr.Row():
            audio_input = gr.Audio(type="filepath", label="Upload Audio File")

        with gr.Row():
            vocals = gr.Checkbox(label="Vocals", value=True)
            drums = gr.Checkbox(label="Drums", value=True)
            bass = gr.Checkbox(label="Bass", value=True)
            other = gr.Checkbox(label="Other", value=True)

        with gr.Row():
            model_selector = gr.Dropdown(
                label="Model",
                choices=["htdemucs", "mdx_extra", "mdx_extra_q"],
                value="htdemucs"
            )

        with gr.Row():
            submit_btn = gr.Button("Split Stems")

        output = gr.File(label="Output Stems", file_count="multiple")

        def process(audio_file, vocals_enabled, drums_enabled, bass_enabled, other_enabled, model):
            selected = [stem for stem, enabled in [
                ("vocals", vocals_enabled),
                ("drums", drums_enabled),
                ("bass", bass_enabled),
                ("other", other_enabled),
            ] if enabled]

            if not selected:
                raise gr.Error("Please select at least one stem")

            return run_demucs(audio_file, selected, model)

        submit_btn.click(
            fn=process,
            inputs=[audio_input, vocals, drums, bass, other, model_selector],
            outputs=output
        )

    return interface


def main():
    print("🚀 Launching Gradio interface...")
    interface = create_interface()
    interface.launch()


if __name__ == '__main__':
    main()