{"id": "d9e3f5b2-1c4a-4f7e-b2d8-gmanski-vocalsplit", "revision": 0, "last_node_id": 4, "last_link_id": 2, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-900, -300], "size": [460, 620], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Gmanski Vocal Split\n\n**Pull the lead vocal out of a finished song.** Demucs (htdemucs) separates the vocal; with `sample_seconds` above 0\nit keeps only the stretch with the most singing, ready to feed **Voice Clone (Speak / Sing)** as the voice sample.\n\n### Run it\n1. **Song**: vocal + music, one lead singer.\n2. `sample_seconds`: 18 is a good voice sample (Voice Clone reads up to 20 s). 0 keeps the whole vocal (an a\n   cappella / stem).\n3. Queue. Result: `output/audio/Gmanski/vocal_split_*.flac`.\n\nTypical use: you made a song with MiniMax Music 3 or ACE-Step and like the singer. Split it here, keep the 18 s\nsample, and sing your next songs in that voice with Voice Clone (Sing).\n\n### Setup\n- Needs **ComfyUI-Gmanski 1.4.0+**. The voice engines run in their own Python environments under `/opt/voice`;\n  the Gmanski pod image (Nov 2026 or newer) has them. Anywhere else, run\n  `bash custom_nodes/ComfyUI-Gmanski/voice_workers/install.sh` once.\n- No model pack: the first run downloads the voice models (about 3 GB) into `models/voice`.\n\n### Consent\nOnly clone a voice you have permission to use: your own, or someone who agreed to it. Do not use a cloned voice to\nimpersonate a real person, deceive anyone or get around a voice check. Chatterbox stamps an inaudible watermark\n(Perth) into every clip it speaks.\n"], "title": "Read me: Vocal Split", "color": "#432", "bgcolor": "#653"}, {"id": 2, "type": "LoadAudio", "pos": [-400, -300], "size": [360, 160], "flags": {}, "order": 1, "mode": 0, "inputs": [{"name": "audio", "type": "COMBO", "link": null, "widget": {"name": "audio"}}], "outputs": [{"name": "AUDIO", "type": "AUDIO", "links": [1]}], "properties": {"Node name for S&R": "LoadAudio"}, "widgets_values": ["song.mp3", null, null], "title": "Song (vocal + music)"}, {"id": 3, "type": "VocalSplit", "pos": [20, -300], "size": [380, 130], "flags": {}, "order": 2, "mode": 0, "inputs": [{"name": "song", "type": "AUDIO", "link": 1}, {"name": "sample_seconds", "type": "FLOAT", "link": null, "widget": {"name": "sample_seconds"}}, {"name": "keep_model_loaded", "type": "BOOLEAN", "link": null, "widget": {"name": "keep_model_loaded"}}], "outputs": [{"name": "vocal", "type": "AUDIO", "links": [2]}], "properties": {"Node name for S&R": "VocalSplit"}, "widgets_values": [18.0, false], "title": "Vocal Split (Demucs)"}, {"id": 4, "type": "SaveAudioAdvanced", "pos": [460, -300], "size": [360, 150], "flags": {}, "order": 3, "mode": 0, "inputs": [{"name": "audio", "type": "AUDIO", "link": 2}, {"name": "filename_prefix", "type": "STRING", "link": null, "widget": {"name": "filename_prefix"}}, {"name": "format", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "format"}}, {"name": "audioUI", "type": "AUDIO_UI", "link": null, "widget": {"name": "audioUI"}}], "outputs": [{"name": "audio", "type": "AUDIO", "links": []}], "properties": {"Node name for S&R": "SaveAudioAdvanced"}, "widgets_values": ["audio/Gmanski/vocal_split", "flac"], "title": "Save vocal / voice sample (flac)"}], "links": [[1, 2, 0, 3, 0, "AUDIO"], [2, 3, 0, 4, 0, "AUDIO"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "vocal-split", "generator": "scripts/build_gmanski_voice_clone_workflows.py", "source": "https://gmanski.com/workflows/vocal-split"}, "version": 0.4}