Nodes/ComfyUI_Eclipse/MiniMax H3 Audio Timeline Planner
ComfyUI Node

MiniMax H3 Audio Timeline Planner

A 90-second song, rendered 15 seconds at a time

By r-vage·Created 11 months ago·Updated a day ago· 35
MiniMax H3 Audio Timeline Planner
  • audio
  • image_batch
  • audio_encoder_output
  • conditioning_audio
  • plan
  • extension_task_count
  • total_frames
  • base_keep_frames
  • report
manual_transition_times
transition_modefirst_last_bridge
bridge_spanshort_window
bridge_window_seconds2.00
cropped_lookahead_conditioningaudio_only
max_render_frames362
align_to_activity_gaptrue
transition_edgeactivity_resume
search_window_seconds5.00
min_gap_duration0.25
resume_hold_duration0.15

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 as image_count - 1, strictly increasing, inside the audio, and no two times landing on the same frame.
  • transition_mode - first_last_bridge guides motion into the next image; boundary_switch makes an honest hard cut. bridge_span (short_window or full_interval) and bridge_window_seconds decide the visible bridge before the switch; set the window to zero and you've built boundary_switch the 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_resume cuts when sound returns after a pause, silence_start when 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.

Category🌒 Eclipse/ Video

Inputs (15)

NameTypeDefaultDescription
audioAUDIOMaster audio that sets the exact timeline duration. The workflow keeps this audio for the final mux and discards audio generated by H3.
image_batchIMAGEReference 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_timesSTRINGOne 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_modeCOMBOfirst_last_bridgefirst_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_spanCOMBOshort_windowUsed 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_secondsFLOAT2.000–10Length 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_conditioningCOMBOaudio_onlyshort_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_framesINT362124–362Maximum 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_gapBOOLEANtrueEnabled: 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_edgeCOMBOactivity_resumeactivity_resume changes images when sustained sound returns after a gap. silence_start changes images when the detected low-activity gap begins.
search_window_secondsFLOAT5.000–10Multi-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_durationFLOAT0.250.02–5How long low activity must last to count as a gap. Raise this to ignore brief dips; lower it to accept shorter pauses.
resume_hold_durationFLOAT0.150.02–5Used 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_outputoptAUDIO_ENCODER_OUTPUTOptional Wav2Vec features from AudioEncoderEncode. The included workflow analyzes raw Demucs vocals. These features locate activity gaps and never replace either audio input.
conditioning_audiooptAUDIOOptional 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)

NameTypeDescription
planMINIMAX_H3_AUDIO_PLANVersion-4 H3 task plan. Connect this to MiniMax H3 Audio Plan Step.
extension_task_countINTNumber of tasks after the opening task; use this as the extension-loop iteration count.
total_framesINTExact retained output length at 24 FPS, derived from the master-audio duration.
base_keep_framesINTFrames retained from the opening H3 task.
reportSTRINGReadable summary of image ownership, transition frames, hidden-anchor handoffs, activity alignment, audio roles, and task ranges.