Audio Duck
Make the music dip when someone talks — real sidechain ducking, no audio tool required
- audio
- sidechain
- video
- sidechain_video
- audio
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.
thresholdis too high for how loud your voice track is, or the sidechain isn't actually connected. Also checkside_gain- a quiet sidechain won't cross the threshold. - It pumps audibly - whoosh-whoosh-whoosh. Release is too short. Crank
releaseto 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
sidechainand the music inaudio, not the other way around. - The ducked mix is too quiet overall. Raise
makeupor lowerratio. 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.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| threshold | FLOAT | 0.0500.001–1 | — |
| ratio | FLOAT | 8.01–20 | — |
| attack | FLOAT | 201–2000 | — |
| release | FLOAT | 40010–9000 | — |
| makeup | FLOAT | 1.01–8 | — |
| mix_back | BOOLEAN | true | — |
| side_gain | FLOAT | 1.000–4 | — |
| audioopt | COMFYTV_AUDIO | — | |
| sidechainopt | COMFYTV_AUDIO | — | |
| videoopt | COMFYTV_VIDEO | — | |
| sidechain_videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | COMFYTV_AUDIO | — |