import gradio as gr import subprocess import os import shutil def separate_audio(input_file): if input_file is None: return None, None, "Please upload a file first." # 1. Setup paths output_dir = "separated" if os.path.exists(output_dir): shutil.rmtree(output_dir) # Clean up previous run os.makedirs(output_dir, exist_ok=True) print(f"Processing: {input_file}") # 2. Run Demucs (Command Line Interface inside Python) # We use "htdemucs" (high quality) and 2 stems (vocals/accompaniment) command = [ "demucs", "--two-stems=vocals", "-n", "htdemucs", "--out", output_dir, input_file ] try: subprocess.run(command, check=True) except subprocess.CalledProcessError as e: return None, None, f"Error during separation: {str(e)}" # 3. Locate Output Files # Demucs structure: separated/htdemucs/{filename}/vocals.wav filename_no_ext = os.path.splitext(os.path.basename(input_file))[0] target_folder = os.path.join(output_dir, "htdemucs", filename_no_ext) vocals_path = os.path.join(target_folder, "vocals.wav") bg_path = os.path.join(target_folder, "no_vocals.wav") if os.path.exists(vocals_path) and os.path.exists(bg_path): return vocals_path, bg_path, "✅ Separation Complete!" else: return None, None, "❌ Could not find output files." # --- The Interface --- with gr.Blocks(title="Indic Dubbing Studio") as demo: gr.Markdown("# 🎙️ Indic Dubbing Studio - Phase 1") gr.Markdown("Step 1: Separate your video into **Vocals** (for translation) and **Background** (for mixing).") with gr.Row(): with gr.Column(): input_file = gr.Audio(type="filepath", label="Upload Video or Audio", sources=["upload"]) process_btn = gr.Button("Split Audio (Demucs)", variant="primary") with gr.Column(): status_output = gr.Label(label="Status") out_vocals = gr.Audio(label="Vocals (Clean Speech)") out_bg = gr.Audio(label="Background (Music/SFX)") process_btn.click( fn=separate_audio, inputs=[input_file], outputs=[out_vocals, out_bg, status_output] ) if __name__ == "__main__": demo.launch()