Video Sound Effects · Add Sound Effects
The last stage your silent render has been missing
- video_url
- video
- task id
Silence is what gives AI video away
A generated clip with no sound is instantly readable as generated. Footsteps that don't land, a door that doesn't click, no room tone - your eye forgives a lot, your ear forgives almost nothing. The local answer has been MMAudio for a while: flow-matching video-to-audio, bolted onto the end of a Wan or Hunyuan render, and it's still the last stage of the big multi-model chains you see posted.
This node is the same job as a hosted call, and at about $0.0012 per second it's the cheapest per-second node in the pack. A full 30-second clip of generated effects costs about 3.6 cents. If you've ever given up on a render because adding sound was a whole separate install, that price is the argument.
How it works
You hand it a clip, it looks at the action and generates effects and ambience that follow what's happening on screen, then hands back the same video with the new track. The picture is kept - this is not a video model. It calls spicyapi/foley-v1/video-to-audio and returns a VIDEO.
Two boundaries from the author's own description, worth internalising: it runs 1 to 30 seconds of sound, and it is not for dialogue or music. Reach for it for footsteps, cloth, impacts, wind, machine hum and room tone. Dialogue is a TTS job; music is Suno's.
Inputs
video_url (VIDEO) - the clip to add sound to. The picture is preserved; the returned clip carries the generated audio.
prompt (STRING) - the sounds you want, as a short list. "footsteps on gravel, distant traffic, wind in trees" is the right shape. Leave it empty and a general "sounds that match the on-screen action" request is used, which is a perfectly good default for a first pass.
duration_seconds - 1 to 30, default 8. The returned clip is cut to this length and these seconds are what's billed. That makes it the one field with a direct cost line: 30 seconds is 3.6 cents, 8 seconds is under a cent.
negative_prompt (STRING) - sounds to keep out. "music, speech, narration" is the standard exclusions list, and you'll want it often, because the model's idea of ambience sometimes includes a swell.
ignore_visual_semantics (default off) - takes the sounds from your prompt alone rather than from the picture, while timing still follows the motion. The niche use: an obviously animated or stylised clip where the model's visual reading is wrong but the timing is right.
guidance_scale - 0 to 20, default 4.5. How closely the sound follows your description. Advanced; raise it when the prompt is specific and being ignored.
steps - 4 to 50, default 25. Refinement passes; more takes longer. Advanced. 25 is fine.
Outputs: video (VIDEO), task id (STRING).
Install
Manager → search SpicyAPI, or:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart and add your key under Settings > SpicyAPI (or set SPICY_API_KEY on a server), then restart once more so the node list comes from your account. No pip install, no model download, no GPU: the pack declares zero dependencies and all inference happens on SpicyAPI's servers. Python 3.10+ and a recent ComfyUI (V3 node API) is the whole bill of materials.
Reality checks
- It's a single mono-ish effects track, not a mix. Generated foley sits over your production; it won't duck under a voice or replace a real soundtrack. If your clip already has dialogue, expect to layer in an editor rather than run this as the only audio stage.
- 30-second ceiling on both the sound and the returned clip. Longer sources get cut. Foley per scene, then concatenate.
- Timing follows motion, so it inherits motion problems. Frames where the action is ambiguous get generic sound.
- Seed behaviour. There's no seed on this node, so a re-run can differ. Each attempt is charged.
- Upload limit. The input video has a 90 MiB ceiling; a long high-bitrate MP4 gets rejected before anything is charged.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | VIDEO | Clip to add sound to. The picture is kept; the returned clip carries the generated sound as its audio. | |
| prompt | STRING | The sounds you want, as a short list. If omitted, a general request for sounds that match the on-screen action is used. | |
| duration_seconds | INT | 81–30 | Seconds of sound to generate, from 1 to 30. The returned clip is cut to this length and these seconds are billed. |
| negative_prompt | STRING | Sounds to keep out, such as music or speech. | |
| ignore_visual_semantics | BOOLEAN | false | Choose the sounds from the prompt alone instead of from what the picture shows; timing still follows the motion. |
| guidance_scale | FLOAT | 4.50–20 | How closely the sound follows the description, from 0 to 20. |
| steps | INT | 254–50 | Refinement passes, from 4 to 50. More passes take longer. |
| seed | INT | 00–2147483647 | This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |