H3 Continuum Finalize Duration V3.4
Your \"7-second\" H3 clip came back 7.4 seconds long — Finalize Duration is the fixer
- images
- audio
- assembly_plan
- images
- audio
- report
Chunked video generation has a length problem nobody warns you about. You ask H3 Continuum for 336 frames, the decoder hands back 345, and the extra nine frames are not empty - they're often the front half of a word. Continuum's assembler deals with that at the end of a normal run. But the moment you insert anything between the assembler and your save node - an upscaler, a stitch, a refinement pass - you're holding a timeline that no longer matches the plan, and something has to decide what the real duration is. That's this node.
H3 Continuum Finalize Duration V3.4 is the post-processing counterpart to the assembler's own Timeline Output control. It's a small node. It exists so you don't have to hand-trim a clip and desync the lips doing it.
What it actually does
You feed it three things: decoded images, audio, and the assembly_plan the sampler produced. It reads target_frames and the per-decode-group frame counts out of the plan, then picks an output length according to timeline_mode and aligns the audio to whichever video duration it landed on.
The first thing it does is sanity-check you. It sums the plan's net_frames and compares that to images.shape[0]. If they don't match, it raises: "requires the natural retained timeline". That's not a bug, it's a guard - it means the images you handed it aren't the full decoded timeline, so it can't trust its own trimming math.
Then, in the default mode, the interesting bit. Continuum looks at the PCM it's about to throw away. If that discarded slice is quiet, you get the exact requested duration. If both its RMS and its peak clear a conservative absolute noise floor (roughly −40 dBFS RMS and −26 dBFS peak), the node keeps the full video and audio together and logs an H3C-PT229 receipt explaining the extension. A 336-frame request returns 14.375 seconds instead of clipping the last 0.375 seconds of speech.
That's an opinionated default and I'm glad it is. Cutting mid-syllable to hit a frame count is the kind of "correct" nobody ships.
Inputs, outputs, and the one setting that matters
Required: images, audio, assembly_plan. Optional: timeline_mode, and it's the only knob.
Preserve audible tail (recommended)- the default. Exact when the tail is silent, longer when it isn't.Exact requested duration (Recommended)- the legacy literal. Now behaves the same as the default rather than silently dropping speech, so old graphs don't suddenly start guillotining dialogue.Strict exact duration (may truncate active audio)- always trims. Use it when a downstream tool demands an exact frame count and you've checked the tail yourself.Natural retained timeline (Refinement)- keeps every frame. This is the mode you want if you're mid-chain and still feeding another node.
Outputs are images, audio, and report. The report is a string; wire it to a text/preview node, because it's where the node tells you which branch it took and whether driven audio was preserved. If the plan carries preserved Driving Audio, the node re-selects that source soundtrack and re-clocks it to the final frame count instead of using generated audio - the report says so explicitly.
Install
Same pack as the rest of Continuum, so install it once:
cd ComfyUI/custom_nodes
git clone https://github.com/xmarre/ComfyUI-H3-Continuum-Plus.git ComfyUI-H3-Continuum
Restart ComfyUI. In ComfyUI Manager, search H3 Continuum. Note the clone target name: the pack installs as ComfyUI-H3-Continuum, and you must not run it alongside the upstream ukr8b3g-cmyk/ComfyUI-H3-Continuum - they expose overlapping node identifiers and you'll get confusing double registrations. No model files of its own; it needs the H3 model, CLIP and VAEs your sampler already uses.
Where people get burned
The natural-timeline error is the main one, and it's almost always a frame-count change upstream. Some refinement nodes pad, interpolate or drop frames; feed those into this node and the count check fails. Fix the chain, don't bypass the check - Natural retained timeline on the assembler is what produces a timeline this node can reason about.
Second: "it made my video longer than I asked." That's the audible-tail policy working. Switch to Strict exact duration if you genuinely need the exact number, and expect a truncated consonant. Compare modes with a fixed seed and one variable changed - the only way to tell a policy decision from a sampling difference.
Third: it is not an editor. It trims to the plan's target or keeps everything; it will not rescue a run where the model simply didn't finish the sentence. Missing words need a regeneration, not a duration node.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| audio | AUDIO | — | |
| assembly_plan | H3_CONTINUUM_ASSEMBLY_PLAN | — | |
| timeline_modeopt | COMBO | Preserve audible tail (recommended) | Audible-tail-safe mode keeps full synchronized AV if active PCM would otherwise be truncated. Strict exact duration always trims; natural retains every frame. Input must be the natural timeline. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| report | STRING | — |