MiniMax H3 Speech ADR Exact Fit / 配音精确时长 (EXP/T8)
Make a voiceover land on the exact frame count the scene needs
- audio
- audio
- report_json
ADR - automated dialogue replacement, the polite name for "dub the line so it fits the actor's mouth on screen" - is mostly a duration problem. The scene needs the line to occupy exactly 4.82 seconds and your rendered take runs 5.1. MiniMaxH3SpeechADRFitT8 is the pack's utility for that: it fits an AUDIO clip to an exact target duration, down to the sample count.
The one-line honesty note, straight from the author: exact duration is not a lip-sync claim. Getting a line to the right length is necessary for good ADR but nowhere near sufficient - actual phoneme-perfect sync needs a dedicated lip/facial retarget pass on the video side. This node just makes the audio obey the clock.
How it fits audio
target_duration_seconds is what you're aiming for. Then fit_mode decides the strategy:
safe_time_stretch(default) - bounded phase-vocoder time-stretch. It changes length without changing pitch, within a tight rate window.pad_or_trim- the blunt option: pad with silence or chop the tail.refuse_if_mismatch- won't touch the audio; if the length doesn't match, it refuses and reports.
The stretch is deliberately conservative: minimum_rate 0.9 and maximum_rate 1.1 (±10%). You can nudge further (0.1–4.0) but the author's default boundary exists because stretching past ±10% is where phase-vocoder artifacts start sounding like the audio is melting. pitch_semitones (0) is there if you also need a pitch shift.
Outputs: the fitted audio and a report_json describing what it did.
Where it sits
In the speech pipeline (examples/workflows/05-speech-dialogue/, see 2026-08-10_H3_Speech_Performance_ADR_Stock20_EXP.json) it's a post-decode step: render → MiniMaxH3SpeechDecodeT8 → ADRFit → MiniMaxH3SpeechAssembleT8. You fit each take to its target duration before assembly so the master timeline lines up.
Install
Pack standard:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8
then restart ComfyUI (or Manager, search "MiniMax H3 Audio T8"). No extra pip packages, no models.
The traps
- Stretch artifacts. Stay inside the default ±10% where you can. If the line is way off, the honest move is to re-render the take with a better
render_secondsin Conditioning, not to squeeze it 30%. - It doesn't move the audio on the timeline. This node changes duration; it's
SpeechAssemblethat places the result on the exact boundary the scene needs. - Length ≠ sync. If your concern is the actor's lips, this node is only step one. The pack says it outright - broadcast-grade lip sync requires dedicated lip-tracking after H3.
For a thin utility, it's well-behaved: refuse, pad/trim, or bounded stretch - your choice, no silent hacks. Just remember the boundary between "fits the timeline" and "looks like it was dubbed" is a much bigger project than this node, and this node knows it.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| target_duration_seconds | FLOAT | 5.0000.001–36000 | — |
| fit_mode | COMBO | safe_time_stretch | 3 options: refuse_if_mismatch, pad_or_trim, safe_time_stretch |
| minimum_rate | FLOAT | 0.900.1–4 | — |
| maximum_rate | FLOAT | 1.100.1–4 | — |
| pitch_semitones | FLOAT | 0.0-12–12 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| report_json | STRING | — |