MiniMax H3 Audio Timeline Planner
A 90-second song, rendered 15 seconds at a time
- audio
- image_batch
- audio_encoder_output
- conditioning_audio
- plan
- extension_task_count
- total_frames
- base_keep_frames
- report
MiniMax H3 renders four to fifteen seconds per pass, and it renders on a fixed grid: 124, 141, 158, 175 … 362 frames. That's 17k+5 at 24 fps - the model's lengths are quantised, you don't get to ask for 200. So the moment you want a real soundtrack instead of H3's own generated audio, you're doing maths - and somebody has to do it. This node does it.
What it hands you
The MiniMax H3 Audio Timeline Planner takes your master audio and your reference images and produces a version-4 MINIMAX_H3_AUDIO_PLAN - a task list. It's the planning half of a two-node pair; nothing renders here and nothing gets cropped here. The plan output feeds MiniMax H3 Audio Plan Step, which resolves one task at a time inside your sampling loop.
That split is the point: planning happens once, up front, so you can inspect it before burning an hour of GPU time. Resolution happens per iteration and validates against what the previous task actually produced - a crop mistake shows up as an error at task 7, not as desync at mux time.
How the tiling works
total_frames is derived from the master audio at a fixed 24 fps. From there the planner has to fit that many retained frames into tasks that are each no longer than max_render_frames and always a legal 17k+5 count. It picks the shortest valid length per task and balances retained frames across the minimum number of tasks rather than filling task one to the brim - short tails are what make the last task illegal.
Ordinary consecutive tasks overlap by 22 frames on purpose: the previous task's final generated frames get re-fed as a continuity clip so motion carries across the seam. Same chunking problem Wan has with its native 81-frame context, except here the overlap is exact and enforced instead of vibes.
The inputs you'll actually set
audio- the master. It's authoritative for timeline duration and for the final mux; H3's own generated audio gets thrown away.image_batch- reference stills in timeline order. Image 1 owns frame 0. Each later image takes over at its planned transition, even when its exact anchor ends up cropped.manual_transition_times-"7, 13.5, 20", one comma-separated time per image after the first. Blank means evenly spaced. The parser is strict: same count asimage_count - 1, strictly increasing, inside the audio, and no two times landing on the same frame.transition_mode-first_last_bridgeguides motion into the next image;boundary_switchmakes an honest hard cut.bridge_span(short_windoworfull_interval) andbridge_window_secondsdecide the visible bridge before the switch; set the window to zero and you've builtboundary_switchthe long way round.max_render_frames- 362 by default. Lower it and each task gets cheaper in VRAM but you get more tasks: more seams, more total time. On a 3060 this is the dial that decides whether you finish.- Activity alignment -
align_to_activity_gap,transition_edge,search_window_seconds,min_gap_duration,resume_hold_duration. With several images this nudges each target into a detected gap in the audio; with one image it puts continuation seams at sentence gaps.activity_resumecuts when sound returns after a pause,silence_startwhen the pause begins. No qualifying gap means your original target survives.
Optional: conditioning_audio (a raw Demucs vocal stem, at its own sample rate; it may differ from the master by at most one frame at 24 fps) and audio_encoder_output, the Wav2Vec features from ComfyUI's core AudioEncoderEncode. Those features only ever locate gaps - they never replace either audio input.
Read the report before you render
Outputs are plan, extension_task_count, total_frames, base_keep_frames, and report. extension_task_count is your loop iteration count - task 0 is the base render, the rest are extensions. report summarises image ownership, transition frames, hidden-anchor handoffs, activity alignment and task ranges in plain English. Drop a Show Text on it before you render anything.
Install
ComfyUI Manager → search ComfyUI_Eclipse. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
Then restart. requirements.txt is light - torch, numpy, Pillow, opencv-python, pilgram, safetensors, torchvision, PyYAML, aiohttp - and ComfyUI already covers most of it; opencv and pilgram are the usual additions on a clean install. No model download for these nodes.
Two things people trip on. Eclipse's diffusion loaders now live in the separate ComfyUI_SmartModelLoader pack, so installing this alone gets you a plan and no model. And if your workflow came from the old RvTools_v2 days it won't load - v4.0.0 deleted every legacy node, and Manager can't resolve the dead repo's node types. Run the pack's Workflow Migration Tool node, or from the repo:
python tools/migrate_workflow.py /path/to/your_workflow.json
It backs up before it rewrites.
One non-technical note: H3's weights ship under the MiniMax H3 Community License, whose grant is void in the US, EU, UK and South Korea - outputs included. That's a licensing question, not a technical one.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Master audio that sets the exact timeline duration. The workflow keeps this audio for the final mux and discards audio generated by H3. | |
| image_batch | IMAGE | Reference images in timeline order. Image 1 starts at frame 0. Each later image owns output beginning at its planned transition, even when its exact anchor is cropped. | |
| manual_transition_times | STRING | One comma-separated time in seconds for every image after the first, for example 7, 13.5, 20. Leave blank for evenly spaced targets. Activity alignment may move those targets. | |
| transition_mode | COMBO | first_last_bridge | first_last_bridge creates guided motion into the next image and uses a hidden reference anchor for the default short-window handoff. boundary_switch ends the current image and starts the next as an independent hard cut. |
| bridge_span | COMBO | short_window | Used by first_last_bridge. short_window limits next-image influence to the final bridge window, then crops 22 generated destination lead-in frames and one exact hidden anchor. full_interval uses the final available task before the transition. Ignored by boundary_switch. |
| bridge_window_seconds | FLOAT | 2.000–10 | Length of the visible short_window bridge before each transition. At 2.0, bridge motion begins two seconds early. Zero produces a hard switch. Ignored by boundary_switch. |
| cropped_lookahead_conditioning | COMBO | audio_only | short_window only. audio_only leaves cropped trailing lookahead without a future-image anchor. future_image adds that anchor only inside discarded frames; it never appears in the retained output. |
| max_render_frames | INT | 362124–362 | Maximum frames per H3 task, from 124 through 362 on the 17k+5 grid. Lower values reduce per-task memory use but create more tasks. The planner still uses the shortest valid length that fits each task. |
| align_to_activity_gap | BOOLEAN | true | Enabled: move each multi-image target to a detected gap inside the search radius. With one image, use eligible gaps for continuation seams. Disabled: retain exact manual or evenly spaced transition frames. |
| transition_edge | COMBO | activity_resume | activity_resume changes images when sustained sound returns after a gap. silence_start changes images when the detected low-activity gap begins. |
| search_window_seconds | FLOAT | 5.000–10 | Multi-image only. Search this many seconds before and after each manual or evenly spaced target. For example, 5.0 searches from target - 5 seconds to target + 5 seconds. |
| min_gap_duration | FLOAT | 0.250.02–5 | How long low activity must last to count as a gap. Raise this to ignore brief dips; lower it to accept shorter pauses. |
| resume_hold_duration | FLOAT | 0.150.02–5 | Used by activity_resume. Sound must remain active for this long after a gap. Raise it to reject brief noises; lower it to accept short resumed phrases. |
| audio_encoder_outputopt | AUDIO_ENCODER_OUTPUT | Optional Wav2Vec features from AudioEncoderEncode. The included workflow analyzes raw Demucs vocals. These features locate activity gaps and never replace either audio input. | |
| conditioning_audioopt | AUDIO | Optional guide audio for H3 at its native sample rate. Connect the raw Demucs vocal stem here to reduce instrument-driven lip motion. When disconnected, H3 uses the master audio. Duration may differ from the master by at most one 24 FPS frame. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| plan | MINIMAX_H3_AUDIO_PLAN | Version-4 H3 task plan. Connect this to MiniMax H3 Audio Plan Step. |
| extension_task_count | INT | Number of tasks after the opening task; use this as the extension-loop iteration count. |
| total_frames | INT | Exact retained output length at 24 FPS, derived from the master-audio duration. |
| base_keep_frames | INT | Frames retained from the opening H3 task. |
| report | STRING | Readable summary of image ownership, transition frames, hidden-anchor handoffs, activity alignment, audio roles, and task ranges. |