Nodes/Comfy-MSS/MSS Separate
ComfyUI Node

MSS Separate

297 separation models behind one dropdown, and the dropdown is the feature

By pymss-project·Created 4 months ago·Updated a day ago· 22
MSS Separate
  • 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)
model_name
deviceauto
download_missingtrue
sourcemodelscope
device_ids0
debugfalse

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 ComfyUI AUDIO stream. Wire it from Load 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, huggingface or hf-mirror. Default is modelscope; the README says outright to pick huggingface if you have access to it.
  • download_missing (default true) - 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 - auto is fine: CUDA first when there's an NVIDIA card, MLX by default on Apple Silicon.
  • params (optional) - where MSS Params plugs 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 apollo model for restoration, a denoise_* model for cleanup. Between them they cover most of what you'd reach for; the rest are for taste.
Categoryaudio/pymss

Inputs (8)

NameTypeDefaultDescription
audioAUDIO
model_nameCOMBO594 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
deviceCOMBOauto5 options: auto, cpu, cuda, mps, mlx
download_missingBOOLEANtrue
sourceCOMBOmodelscope3 options: modelscope, huggingface, hf-mirror
paramsoptPYMSS_MSS_PARAMS
device_idsoptSTRING0
debugoptBOOLEANfalse

Outputs (16)

NameTypeDescription
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