H3 Context Taper Noise (latent)
The H3 seam-fix that works in latent space (and why it's the one that matters)
- context_latent
- context_latent
- alpha_schedule
H3 - MiniMax's 33B open-weights video model - doesn't have a memory. It has context. When you chain shots in a character-swap continuation workflow, the previous clip's tail gets pinned as context_latent into the next generation. And here's the trap: if that context is too clean, the model copies the last shot's textures and colors almost verbatim, and color residue bleeds past the trim boundary. This node exists to stop that, and it does it before anything reaches the pixel level.
What it is. MiniMaxH3ContextLatentTaperNoise is the context_latent path of Beijinren's ComfyUI-H3-Context-Noise pack. It takes the previous shot's saved AV latent, injects Gaussian noise into the tail latent steps, and hands the result to H3 Motion Context (NikoDemon80's pack). The audio stream rides along untouched, so the sound stays continuous across the join.
It's the node you actually want on a latent-chained graph, because of a quirk worth knowing: once context_latent is wired, H3 Motion Context completely ignores context_frames. Its pixel-level sibling only matters if you're on the frames path. Latent wins.
How it works. The noise follows a validated taper: a flat injection strength alpha across the pinned steps, ramping down to alpha_end at the step that touches the seam. The goal is to make the carried frames color-damaged but motion-readable - the model can't copy the previous appearance wholesale, so it has to re-synthesize from the identity references. That's the line between "seam residue gone" and "ghost edges".
The recipe is 22 frames / 0.45 / 0.10, lifted straight from MacroSony's inject_tail_taper.py (this pack is the in-graph implementation, minus the offline mp4 round-trip):
| steps | flat | ramp | seam | |---|---|---|---| | alpha | 0.45 | 0.333 → 0.217 | 0.100 |
The inputs that matter. Four of them, really:
context_latent- the previous clip's AV latent, straight fromH3 Motion Context Load Latent. The node only accepts H3's video+audio nested pair; a plain single-stream latent is explicitly rejected, so don't wire anything else in.tail_frames- an enum, because only 5 / 22 / 39 / 56 convert to whole numbers of latent steps (2 / 7 / 12 / 17). Set it to match H3 Motion Context'scontext_length.alphaandalpha_end- flat strength and seam strength;alpha_endmust not exceedalpha. The defaults (0.45 / 0.10) are the validated values, so start there.ramp_steps- how many trailing latent steps taper down. 2 is roughly the pixel recipe's 3-frame ramp.
You can leave seed alone (one stream, so the whole sequence is reproducible from it alone) and keep noise_scale on match_latent_std - that scales the Gaussian to the carried window's own standard deviation, so alpha means the same thing whatever the latent's scale.
Outputs. You get the noised context_latent and an alpha_schedule STRING that prints the actual injection sequence. The last entry lands on alpha_end when everything's aligned - that's your quick verification the taper applied. And a hard warning from the node itself: the output is for context_latent only, do not wire it into a VAE decode.
Install. ComfyUI Manager, search "ComfyUI-H3-Context-Noise", or:
cd <ComfyUI>/custom_nodes
git clone https://github.com/Beijinren/ComfyUI-H3-Context-Noise
Restart ComfyUI and the nodes appear under conditioning/minimax. No extra Python dependencies - just ComfyUI's bundled torch and Pillow (the pyproject declares zero). You do need H3 Motion Context installed, plus H3's weights themselves, and remember the Community License's territory carve-out before you get excited.
Gotchas. Three, all from the README. The output is one-shot - never feed the noised latent back in as the next link's context. If you see "the N step tail starts at cycle position … not 0", your clip length and tail_frames are misaligned and H3 will refuse the window; fix one or the other, don't ignore it. And again: this output is context, not a frame - VAE-decoding it is a mistake.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| context_latent | LATENT | The previous clip's saved AV latent, straight from H3 Motion Context Load Latent. | |
| tail_frames | COMBO | 22 | Pixel frames to inject, converted to latent steps. Only these lengths are whole numbers of steps: 5/22/39/56 -> 2/7/12/17 steps. Set this to the same value as Motion Context's context_length. |
| alpha | FLOAT | 0.450–1 | Flat injection strength across the pinned steps. |
| alpha_end | FLOAT | 0.100–1 | Strength at the last latent step, the one touching the seam. |
| ramp_steps | INT | 21–64 | Latent steps at the end that taper down to alpha_end. Steps are coarse: on a 22-frame window one step is 4 pixel frames, so 2 is roughly the pixel recipe's 3-frame ramp. |
| seed | INT | 00–18446744073709550000 | — |
| noise_scaleopt | COMBO | match_latent_std | match_latent_std scales the gaussian to the carried window's own standard deviation, so alpha means the same thing whatever the latent's scale. unit uses raw N(0,1). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| context_latent | LATENT | — |
| alpha_schedule | STRING | — |