MiniMax H3 Speech Plan / 语音规划 (EXP/T8)
Turn a script into an H3 voice performance — without guessing how long it'll take
- voice_profile
- speech_plan
- plan_json
H3 is that rare video model that generates native, synced speech as part of the clip instead of leaving you to bolt on a TTS pass afterwards. That's powerful and also a trap: type a paragraph, get a voice, but the model decides how long it talks. This node is where you take back the wheel. MiniMaxH3SpeechPlanT8 turns your raw text plus a "voice profile" into a structured speech plan - a validated H3_T8_SPEECH_PLAN object that every other node in the pack's speech chain expects as input. Nothing is rendered yet, and that's the point: the plan is the contract everything else reads.
What it actually does
The node does two jobs. First it separates the words you want spoken from the way you want them performed - you give it text and an acting_direction (the default is "natural, emotionally connected, with clear diction"), and it keeps them in separate fields so the spoken content can't leak into the direction and get read aloud. Second, it chunks the text using the language you select: language_aware chunking counts words for Latin scripts but characters for CJK, then splits into segments bounded by target_units (18) and max_units (24). For a short line you can leave chunking on single_segment and skip the whole splitting dance.
One thing it deliberately does not do: guess the render duration. render_seconds lives on the conditioning/studio node, and the report proudly notes segment duration is "planned_only_until_audio_is_rendered." H3's frame grid is 17n+5 at 24fps, so a fixed render window is safer than letting a word count invent one.
The inputs that matter
Most of the schema is safe to leave at defaults, but set these:
voice_profile- theH3_T8_VOICE_PROFILEfrom the pack's Voice Profile node. A described voice goes down the T2VA path; a reference voice (with a 2–15s audio anchor and explicit rights confirmation) goes down Ref2VA.text- your script. Keep it plain; the<d>...</d>dialogue wrapping is added downstream.emotionandemotion_intensity- note the tooltip: prompt strength only, not a calibrated acoustic control. H3 isn't fine-grained enough that "0.6 angry" reliably equals 0.6 angry.space- a nice touch: close, stage, living_room, bedside and so on, each mapping to a written acoustic description the model actually reads.
The outputs are speech_plan (wire this forward) and plan_json (the report you eyeball to confirm the chunking came out sane).
Installing and what it needs
This is part of the big T8mars/MiniMax-H3 pack, so install once, use everywhere: ComfyUI Manager, search "MiniMax H3 Audio T8", or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8
then restart ComfyUI. The pack has no forced pip dependencies (its requirements.txt is essentially "torch is supplied by ComfyUI"), but it also does not download the H3 weights - you bring the 33B diffusion model, Qwen3-VL CLIP, video VAE and audio VAE yourself. Two honesty notes while you're at it: the H3 Community License geofences the weights out of the US, EU, UK and South Korea, and this whole speech branch is explicitly experimental - expect rough edges, not a polished voice-over product.
Common issues
Because the plan is validated everywhere it's consumed, the classic failure is a mismatch downstream - changing the text after you've already rendered segments makes later nodes complain that the plan hash changed. If a downstream node throws a plan/session mismatch, re-run the plan node first. And if language disagrees with your script's actual script, CJK vs. Latin chunking will mangle your segments; set it before you rely on the output.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| voice_profile | H3_T8_VOICE_PROFILE | — | |
| text | STRING | — | |
| language | COMBO | Chinese | 11 options: Arabic, Chinese, English, French, German, Italian, +5 |
| acting_direction | STRING | natural, emotionally connected, with clear diction | — |
| emotion | STRING | neutral | — |
| emotion_intensity | FLOAT | 0.500–1 | Prompt strength only; this is not a calibrated acoustic control. |
| space | COMBO | close | 6 options: studio, close, across_table, living_room, bedside, stage |
| chunking | COMBO | single_segment | 2 options: single_segment, language_aware |
| target_units | INT | 181–200 | Words for Latin text; characters for CJK text. |
| max_units | INT | 241–300 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| speech_plan | H3_T8_SPEECH_PLAN | — |
| plan_json | STRING | — |