VocalSeparationNode
Separate vocals from any track inside ComfyUI — no API, no key, real stem splits
- music
- vocals_AUDIO
- instrumental_AUDIO
The name tells you exactly what it does, which is rarer than it should be. VocalSeparationNode takes an audio clip and splits it into two stems: vocals_AUDIO and instrumental_AUDIO. Everything runs locally - no API call, no key, no account. Feed it a song and you get the isolated voice out one socket and the karaoke version out the other.
Why do this inside ComfyUI when dedicated splitters like UVR exist? Because the stems come out as AUDIO objects. They plug straight into the rest of your graph: save them, feed the vocal into a lip-sync or audio-reactive workflow, or process one stem and recombine it. That turns stem separation from a detour through a separate app into a step in a graph. From AIFSH - the same person who's ported Hallo, OmniGen, and a pile of other research models into ComfyUI - this is one of the lighter-weight packs in their catalog.
How it works
It's a wrapper around ZFTurbo/Music-Source-Separation-Training, with that project's strongest single-stem checkpoints. The node loads the chosen model, auto-downloads its checkpoint on first use into ComfyUI/models/AIFSH/Music-Source-Separation-Training/, resamples your clip to 44.1 kHz, and runs it. CUDA is used when it's available; otherwise it silently falls back to CPU.
One detail trips people up: only the vocals are actually predicted. The instrumental_AUDIO output is the remainder - the original mix minus the vocal - so it's not an independent prediction, it's whatever's left over. And both stems come back mono, even from a stereo source. It's a working stem, not a lossless master.
The inputs that matter
Five fields, and you'll only touch three:
music(AUDIO) - the track you want split.model_type-bs_roformeris the default and the one to keep. It's the VIPERX Band-Split Roformer that tops the source-separation leaderboards.htdemucs(Meta's Demucs hybrid transformer),mdx23c,segm_models, andmel_band_roformerare the alternates. The model is cached per type, so switching mid-session triggers a reload - and possibly a fresh checkpoint download.batch_size- how much audio the model chews per chunk (default 4). Drop it if long tracks are eating VRAM.if_mirror- easy to misread. It defaults to True and has nothing to do with your audio: it prependshttps://mirror.ghproxy.com/to the checkpoint download URL, a GitHub proxy. If downloads stall or come back corrupt, flipping this changes the fetch route.
The two outputs are vocals_AUDIO and instrumental_AUDIO, both standard AUDIO type - wire them into any save or processing node.
Install
This is the same pack as CombineAudioNode, so install once. ComfyUI Manager → search "VocalSeparation-ComfyUI", or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/AIFSH/VocalSeparation-ComfyUI
cd VocalSeparation-ComfyUI
pip install -r requirements.txt
Then restart ComfyUI. The weights download themselves on first run - no manual model fetching.
Honest warning: that requirements.txt is long and heavy - demucs, asteroid, transformers, pedalboard, and a stack of torch-audio utilities. This is classic dependency hell; if another node pinned an old transformers, something here may refuse to install or silently break later.
Where people get burned
Most of the pain lands on the first run. The checkpoint is a few hundred MB pulled from GitHub, and if that fetch fails, the node just fails - that's exactly why if_mirror exists. Second: on a CPU-only box these are big transformer models and it will sit there for a long time; don't expect real-time. Third, the "instrumental" is mix-minus-vocals, so vocal bleed shows up in it no matter how good the model is. And if the pack won't even import, you're probably on a stale ComfyUI - the node imports ComfyUI's cuda_malloc helper at module load, so an up-to-date core matters.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| music | AUDIO | — | |
| model_type | COMBO | bs_roformer | 5 options: htdemucs, mdx23c, segm_models, mel_band_roformer, bs_roformer |
| batch_size | INT | 4 | — |
| if_mirror | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| vocals_AUDIO | AUDIO | — |
| instrumental_AUDIO | AUDIO | — |