H3 Audio Recover (hold-map atempo, pitch kept)
The audio half of the de-rope fix, where dialogue goes to survive
- audio
- reference
- AUDIO
Here's the thing nobody warns you about when you start de-roping MiniMax H3 clips: the video comes back clean and the speech comes back rushed. H3 generates audio jointly with the picture, and when you slow the video down, regenerate, then compress back to real time, the picture obeys the retime but the audio doesn't - so held regions sound like everyone's on fast-forward while the rest of the clip sounds fine. Confusing symptom, and this node is the fix.
H3 Audio Recover is the "recover" side of the audio story: it takes the regenerated clip's own audio, still on the slowed clock, and retimes it back to the original timeline using the same hold map that H3 Exact Recover used on the video. Feed it the right inputs and the two line up frame for frame.
How it works
Mechanically it's a phase vocoder: each held segment is compressed so its duration shrinks while pitch is preserved. H3's own foley doesn't get chipmunked, it just gets time-corrected. The implementation is careful about the details - it corrects for hop-quantization drift so the retimed track doesn't slide against the reference over the length of a clip, and it crossfades at the segment joins so you don't get clicks on the 512-sample lattice. The README even notes a user-reported istft crash on short stretched tails got fixed.
The inputs that matter
audio- the regenerated audio, fromVAEDecodeAudioof your second pass.hold_map- from the same H3 Time Smear that built the init. Same contract as the video side: mismatch and nothing lines up.fps(24) - the frame rate your holds count in.
Then the interesting one: audio_source, a plain-language dropdown instead of a bare dial, because the two ends mean different things depending on whether you seeded pass 2's audio rows:
keep the original performance (safe default)- ships your first pass's audio, which is already on the world clock and has never been through a vocoder. Best-sounding track you have.use pass 2's foley - ONLY IF the audio rows were seeded- the regenerated foley, scored for the new motion. Without a seed this is the rushed defect; with one it's a real option, though it comes back thinner (two phase-vocoder passes and a VAE round trip eat about a third of the presence band between 3.4 and 8 kHz).
reference_mix (1.0) is the raw blend dial, overridden by the presets. Trap: if you raise it without wiring reference (the baseline clip's audio), the mix does nothing - the node prints a warning, but it's easy to miss. Mid values blend two different takes and are happiest near the ends.
Where it fits
This node is the tail of the dialogue-preservation chain: H3 Audio Smear stretches the baseline track onto the dilated clock, VAEEncodeAudio encodes it, H3 V2V Init's audio_latent seeds it, and then this node compresses the result back. If your clip has no speech and you don't care about foley fidelity, you can skip the whole chain and let the regenerated audio be whatever it is. If dialogue matters, wire it.
Installing it
Pure-Python pack, no pip deps:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart and find it under audio/minimax/motion. Example graphs also want ComfyUI-KJNodes; the nodes don't. And the H3 weights carry a community license that excludes the US, EU, UK and South Korea - worth knowing before you build a whole dialogue pipeline on it.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| hold_map | STRING | — | |
| fps | INT | 241–120 | — |
| referenceopt | AUDIO | baseline clip audio (already real-time) | |
| reference_mixopt | FLOAT | 1.000–1 | 1 = the pass-1 reference track intact (default: regenerated audio quality varies, especially with turbo passes), 0 = regenerated foley only (leaner, one performance). Mid values blend two takes and are happiest near the ends |
| audio_sourceopt | COMBO | custom (use reference_mix) | plain-language presets; anything but 'custom' overrides reference_mix. WHICH ONE IS RIGHT DEPENDS ON WHETHER PASS 2's AUDIO ROWS WERE SEEDED (H3 Audio Smear -> H3 V2V Init audio_latent). Unseeded, pass 2 invents speech at natural rate and this node compresses it, so held regions come back rushed - keep the original. Seeded, pass 2 really did perform slowly, so the retime is valid and its foley is scored for the NEW motion |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| AUDIO | AUDIO | — |