MiniMax H3 Long Video Voice Context / 长视频人物音色与句界 (Advanced EXP/T8)
Keep the right voice on the right character across long H3 segments
- voice_context_plan
- segment_prompts_json
- audio_pin_frames_json
- ready
- first_shot_review_required
- report_json
Long H3 videos have a voice problem. H3 can pin a character's look across segments, but the audio side of a multi-segment shoot drifts the same way the picture does: segment three's line reads flat, the wrong voice sneaks in for a character, or a sentence is cut mid-word at a segment boundary. This node is the planning layer that keeps voices and sentence boundaries consistent across the long-video runtime. It doesn't touch a single waveform - it never reinjects or cuts audio - what it does is compile the plan: which character is bound to which <Audio N> tag, exactly where audio should be pinned in global and local frame coordinates, and what each segment's prompt should say to keep the voice honest.
Think of it as the translation between your story and the model's media tags. You tell it who's talking when, in a timeline; it turns that into per-segment prompts and audio pin frames that the long-video runtime can actually use. The output plugs straight into the existing long-video pipeline - this is a companion for the established runtime, not a new renderer.
Inputs that matter
- chain_id - names the job (default
my_h3_voice_context) - total_duration_seconds (30), render_window_frames (124), context_frames (5/22/39, default 22) - the segmentation grid
- global_prompt - the story-level prompt
- dialogue_timeline_json - the actual script, as JSON: character, text, start/end seconds. The default is a one-line example (
Character_Asaying "你好。"), which shows the shape - voice_bindings_json - who gets which audio slot:
{"Character_A": 1}means Character_A is bound to<Audio 1> - cross_boundary_policy - default
abstain; how to handle a sentence that would span a segment boundary (abstain = don't force it, which is the safe choice) - first_shot_review_required (true) - whether to demand a human review of the first shot before release
Outputs: voice_context_plan, segment_prompts_json (the per-segment prompts to feed the runtime), audio_pin_frames_json (the exact global/local pin frames), ready (BOOLEAN), first_shot_review_required, and report_json.
Installing it
Part of the T8mars/comfyui-minimax-h3-audio-T8 pack - search "MiniMax H3 Audio T8" in ComfyUI Manager, install, restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Update ComfyUI first (recent core: comfy_api.latest, comfy.weight_adapter, comfy.patcher_extension, comfy.ldm.minimax); requirements.txt is intentionally empty.
Where people get burned
The numbering. This node's whole job is correct <Audio N> bindings, and the pack's standing rule is that media tags must match the connected inputs - here that means voice_bindings_json must line up with the audio slots the runtime actually has. Mismatch the numbers and you'll get a confident plan that voices the wrong characters. The other trap is cross_boundary_policy: a sentence that must cross a segment boundary is a real problem, and abstain handles it by refusing to force it - which is safe but means the sentence may just get clipped or rephrased by the runtime. If your script has long sentences, budget the dialogue so lines land inside segments, not across them. And remember this is a planning node: it produces JSON, not audio. The actual waveform is generated by the long-video runtime downstream, and first_shot_review_required is where the human gets to verify the voice actually stuck before the chain runs away.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| chain_id | STRING | my_h3_voice_context | — |
| total_duration_seconds | FLOAT | 30.000.04–3600 | — |
| render_window_frames | INT | 124124–362 | — |
| context_frames | COMBO | 22 | 3 options: 5, 22, 39 |
| global_prompt | STRING | — | |
| dialogue_timeline_json | STRING | [{"character_id":"Character_A","text":"你好。","start_seconds":0,"end_seconds":1.5}] | — |
| voice_bindings_json | STRING | {"Character_A":1} | — |
| cross_boundary_policy | COMBO | abstain | 2 options: abstain, duplicate_exact_text_exp |
| first_shot_review_required | BOOLEAN | true | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| voice_context_plan | H3_T8_LONG_VIDEO_VOICE_CONTEXT_PLAN | — |
| segment_prompts_json | STRING | — |
| audio_pin_frames_json | STRING | — |
| ready | BOOLEAN | — |
| first_shot_review_required | BOOLEAN | — |
| report_json | STRING | — |