SAM-Audio Video Separate
Separate the sound of what you see, straight from a VIDEO node
- pipeline
- video
- mask
- target
- residual
If the Visual Separator is "hear what you point at," this is the one-handed version: you hand it a native ComfyUI VIDEO value and a mask, and it reads the video's embedded audio track itself, then isolates the sound of whatever you masked. No separate Load Audio, no manual frame-to-audio sync - the video is the source of both pictures and sound. It's the convenience wrapper at the end of the pack, and for footage that already has audio, it's the node to use.
How it works
The video input expects a real ComfyUI VIDEO - the kind produced by video loader or generation nodes, containing both frames and an embedded audio track. The node decodes the frames, grabs the audio, and runs the same visual separation as the Visual Separator: your white mask picks the object, the model figures out which sound belongs to it, and out come target and residual.
There's a nice implementation detail worth knowing: the pack uses ComfyUI's already-decoded media tensors rather than pulling in TorchCodec or a heavy video-decoding dependency. That's a deliberate choice - audio node packs at the edge of the ecosystem are where dependency conflicts live, and this one refuses to add another wheel to the pile. It's one less thing that can break your ComfyUI install.
The inputs that matter:
video- frames plus an embedded audio track. This is non-negotiable; the node errors if the VIDEO has no audio.mask- white selects the visible object whose sound you want. One mask covers all frames, or give it one per frame if the object moves.description- optional text to nudge the model. Leave it empty and mask-only works fine; add "guitar" or "crowd" when the model isn't locking on.- The shared quartet -
seed,inference_steps,chunk_duration,chunk_overlap- behaves exactly as in the other separators.
The one thing that bites people
The error you'll actually hit: VIDEO input has no audio track. A lot of ComfyUI video nodes produce frames with no audio by default, so this happens all the time. The fix is in the README: attach audio with ComfyUI's Create Video node (or an equivalent) so the VIDEO value carries a track, then feed that in.
And that's also the honest decision point between this node and the Visual Separator. If your pipeline already has the audio as a separate value, or your video genuinely has no track, use SAM-Audio Visual Separate with images + audio wired independently - it skips the embedded-audio requirement entirely. Use Video Separate when the footage comes with sound and you want the minimal setup.
Workflow and notes
Video Loader ───────────► SAM-Audio Video Separate
SAM-Audio Model Loader ─► SAM-Audio Video Separate
└─► PreviewAudio / SaveAudio (target)
└─► PreviewAudio / SaveAudio (residual)
Use a -tv (text-visual) checkpoint from the Model Loader - same rule as the Visual Separator, since this is the same visual-prompt machinery. Everything outputs mono at 48 kHz.
Install: ComfyUI Manager → search "ComfyUI-SAM-Audio", or git clone https://github.com/ethanfel/ComfyUI-SAM-Audio.git into custom_nodes and run python ComfyUI-SAM-Audio/install.py, then restart. First run downloads the checkpoint and the visual encoder assets, so don't judge it by queue time alone.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | SAM_AUDIO_PIPELINE | — | |
| video | VIDEO | A native ComfyUI VIDEO containing frames and an embedded audio track. | |
| mask | MASK | White selects the visible object whose sound should be isolated. Use one mask for all frames or one per frame. | |
| description | STRING | Optional text guidance to combine with the visual prompt. | |
| seed | INT | 00–18446744073709550000 | Controls SAM-Audio's initial noise for reproducible separation. |
| inference_steps | INT | 322–128 | Number of midpoint function evaluations. Higher values are slower and may improve quality. |
| chunk_duration | FLOAT | 10.00–3600 | Seconds processed per pass. Use 0 to process the entire clip at once. |
| chunk_overlap | FLOAT | 1.00–60 | Seconds shared by adjacent chunks for a smooth crossfade. |
| reranking_candidatesopt | INT | 11–8 | Generate multiple candidates and select one with Meta's Judge. Values above 1 lazily download and load the optional Judge model. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| target | AUDIO | — |
| residual | AUDIO | — |