Hunyuan Foley: Generate Audio
Put sound on your video without re-generating it
- video
- audio
- sample_rate
- audio_wav_path
- merged_video_path
Most video models ship silent. You generate a clip, love the motion, and then stare at a .mp4 that needs a soundbed from somewhere else. Hunyuan Foley is the node that fixes exactly that: it takes a video you already have and writes synchronized sound effects onto it - footsteps, whooshes, rain, a door slamming, whatever the frames suggest. It won't touch a single pixel of your footage; it just makes it stop being silent.
It's a ComfyUI wrapper around Tencent's HunyuanVideo-Foley model (released August 2025), and it sits in a genuinely useful niche. The wider HunyuanVideo family has gone from first mover to barely-run-locally - the KB has it marked declining - but the foley model is the piece of that lineup that still earns its keep. If you only ever generate video, you've seen the pitch from LTX-2 (native audio+video in one pass) and Wan's S2V experiments. This is the other route: a dedicated video-to-audio model you bolt onto any silent render, Wan or LTX or meme-tier, after the fact.
Fair warning up front, from the launch-week consensus: it's good at sounds, not speech. The top comment thread on the release thread settled on "better than MMAudio, but not that great" - thuds, textures, and atmosphere read well; attempts to make a character talk come out as mumbling nonsense. Set your expectations as "foley pass," not "dubbing."
How it works
The node loads four models plus a helper: the HunyuanVideo-Foley diffusion transformer and its 128-dim audio VAE, a SigLIP2 vision encoder, a CLAP text encoder, and a Synchformer for audio-visual sync features. Your video gets decoded to frames, the frames go through SigLIP2 and Synchformer, and your prompt goes through CLAP. Those condition a flow-matching diffusion pass that denoises audio latents, and the VAE decodes to a 48kHz WAV that ffmpeg muxes back onto your original video. It's a real model, not an API call - everything runs on your GPU.
The inputs that actually matter
There are a lot of dropdowns, but only a few you'll touch:
- The four model pickers (
diffusion_model,vae_model,clip_vision_model,clap_model). The node scans yourmodels/diffusion_models,models/vae,models/clip_vision, andmodels/clapfolders and lists what it finds. If one shows<no files in models/...>, that's the model you haven't downloaded yet. prompt- plain text, multiline. "Heavy rain on a tin roof with distant thunder" beats "rain." Description quality is the whole game here.guidance_scale(default 4.5) andnum_inference_steps(default 50). Lower the guidance if you're getting that "mutated exorcist" energy; 50 steps is already slow enough that you won't want to crank it.video/video_path/video_fps- feed it frames from a Video Loader or point it at a file path. Feed frames and setvideo_fpsto match your real footage: the node derives audio length asnum_frames / video_fps, so a wrong fps means the soundbed is the wrong length. Default is 16.save_audio/save_video- write the WAV, and/or the merged MP4, intooutput_dir(defaultoutputs/hunyuan_foley, auto-numbered).
Outputs: audio (an AUDIO tensor you can pass to other nodes), sample_rate (48000), plus the saved audio_wav_path and merged_video_path strings. If you only want the WAV, wire it to a Save Audio node and turn saving off.
Installing it
Clone it in, install, then download five separate model pieces:
cd ComfyUI/custom_nodes
git clone https://github.com/railep/ComfyUI-HunyuanVideo-Foley
cd ComfyUI-HunyuanVideo-Foley
pip install -r requirements.txt
Then, from the README: hunyuanvideo_foley.pth → models/diffusion_models/, foley_vae_128d_48k.pth → models/vae/, SigLIP2 (google/siglip-base-patch16-512) → models/clip_vision/siglip2-base-patch16-512/, CLAP (laion/clap-htsat-unfused) → models/clap/clap-htsat-unfused/, and synchformer_state_dict.pth → ComfyUI/syncforner/.
Yes, syncforner. That typo is baked into the code - the node looks up ComfyUI/syncforner/synchformer_state_dict.pth, so keep the misspelled folder.
Where people get burned
- The silent-failure trap. The whole
run()is wrapped in a try/except, and on any error it returns one second of zeros instead of crashing. A bad model path, a missing ffmpeg, a corrupt weight - you get silence and empty path strings and the only clue is a log line in the ComfyUI console. If it "works" but outputs nothing, read the terminal. pip installis the fiddly bit.requirements.txtpinsnumpy==1.26.4and pullstransformersfrom a SigLIP-2 branch andaudiotoolsstraight from GitHub. Those git installs occasionally fail to resolve; if the install dies, that's the first suspect, and watch for the numpy pin clashing with whatever else you have installed.- ffmpeg is a hard requirement for the merged MP4. No ffmpeg, no
merged_video_path- the WAV still saves. - VRAM is real. The README says 8GB+, and launch-week people were asking whether a 3080 Ti would cope. It runs, but expect swapping and patience on mid-range cards;
devicedefaults toautoand will happily drop you onto CPU if no CUDA shows up - which is a "go make coffee" situation. - The license stings if you're in the EU, UK, or South Korea. Tencent's Hunyuan community license grants broad commercial rights but excludes those territories outright, and it reaches outputs, not just weights. Worth knowing before you build a product on it.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| config_name | COMBO | config.yaml | 1 options: config.yaml |
| diffusion_model | COMBO | 1 options: <no files in models/diffusion_models> | |
| vae_model | COMBO | 1 options: <no files in models/vae> | |
| clip_vision_model | COMBO | 1 options: <no files in models/clip_vision> | |
| clap_model | COMBO | 1 options: <no files in models/clap> | |
| guidance_scale | FLOAT | 4.50–20 | — |
| num_inference_steps | INT | 501–200 | — |
| save_video | BOOLEAN | true | — |
| save_audio | BOOLEAN | true | — |
| video_pathopt | STRING | — | |
| videoopt | IMAGE | — | |
| video_fpsopt | FLOAT | 16.001–120 | — |
| deviceopt | COMBO | auto | 4 options: auto, cuda, cpu, mps |
| gpu_idopt | INT | 00–15 | — |
| output_diropt | STRING | outputs/hunyuan_foley | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| sample_rate | INT | — |
| audio_wav_path | STRING | — |
| merged_video_path | STRING | — |