MSS Separate
297 separation models behind one dropdown, and the dropdown is the feature
- audio
- params
- stem_1 (Audio)
- stem_1 (String)
- stem_2 (Audio)
- stem_2 (String)
- stem_3 (Audio)
- stem_3 (String)
- stem_4 (Audio)
- stem_4 (String)
- stem_5 (Audio)
- stem_5 (String)
- stem_6 (Audio)
- stem_6 (String)
- stem_7 (Audio)
- stem_7 (String)
- stem_8 (Audio)
- stem_8 (String)
What this node is actually for
Almost everything audio-flavoured in ComfyUI creates sound: TTS, music generation, foley. MSS Separate does the opposite - it takes an audio file you already have and cracks it into stems. Vocals and instrumental. Drums, bass, other. A crowd removed from a live recording. A denoise model applied to a bad phone recording of an old tape.
That matters far more than it sounds, because most real workflows here re-use audio rather than inventing it. You've got a song and you want the instrumental under a lip-synced avatar. You've got a clip with music and dialogue on one track and you need them apart before you dub it. In this ecosystem's actual shape - audio as a bolted-on layer that video pipelines borrow from - stem separation is the plumbing people forget they need until the mix sounds wrong.
The inputs that matter
From the node's own schema:
audio- a ComfyUIAUDIOstream. Wire it fromLoad Audio, from a video loader, or from another pack's TTS output.model_name- the whole point. 297 unique models, each listed twice (once with an English category tag like[cleanup/noise_bleed_control], once with the Chinese equivalent), which is why the widget reports 594 choices. They're the same models. Pick either.source-modelscope,huggingfaceorhf-mirror. Default ismodelscope; the README says outright to pickhuggingfaceif you have access to it.download_missing(defaulttrue) - fetches the weights on first run. Turn it off if you're offline and would rather have a clean failure than a half-downloaded checkpoint.device-autois fine: CUDA first when there's an NVIDIA card, MLX by default on Apple Silicon.params(optional) - whereMSS Paramsplugs in. Skip it and the model's own YAML values win.device_ids- a string, default"0". Comma-separate for multi-GPU:0,1.debug- prints pymss timing and internals to the console. Turn it on once to see how long the actual separation took.
Outputs come in pairs: stem_1 (Audio) and stem_1 (String), up to eight stems. The Audio output is the stem itself; the String output is its name (Vocals, Instrumental, whatever the model's config declares). Wire the audio into Save Audio, and the string into the filename - that's how you get mysong_vocals.wav instead of audio_20260923_141233.wav.
The frontend resizes the node to the model you picked, so a two-stem model shows two pairs and hides the rest.
How the separation works
The node is a thin, honest wrapper. It hands your waveform to pymss's MSSeparator.from_model_name(...), which loads the checkpoint plus its YAML config, chunks the audio by the config's chunk_size/overlap_size, runs the model, and crossfades the chunks back together. The node does the boring conversion work - ComfyUI AUDIO is [batch, channels, samples] and pymss works in numpy - and it rejects a batch larger than one with a pointed error: "pymss separation currently expects a single audio item. Split batches before this node."
Two details worth knowing. If a model doesn't return a stem it was supposed to, the node fills that output with silence instead of failing - so a silent stem is a signal, not necessarily a crash. And each stem gets tagged with pymss_source_path and pymss_stem_name metadata, which is how Save Audio can name files sensibly later in the graph.
Speed isn't the issue: pymss benchmarks the mel-band roformers at 170–195× realtime, so a four-minute song is a handful of seconds.
Installing it
ComfyUI Manager → search Comfy-MSS → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/pymss-project/comfy-mss
Then install the inference package into the same Python environment ComfyUI runs in:
python -m pip install pymss
That's the entire dependency story: requirements.txt is one line (pymss>=2.1.6), and pymss pulls torch>=2.7.1, av, librosa, numpy, pyyaml, tqdm and pymss-core with it. Models land in ComfyUI/models/pymss, created automatically. If you keep models on another drive, set COMFY_MSS_MODEL_DIR or PYMSS_MODEL_DIR, or register it in extra_model_paths.yaml under a pymss key.
The pack is MIT, young and small - but not a drive-by: it's the ComfyUI front end of the pymss family, whose desktop GUI (pymss-studio) is the popular sibling repo, and all of it was pushed this month.
Where people get burned
- The first run looks like a hang. It's downloading a checkpoint, from ModelScope by default. Watch the console, or pre-pick a model you already have on disk (the menu greys out anything not downloaded).
- Batch size. One item only. If you need several files, run the graph per file.
- v1.0.x workflows. Node types were renamed in v1.1.0, so any workflow from the first release loads with missing-node errors. Rebuild with the current nodes.
- Choosing a model is the hard part, not running it. Start with a mel-band roformer vocals model for music, an
apollomodel for restoration, adenoise_*model for cleanup. Between them they cover most of what you'd reach for; the rest are for taste.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| model_name | COMBO | 594 options: [cleanup/audio_restoration] Apollo_LQ_MP3_restoration.ckpt, [音频清理/修复/音频/人声修复] Apollo_LQ_MP3_restoration.ckpt, [cleanup/audio_restoration] apollo_model.ckpt, [音频清理/修复/音频/人声修复] apollo_model.ckpt, [cleanup/audio_restoration] apollo_model_v2.ckpt, [音频清理/修复/音频/人声修复] apollo_model_v2.ckpt, +588 | |
| device | COMBO | auto | 5 options: auto, cpu, cuda, mps, mlx |
| download_missing | BOOLEAN | true | — |
| source | COMBO | modelscope | 3 options: modelscope, huggingface, hf-mirror |
| paramsopt | PYMSS_MSS_PARAMS | — | |
| device_idsopt | STRING | 0 | — |
| debugopt | BOOLEAN | false | — |
Outputs (16)
| Name | Type | Description |
|---|---|---|
| stem_1 (Audio) | AUDIO | — |
| stem_1 (String) | STRING | — |
| stem_2 (Audio) | AUDIO | — |
| stem_2 (String) | STRING | — |
| stem_3 (Audio) | AUDIO | — |
| stem_3 (String) | STRING | — |
| stem_4 (Audio) | AUDIO | — |
| stem_4 (String) | STRING | — |
| stem_5 (Audio) | AUDIO | — |
| stem_5 (String) | STRING | — |
| stem_6 (Audio) | AUDIO | — |
| stem_6 (String) | STRING | — |
| stem_7 (Audio) | AUDIO | — |
| stem_7 (String) | STRING | — |
| stem_8 (Audio) | AUDIO | — |
| stem_8 (String) | STRING | — |