Nodes/PopNow/Video Sound Effects · Video to Audio
ComfyUI Node

Video Sound Effects · Video to Audio

Video Sound Effects gives your silent clip foley — but it returns audio, not video

By popnow-ai·Created 24 days ago·Updated about 20 hours ago· 0
Video Sound Effects · Video to Audio
  • video_url
  • audio
  • task id
◄prompt►
◄duration_seconds8►
◄negative_prompt►
◄ignore_visual_semanticsfalse►
◄guidance_scale4.5►
◄steps25►

You generated a 5-second clip of a door creaking open in a stone corridor, and it's silent. Every video model in this pack will happily hand you the picture and leave the sound to you. Foley is the least glamorous step in the whole pipeline and the one that makes a clip feel finished.

Video Sound Effects · Video to Audio is the pack's answer, and it's priced like an afterthought: about 0.18 credits per second, so a 10-second soundscape costs under two cents.

What it does

It watches your clip and generates the sounds that match what's on screen - footsteps, cloth, glass, rain, impacts - then hands back the audio. PopNow's own model (popnow/foley-v1/video-to-audio), not a resold third-party API. This is the video-to-audio job the open ecosystem fields MMAudio for, and the KB's audio essay is blunt that this layer is young and mostly lives in bespoke node packs with their own dependency stacks. Not needing an MMAudio stack is a real part of the appeal.

Read the output list before you wire anything

The single most common confusion: this node returns audio, not a video with audio attached. The tooltip on video_url says the returned clip carries the generated sound as its audio, which is true of what the service produces, but the node's actual outputs are audio (AUDIO) and task id (STRING). The picture you sent is not handed back.

So the graph is: your video → this node → AUDIO → a muxing step alongside the frames. Core's Create Video takes the frames plus an audio input and gives you a VIDEO to hand to Save Video (or just listen to the audio with Save Audio while you're iterating). If you were expecting a drop-in "add sound" node, this is the half hour you budget for wiring.

The inputs that matter

video_url is the clip, and its duration_seconds cap is 1 to 30 - with duration_seconds defaulting to 8. That default is the field you actually set. The returned audio is cut to that length and those seconds are what you're billed for, so a 4-second clip and the default 8 wastes half your money. Match the number to your clip.

prompt is a short list of the sounds you want. If you leave it empty the node sends a general "sounds that match the action" request, which is fine for ambience and weak for anything specific. "Heavy wooden door dragging on stone, distant water drip, muffled wind" is the register to write in - sounds, not a story.

negative_prompt is where this node earns its keep. The single best thing to put in it is music, speech. Foley models would love to score your clip or have someone narrate it; if you plan to add your own music bed later, keep the generated layer to diegetic sound and it will sit under your track instead of fighting it.

ignore_visual_semantics flips the source of truth: on, the sounds come from your prompt alone and only the timing follows the picture. That's the switch for "the picture is ambiguous but I know exactly what I want."

guidance_scale (4.5) and steps (25) are the model's own dials. Higher steps take longer server-side; you are not paying per step, so there's little reason to lower them.

Output audio comes back as an AUDIO batch - Save Audio writes one file per result - plus the task id.

Install

Manager → search PopNow → Install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/popnow-ai/popnow-comfyui

Then a key from popnow.ai/api/console/keys in Settings > PopNow, or:

POPNOW_API_KEY=sk-popnow-... python main.py

Nothing else to install - no dependencies, no model weights. Videos are uploaded as MP4, and an MP4 input is remuxed rather than re-encoded, but there's a 90 MiB ceiling on the upload; trim or transcode anything big before it hits the socket.

Where people get burned

A mismatch between sound and cut. The model generates audio against the motion it can see, then the node trims it to duration_seconds. If you set 8 on a 3-second clip you get a clean soundscape with 5 seconds of tail you'll throw away. It's cheap, but it's also how you end up with a "why does my audio end on a hard chop" question.

Audio-only outputs and the wrong saver. Wire it to Save Video and you'll get nothing useful; AUDIO needs Save Audio or a video mux.

No key is a plain-text error, not a silent failure - No PopNow API key is set means exactly that, and on a server the fix is the environment variable, not a widget. Keys deliberately never live in node fields, because widget values get baked into every workflow and every PNG you share.

A cancelled run keeps going on PopNow and is charged if it succeeds. Interrupting the wait is not a refund.

CategoryPopNow/Audio/Tools

Inputs (7)

NameTypeDefaultDescription
video_urlVIDEOClip to add sound to. The picture is kept; the returned clip carries the generated sound as its audio.
promptSTRINGThe sounds you want, as a short list. If omitted, a general request for sounds that match the on-screen action is used.
duration_secondsINT81–30Seconds of sound to generate, from 1 to 30. The returned clip is cut to this length and these seconds are billed.
negative_promptSTRINGSounds to keep out, such as music or speech.
ignore_visual_semanticsBOOLEANfalseChoose the sounds from the prompt alone instead of from what the picture shows; timing still follows the motion.
guidance_scaleFLOAT4.50–20How closely the sound follows the description, from 0 to 20.
stepsINT254–50Refinement passes, from 4 to 50. More passes take longer.

Outputs (2)

NameTypeDescription
audioAUDIOSeveral results come back as a batch; Save Audio writes one file each.
task idSTRINGThe PopNow task id, for the API console logs or support.