Nodes/SDXL Auto Prompter/APNext H3 Voice Over Music (conditioning mix)
ComfyUI Node

APNext H3 Voice Over Music (conditioning mix)

The mix a sound engineer would hand H3

By dagthomas·Created 3 years ago·Updated about 23 hours ago· 290
APNext H3 Voice Over Music (conditioning mix)
  • voice
  • music_1
  • music_2
  • music_3
  • audio
  • info
music_db-9.0
duck_db-6.0
voice_db0.0
normalizetrue

H3 lip-syncs to whatever audio sits in its latent, and it moves the picture to the rhythm it hears there. That creates a genuine dilemma for music videos, and it's one the extreme options all lose: the full song buries the consonants (mouths drift), a bare vocal stem has no beat in it (nothing to cut on), and a synthetic thump track isn't the song. H3VoiceOverMusic is the middle path - literally what a mix engineer would do. Voice on top at full level, the real music underneath at a set level, and the music ducked a few dB further only while the voice is actually sounding. Every word stays readable, and the drums come back up between the phrases.

The inputs that matter

  • voice - the vocal stem (AudioSeparation's Vocals). Stays on top at full level. This is what the mouth follows, so don't feed it anything else.
  • music_db (default −9) - how far under the voice the music sits. −9 keeps every drum hit audible while the words stay on top; −3 is nearly the full mix; −18 is a whisper of beat.
  • duck_db (default −6) - the sidechain: while the voice is actually sounding, the music dips this much further (5 ms in, 150 ms out) so consonants stay readable, and comes back up between phrases where the beat is what matters. 0 = no ducking.
  • voice_db (0) - trim on the voice itself. Leave it unless the stem is unusually quiet or hot.
  • normalize (on) - peak-normalise the mix to −0.2 dBFS so nothing clips. Leave it on.

The optional inputs are the music itself: music_1, music_2, music_3 are summed. Wire in the whole song from Load Audio, or - the trickier, better setup - the Drums + Bass + Other stems from H3StemSplit, which gives you the instrumental without a second copy of the voice.

Outputs and where they go

audio is the conditioning mix - wire it into H3 Chain Render's conditioning_audio (or the masked-audio node's master_audio). And the important part, straight from the tooltip: the original song still goes to the output. This mix is only what the model listens to. If you routed the mix to the video's audio, you'd hear the ducking; instead, the model hears the ducked mix to sync the mouth and the beat, and your deliverable hears the untouched song. info tells you what was mixed.

Why this beats the extremes

The trade it makes is real and worth understanding: H3 has one audio latent and it's a mix, so the voice can't go to the lips and the music to the motion separately. What this node gives you is the closest thing - a mix where the voice dominates enough for lip-sync and the beat survives enough for the camera to move on it. It sits between AudioSeparation and the render in every masked-audio and Chain Render music video in the pack's examples for exactly this reason. If you're getting mouths that drift, the fix is usually here or one node over in Beat Emphasis.

Installing

Part of the dagthomas pack - ComfyUI Manager, search "comfyui_dagthomas", install, restart:

cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt

Pure torch, no extra dependencies, no model downloads - it's math on the waveforms it's given. If you're already splitting stems for the beat detectors, this node is the cheap, high-value add that makes the lip-sync and the beat-sync cooperate instead of competing.

Categorycomfyui_dagthomas/H3

Inputs (8)

NameTypeDefaultDescription
voiceAUDIOThe vocal stem (AudioSeparation's Vocals). Stays on top at full level - this is what the mouth follows.
music_dbFLOAT-9.0-40–6How far under the voice the music sits, in dB. -9 keeps every drum hit audible while the words stay on top; -3 is nearly the full mix, -18 is a whisper of beat.
duck_dbFLOAT-6.0-24–0Sidechain: while the voice is actually sounding, the music dips this much further (5 ms in, 150 ms out) so consonants stay readable, and comes back up between phrases where the beat is what matters. 0 = no ducking.
voice_dbFLOAT0.0-12–12Trim on the voice itself. Leave 0 unless the stem is unusually quiet or hot.
normalizeBOOLEANtruePeak-normalise the mix to -0.2 dBFS so nothing clips.
music_1optAUDIOThe music under the voice: the whole song (Load Audio), or a stem. Several inputs are summed - e.g. AudioSeparation's Drums + Bass + Other for the instrumental without a second copy of the voice.
music_2optAUDIOAnother music stem to sum in (Bass).
music_3optAUDIOAnother music stem to sum in (Other).

Outputs (2)

NameTypeDescription
audioAUDIOThe conditioning mix - wire into H3 Chain Render's `conditioning_audio` (or the masked-audio node's `master_audio`). The original song still goes to the output; this is only what H3 listens to.
infoSTRINGWhat was mixed.