MiniMax H3 Audio Timeline Planner V2
H3 Won't Render a 90-Second Take in One Pass — This Node Splits It Without Losing Sync
- audio
- image_batch
- audio_encoder_output
- conditioning_audio
- plan
- extension_task_count
- total_frames
- base_keep_frames
- analysis_manifest
- report
MiniMax H3 tops out at 362 frames per render - 15 seconds at 24 fps, and only on a fixed grid of 17k+5 frame counts (124, 141, 158 … 362, nothing in between). So the moment you want a clip that runs the length of an actual song or a two-minute dialogue take, you're not making a video, you're making a run of short H3 tasks and stitching them. The hard part isn't sampling. It's bookkeeping: which frames belong to which image, which prompt owns which second, and where every audio slice has to start so the final mux still lines up.
That's the job of the MiniMax H3 Audio Timeline Planner V2.
Where it sits in the workflow
H3 is MiniMax's 33B omni-modal video model - the one that generates stereo audio with the picture instead of bolting a sound pass on afterwards, with day-zero ComfyUI support. It's also ~42.5 GB of weights, and geofenced out of the US, EU, UK and South Korea. ComfyUI's own H3 nodes do the sampling; this pack handles everything around the sampling.
Eclipse ships three V2 nodes, and this is the entry point: Planner V2 → Plan Step V2 → Segmented Conditioning V2. The pack also still ships three legacy H3 nodes that build a version-4 plan - a separate workflow, not a superset, and the plan types don't interchange.
How it works
The master audio is the clock. Duration × 24 fps gives the exact retained frame count, and the planner carves that timeline into H3-legal tasks, balancing longer spans across the minimum number of tasks. Each entry in image_batch is a timeline state: image 0 owns frame 0, and a transition frame T always belongs to the destination interval, which is the detail that stops your cuts from drifting a frame early.
How a task gets started is the real decision. warmup_reset (the default) renders the destination image before the transition and throws away the generated lead-in, so the frame the viewer sees at T was generated rather than pasted - no reference flash. hard_cut retains the exact destination image at T and expects one deliberate A-to-B jump. first_last_bridge hands the outgoing task an ordered A/B pair and keeps B's exact image hidden at the seam.
Connect Wav2Vec features and the planner nudges transitions into low-activity gaps instead of cutting through the middle of a word.
The inputs you actually touch
audio- the untouched master. It defines duration and the final mux timing. Everything else follows it.image_batch- your timeline images, in order.segment_strategy+warmup_seconds- leave the defaults (warm reset, 2.0s) until you have a reason.conditioning_family-fl2va_keyframesorref2va_active_reference. This one has to match the checkpoint you loaded; Ref2VA needs Ref2VA weights.max_render_frames- 362 by default. Hidden warmup eats into it: two seconds of warmup leaves roughly 314 visible frames in a max-length task.manual_transition_times- comma-separated seconds, one per image after the first. Blank means even spacing, which is usually fine.
The rest - search_window_seconds, min_gap_duration, resume_hold_duration, transition_edge, align_to_activity_gap, technical_split_source, technical_seam_style, reset_anchor, ref_image_size - are second-pass tuning. optional audio_encoder_output and optional conditioning_audio (a vocal stem, same duration as the master within one frame) are both genuinely optional.
Outputs
plan goes to Plan Step V2. extension_task_count tells your loop how many extra tasks to run, total_frames is what you trim the stitched result to, and base_keep_frames is what task 0 contributes. analysis_manifest is tensor-free JSON of transitions, retained ranges and prompt owners; report is the human-readable version. Read the report once - it tells you how the split actually landed.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
pip install -r ComfyUI_Eclipse/requirements.txt # only if something is actually missing
ComfyUI Manager works too - search the pack title, "ComfyUI Eclipse". Dependencies are all ordinary; no exotic video stack. Restart ComfyUI afterwards. Eclipse also unpacks its prompt/style/wildcard defaults into its own repo folder on startup - normal, and unrelated to these nodes.
Where people get burned
The errors here are mostly consistency errors, and they're telling you something real:
- "conditioning_audio duration must match the master audio within one 24 FPS frame" - 42 ms of drift is enough. Trim or pad the stem.
- "warmup_seconds leaves no room in max_render_frames" - 10 s of warmup against a short render budget leaves nothing visible.
- "technical_cut_instruction must not be blank" - if you switch
technical_seam_styletointentional_camera_cut, the default instruction has to stay populated; it's the text that asks H3 for a deliberate angle change. - "Ref2VA does not support positional reset endpoints", plus the mixed-keyframe rejection - Ref2VA can't do hard cuts or bridges. That's H3's constraint, not the node being fussy.
Also worth knowing: the pack's README points at tools/analyze-minimax-h3-segmented-timeline-v2.py for transition QA, and as of 4.3.41 that script isn't in the repo. Don't plan an evening around it.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Untouched master audio. Its exact sample duration defines the retained 24 FPS video timeline and final mux. | |
| image_batch | IMAGE | Original user images in timeline order. Image 0 owns frame 0; transition frame T belongs to its destination. | |
| conditioning_family | COMBO | fl2va_keyframes | fl2va_keyframes supplies positional first/last images. ref2va_active_reference uses only the active non-positional Picture 1 and requires matching Ref2VA weights. |
| segment_strategy | COMBO | warmup_reset | hard_cut retains the exact FL2VA destination at T; first_last_bridge hides a destination endpoint at T and starts an independently warmed task there; warmup_reset discards source-conditioned lead-in frames. |
| warmup_seconds | FLOAT | 2.00000–10 | Generated lead-in discarded before warm-reset output. Its audio is the real preceding master-audio range, with silence padding only outside the master timeline. |
| reset_anchor | COMBO | first_only | first_only is the default reset. The experimental option adds a discarded same-source last endpoint only when no real bridge destination exists. FL2VA only. |
| technical_split_source | COMBO | original_image_reset | Long-interval technical tasks reset from the active original by default. generated_continuation uses the last 22 generated frames and is available only for FL2VA. |
| ref_image_size | COMBO | match | Ref2VA only. match limits the active reference toward the generation pixel area; max permits a 2048-pixel short edge, never upscaling either mode. |
| manual_transition_times | STRING | Comma-separated seconds, one per image after the first. Leave blank for even distribution. | |
| max_render_frames | INT | 362124–362 | Maximum legal H3 render on the 17k+5 grid. Hidden warmup and endpoints consume capacity; two seconds leaves about 314 visible frames in a 362-frame task. |
| align_to_activity_gap | BOOLEAN | true | Align image transitions, and eligible single-image technical seams, to gaps derived from optional Wav2Vec features. Falls back deterministically when unavailable. |
| transition_edge | COMBO | activity_resume | Choose the sustained activity return or the beginning of the detected low-activity interval. |
| search_window_seconds | FLOAT | 5.000–10 | Search radius before and after every multi-image target. |
| min_gap_duration | FLOAT | 0.250.02–5 | Minimum low-activity duration accepted as a gap. |
| resume_hold_duration | FLOAT | 0.150.02–5 | Minimum sustained activity after a gap when using activity_resume. |
| technical_seam_style | COMBO | plain_reset | plain_reset keeps independent original-image regeneration. intentional_camera_cut adds the editable cut instruction only to same-image technical reset tasks. |
| technical_cut_instruction | STRING | During the hidden lead-in, rapidly orbit to a strong left-side three-quarter camera angle and dolly far backward. At the cut, hold a waist-up medium-wide shot, visibly different from the prior frontal close-up. Preserve identity, wardrobe, scene, lighting, and ongoing action; do not show a frontal close-up. | Prompt text appended only at intentional same-image technical reset tasks. Identity, scene, and action continuity remain user-directed and generative. |
| audio_encoder_outputopt | AUDIO_ENCODER_OUTPUT | Optional Wav2Vec features used only for activity-gap placement; they never replace either audio stream. | |
| conditioning_audioopt | AUDIO | Optional native-rate H3 guide audio, such as a vocal stem. Duration must match the master within one frame. The master is used when disconnected. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| plan | MINIMAX_H3_SEGMENT_PLAN | Strict schema-version-1 MINIMAX_H3_SEGMENT_PLAN for the V2 Plan Step. |
| extension_task_count | INT | Number of tasks after task 0 for the stitch loop. |
| total_frames | INT | Exact retained frame count derived from master audio. |
| base_keep_frames | INT | Frames retained from the first generated task. |
| analysis_manifest | STRING | JSON without tensors: transitions, seams, retained ranges, prompt owners, guide positions, and expected source ownership for the transition analyzer. |
| report | STRING | Readable planning, ownership, audio, and task summary. |