Nodes/ComfyTV/Audio Duck
ComfyUI Node

Audio Duck

Make the music dip when someone talks — real sidechain ducking, no audio tool required

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Audio Duck
  • audio
  • sidechain
  • video
  • sidechain_video
  • audio
force_run_token0
project_id
parent_output_id0
threshold0.050
ratio8.0
attack20
release400
makeup1.0
mix_backtrue
side_gain1.00

Every talking-over-music video has the same problem: the music and the voice fight for the same space. The pro answer is sidechain ducking - the music automatically pulls down when the voice is present and swells back when it isn't. That used to mean opening a DAW. Audio Duck does it inside ComfyUI: feed it the music on audio and the voice on sidechain, and the music ducks whenever the voice gets loud.

This is one of the more satisfying stages in the audio suite because it solves a real, constant problem with one node. You'll use it for podcast intros (music bed dips under the host), gameplay commentary, YouTube B-roll with a voice track, or any mix where two things compete. It's also the node that finally makes the video-vs-audio distinction concrete: both main and sidechain can come from either audio or video wires, so you can duck a music track against the dialogue in a video clip directly.

How it works

Under the hood it's a sidechain compressor: the sidechain signal (the voice) drives gain reduction on the main signal (the music). The controls are the compressor's, in order of how often you'll touch them:

  • threshold (0.001–1, default 0.05) - how loud the voice must be to trigger ducking.
  • ratio (1–20, default 8) - how much the music is pulled down. 8:1 is a solid "duck it" default.
  • attack / release (ms, defaults 20 / 400) - how fast the duck kicks in and how smoothly it recovers. Slow release is what makes ducking sound natural instead of pumpy.
  • makeup (1–8, default 1) - boost the ducked signal back up after reduction.
  • mix_back (default on) - whether to blend the ducked and original signals (parallel compression style).
  • side_gain (0–4, default 1) - level of the sidechain input feeding the detector.

The inputs are audio + sidechain (both COMFYTV_AUDIO) and their video equivalents video + sidechain_video, so either side can come from a clip's soundtrack. Output is the ducked audio. Internal inputs (force_run_token, project_id, parent_output_id) are frontend plumbing.

Installing ComfyTV

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Full backend restart, then ComfyTV → AudioFX; ComfyUI Manager finds "ComfyTV". Zero extra Python deps - ducking runs through FFmpeg's sidechain compressors via the PyAV bindings ComfyUI already ships. No models.

The pack-wide install trap: on macOS / ComfyUI Desktop / multi-install machines, cd ComfyUI/custom_nodes can clone into the wrong instance - clone succeeds, stages never appear. Find the running instance's path in the startup log, clone into that instance's custom_nodes by absolute path (quote paths with spaces/parentheses), confirm ComfyTV/__init__.py is top-level, restart the backend fully.

Common issues

  • The duck never triggers. threshold is too high for how loud your voice track is, or the sidechain isn't actually connected. Also check side_gain - a quiet sidechain won't cross the threshold.
  • It pumps audibly - whoosh-whoosh-whoosh. Release is too short. Crank release to 500ms+ so the music recovers smoothly instead of snapping back.
  • Music ducks even when nobody's talking. The sidechain is picking up the music itself (feedback). Make sure the voice goes in sidechain and the music in audio, not the other way around.
  • The ducked mix is too quiet overall. Raise makeup or lower ratio. A ratio of 4 with more makeup often sounds more natural than 8:1 slammed down.

It's the "it just works" audio node - the one that makes a multi-track ComfyTV project sound mixed instead of stacked.

CategoryComfyTV/AudioFX

Inputs (14)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
thresholdFLOAT0.0500.001–1
ratioFLOAT8.01–20
attackFLOAT201–2000
releaseFLOAT40010–9000
makeupFLOAT1.01–8
mix_backBOOLEANtrue
side_gainFLOAT1.000–4
audiooptCOMFYTV_AUDIO
sidechainoptCOMFYTV_AUDIO
videooptCOMFYTV_VIDEO
sidechain_videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
audioCOMFYTV_AUDIO