MMAudio FeatureUtilsLoader
Where your video becomes audio conditioning (and the 16k trap hides)
- bigvgan_vocoder_model
- mmaudio_featureutils
This is the node that makes MMAudio multimodal. The ModelLoader brings the audio generator; this one builds the thing that reads your video and turns it into conditioning the generator can follow. It's the most intimidating node in the pack - three model dropdowns, a mode, a precision, a vocoder input - and the one where most setup mistakes actually happen.
MMAudio conditions on video two different ways, and this node loads a separate encoder for each. Synchformer watches the motion at 25fps and captures how things move - the fine-grained lip flaps and collisions. CLIP (an apple DFN5B ViT-H-384) samples the scene at 8fps for high-level semantics - what's in the frame. Then the VAE plus a vocoder turn audio latents back into waveform. All of those live behind the feature_utils output this node produces, and the Sampler consumes it alongside the model.
The dropdowns that matter
Three required enums, all populated from ComfyUI/models/mmaudio, all with the same folder - which is exactly how people pick the wrong file. The honest rule:
- vae_model → the MMAudio VAE file (
mmaudio_vae_44k_fp16.safetensors) - synchformer_model →
mmaudio_synchformer_fp16.safetensors - clip_model →
apple_DFN5B-CLIP-ViT-H-14-384_fp16.safetensors
Pick each from the right family and you're fine. Pick a VAE into the clip slot and you get a KeyError: 'positional_embedding' or a VAE state_dict mismatch - the pack's issue tracker is littered with those, and every one of them is a wrong-file-in-right-slot problem. Grab all four (plus the large 44k model from the ModelLoader) from Kijai/MMAudio_safetensors - the fp16 set is the sensible default, fp32 exists if you have VRAM to burn.
The mode trap
The mode dropdown defaults to 44k, and it must match the model you loaded in the ModelLoader. Here's the trap: the 44k path is free - when it runs, the node auto-downloads NVIDIA's BigVGAN v2 vocoder into ComfyUI/models/mmaudio/nvidia/bigvgan_v2_44khz_128band_512x. Switch to 16k and it flat-out asserts: bigvgan_vocoder_model must be provided for 16k mode. That's the error you'll see in issue threads. The 16k path expects you to hand it a vocoder through the optional bigvgan_vocoder_model input - which comes from the pack's MMAudioVoCoderLoader node. In short: stay on 44k unless you have a specific reason to run the old small 16k model, and if you do, wire a vocoder in or it won't start.
precision mirrors the ModelLoader's - keep fp16 unless you know why you're changing it.
The output and what it wires into
One output, mmaudio_featureutils (type MMAUDIO_FEATUREUTILS), into the Sampler's feature_utils socket. Everything this node loads is the conditioning side; the Sampler decides the length, steps, and prompt.
One real-world gotcha
If this node dies on module 'torch.nn' has no attribute 'Buffer', that's your torch version - nn.Buffer only exists in PyTorch 2.6+, and this pack's VAE uses it. Update torch and the node loads. If you see logit_scale shape errors, that's an open_clip version mismatch fighting the DFN5B clip file; a reinstall of open_clip_torch per the requirements usually settles it. None of this is your workflow - it's environment drift, and it's fixable in minutes.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| vae_model | COMBO | These models are loaded from 'ComfyUI/models/mmaudio' | |
| synchformer_model | COMBO | These models are loaded from 'ComfyUI/models/mmaudio' | |
| clip_model | COMBO | These models are loaded from 'ComfyUI/models/mmaudio' | |
| bigvgan_vocoder_modelopt | VOCODER_MODEL | These models are loaded from 'ComfyUI/models/mmaudio' | |
| modeopt | COMBO | 44k | 2 options: 16k, 44k |
| precisionopt | COMBO | fp16 | 3 options: fp16, fp32, bf16 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| mmaudio_featureutils | MMAUDIO_FEATUREUTILS | — |