MMAudioSuite Sampler
The node that turns your silent clip into sound that fits it
- mmaudio_model
- feature_utils
- images
- audio
This is the payoff node. The ModelLoader and FeatureUtilsLoader are just getting the pieces on the table - MMAudioSuiteSampler is where a silent clip becomes a clip with sound: footsteps that land on the pavement, wind that matches the motion, ambience that belongs in the scene. It's the final audio stage in the classic local pipeline: generate your video in Wan or Hunyuan, feed the frames here, get a soundtrack back. The wider KB context is honest about the job - MMAudio is a foley workhorse, best at sound that fits the video, not composing songs. Set expectations accordingly.
How it works
MMAudio is a flow-matching model, so sampling here is analogous to a diffusion sampler for images: a FlowMatching scheduler with Euler integration, default 25 steps, CFG at 4.5, driven by a seed. The clever part is how it makes your video fit the model's fixed expectations.
The model expects exact token counts - CLIP tokens sampled at 8 fps (64 tokens for 8 seconds) and sync tokens at 25 fps (192 tokens, fed with an extra 8 raw frames). The Sampler resamples your video to exactly those lengths and calls update_seq_lengths with the same numbers, so the model doesn't blow up on a mismatch. That length bookkeeping is precisely the class of bug the original wrapper was failing on; this fork fixes it.
It's also VRAM-friendly in a way that matters if you just rendered a big video. The model and feature utils JIT-move to the GPU for generation, then offload back to CPU memory when done - force_offload defaults to true, and you basically always want it on.
The inputs that matter
- mmaudio_model and feature_utils - wire in the outputs of the ModelLoader and FeatureUtilsLoader. Non-negotiable.
- images (optional) - the video frames. This is the video side of video-to-audio. Leave it disconnected and you're doing text-to-audio with no visual conditioning.
- duration - seconds of audio, default 8. Set this to match your video's length. This is the number one cause of short output.
- steps (25) and cfg (4.5) - the usual diffusion dials. Higher steps cost time; CFG pushes the conditioning harder.
- seed - standard. Set a fixed value to reproduce a take.
- prompt / negative_prompt - free text. The example workflow prompts things like "park, slide, spring weather, children's laughter". A good negative prompt helps keep unwanted noise out.
- mask_away_clip - if
true, the CLIP conditioning from the video is masked out (audio conditioned on sync/timing but not on scene content). Rarely needed; leave itfalse. - force_offload - keep
true.
The single output is audio (type AUDIO, at 44,100 Hz), which wires into PreviewAudio, VHS_VideoCombine, or the pack's Pitch node. It comes back as a mono waveform, so plan your mix accordingly.
Install and the classic "2 seconds" problem
Shared pack install: ComfyUI Manager (search "ComfyUI-MMAudio-Suite"), or git clone https://github.com/Takenoko3333/ComfyUI-MMAudio-Suite into custom_nodes, restart, and on portable Windows run the requirements.txt install (python_embeded\python.exe -m pip install -r ...) if deps are missing. Models from Kijai's MMAudio_safetensors repo into ComfyUI/models/mmaudio; the 44k path also auto-downloads Nvidia's BigVGAN on first run.
The single most-searched MMAudio problem in the wild is "MMAudio generates only 2 seconds." It's almost always the duration input not matching the clip - the sampler generates duration seconds, full stop, so an 8-second default on a 20-second video gives you 8 seconds (or less) of sound. Match the duration, re-run, and the complaint goes away. If results come back as noise or "unusable," bump the steps, check the seed is fixed if you want reproducibility, and confirm you're on the 44k model - the 16k path sounds audibly worse.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| mmaudio_model | MMAUDIO_MODEL | — | |
| feature_utils | MMAUDIO_FEATUREUTILS | — | |
| duration | FLOAT | 8.00 | Duration of the audio in seconds |
| steps | INT | 25 | Number of steps to interpolate |
| cfg | FLOAT | 4.5 | Strength of the conditioning |
| seed | INT | 00–18446744073709550000 | — |
| prompt | STRING | — | |
| negative_prompt | STRING | — | |
| mask_away_clip | BOOLEAN | false | If true, the clip video will be masked away |
| force_offload | BOOLEAN | true | If true, the model will be offloaded to the offload device |
| imagesopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |