DiffusionGemma Advertisement Motion Guide / Final Mix
The Split That Keeps Your Voice-Over Out of H3's Motion Conditioning
- music_audio
- voice_over
- motion_guide_audio
- final_mix_audio
- motion_guide_sha256
- final_mix_sha256
- mix_report_json
- status
- ready
DiffusionGemmaAdvertisementAudioMixer does one of the smartest split-brain tricks in the advertisement stack, and it's easy to miss why it matters. It takes your locked music and produces two separate audio objects: a motion_guide_audio that conditions H3's motion, and a final_mix_audio that becomes the soundtrack of the delivered master. They start from the same music, but only the final mix can carry a voice-over - which is the whole point. A voice-over that leaked into the motion conditioning would read as a lip-sync instruction and make H3 animate the performer talking, so this pack makes that impossible by construction rather than by caution.
Here's the mechanics. Required inputs: music_audio, the soundtrack contract JSON, target_duration_seconds (30 by default, and the mixer trims or pads to that exact duration), and the mixing controls - music_gain_db, voice_over_gain_db, ducking_db (default −9 dB), duck_attack_ms (80), duck_release_ms (250), peak_ceiling_dbfs (−1), and clipping_policy, which either attenuates the mix to the ceiling or fails on clipping. The optional voice_over AUDIO input is lazy: the mixer only evaluates it if the soundtrack contract actually calls for VO, and the contract and the connection must agree - connect VO when the contract says none and it raises rather than quietly ignoring it. voice_over_start_seconds lets you place the VO inside the master.
On the output side you get the two audios, each with its own sha256 (motion_guide_sha256, final_mix_sha256) so downstream can verify the conditioned audio and the delivered audio are exactly what you approved, plus mix_report_json and the status/ready pair. The motion guide going to H3 is deliberately music-only; no ducking, no VO, no gain automation that would muddy the conditioning. It's the "pristine" version that keeps timing and beat structure intact for motion.
The reason this matters in an ad workflow specifically: ads are the one genre where non-diegetic voice-over is normal, and the reusable node contract is built for it - separate VO with ducking, hashes, and clipping diagnostics. But the shipped v1 workflow keeps VO locked to None until an upload/loader path is connected. So if you open the example and wonder where the VO controls are: they're present in this node, just dormant by design, because the v1 graph has no actual voice path yet.
Two real gotchas. First, exact duration is enforced: the mixer pads only sub-millisecond rounding deficits (at most one millisecond) and records them; materially short audio fails closed rather than delivering a truncated 29-second master labeled as 30. Second, watch peak_ceiling_dbfs and clipping_policy - "Fail on clipping" will stop the run on any overshoot, which is what you want for delivery but annoying when you're still tuning gains. If you're just testing, leave clipping_policy on attenuation.
Install is pack-wide: ComfyUI Manager search "DiffusionGemma Prompt Builder", or git clone https://github.com/exportAnything/ComfyUI-DiffusionGemmaPromptBuilder into custom_nodes and restart. The ad graph needs ComfyUI 0.33.1+ and the Music 3/H3 models; the mixer itself is local audio math. This node is where you do the audio finishing that your QA gate will actually judge - treat it accordingly.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| music_audio | AUDIO | — | |
| soundtrack_contract_json | STRING | — | |
| target_duration_seconds | FLOAT | 30.000.1–60 | — |
| music_gain_db | FLOAT | 0.0-30–12 | — |
| voice_over_gain_db | FLOAT | 0.0-30–12 | — |
| ducking_db | FLOAT | -9.0-30–0 | — |
| duck_attack_ms | FLOAT | 800–1000 | — |
| duck_release_ms | FLOAT | 2500–3000 | — |
| peak_ceiling_dbfs | FLOAT | -1.0-12–0 | — |
| clipping_policy | COMBO | Attenuate mix to ceiling | 2 options: Attenuate mix to ceiling, Fail on clipping |
| voice_overopt | AUDIO | — | |
| voice_over_start_secondsopt | FLOAT | 0.000–60 | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| motion_guide_audio | AUDIO | — |
| final_mix_audio | AUDIO | — |
| motion_guide_sha256 | STRING | — |
| final_mix_sha256 | STRING | — |
| mix_report_json | STRING | — |
| status | STRING | — |
| ready | BOOLEAN | — |