LTX A/V Bind Schedule (Koolook)
LTX 2.3 keeps jumping when a beat lands on your cut — this is the fix
- model
- model
LTX 2.3's party trick is synced audio-plus-video in a single generation pass - lipsync nobody else in open weights matches. But that coupling has a known failure mode: when one of your hard keyframe cuts lands on an audio peak, the video jumps - the audio→video attention is fighting the pose change you just pinned. The fix isn't a new seed or a longer clip. It's LTXAVBindSchedule, a small model-patch node from Koolook that schedules how much audio drives video at each denoise step. One pass, no re-noise.
What it actually does
It slots into the MODEL stream between your LTX 2.3 AV model and the sampler. You don't touch the prompt or the audio - the node changes how strongly the audio conditions the video over the course of denoising. Early steps are where coarse motion resolves and pose transitions settle; late steps are where lips lock to the waveform. Koolook's own tuning docs describe the whole thing as a single trade axis: audio full-on from step 0 gives you great lipsync and jumping cuts; audio off early gives you smooth motion and mouths that never sync.
How it works
In the LTX 2.3 AV transformer, the audio→video coupling is one gated cross-attention per block (audio_to_video_attn). Left at full strength every step, it holds the video hard to the audio timeline, so a keyframe transition that coincides with an audio peak gets yanked into a jump. The node patches each block's attention to scale its output by a gain that ramps from early_gain at high sigma up to full strength by low sigma. Set early_gain to 1.0 and you've reproduced stock behavior exactly - handy as a sanity check when you're A/B-ing.
The inputs that matter
early_gain- audio→video strength in the early high-sigma steps. 0 = audio-blind motion, 1 = stock. This is the main knob.bind_start/bind_end- denoise progress (0=start, 1=end) where audio begins ramping in and where it reaches full.
The optional trio - transition_frames, total_frames, transition_window - enables a windowed mode that only gates audio around keyframe transitions and leaves lips fully synced everywhere else. Worth a try, but keep your expectations in check: Koolook's own findings note that on the AV model the windowed path can fall back to a plain scalar ramp when grid_sizes isn't available at the attention call, so the global ramp is the reliable lever.
The single output, model, is the patched model - wire it straight into your sampler in place of the stock one.
The setting people actually use
From the pack's render logs: early_gain 0.35, bind_start 0.25, bind_end 0.55 on an 8-step pass gives almost-perfect lipsync and smooth motion, no jumps on a four-keyframe clip. That ~35% audio floor from step 0 is enough to time the lips without letting early audio fight pose changes. If lips look soft, raise early_gain or lower bind_start; if motion still jumps, go the other way.
Installing it
This node ships inside the ComfyUI-Koolook pack. Easiest route is ComfyUI Manager → Install Custom Nodes → search "ComfyUI-Koolook" (or install by Git URL), then restart. Manual, same result:
cd ComfyUI/custom_nodes
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart ComfyUI after. These LTX nodes need no extra Python deps beyond what the LTX 2.3 ecosystem already brings - you do need an LTX 2.3 audio-video model loaded, and the "one install at a time" rule from the README: if you already have Koolook via Manager (it installs to custom_nodes/koolook/), don't also clone it manually, or ComfyUI loads both and the workflow store can corrupt on restart.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | LTX 2.3 audio-video model. | |
| early_gain | FLOAT | 0.000–1 | Audio->video strength in the early (high-sigma) steps where big motion resolves. 0 = audio-blind motion; 1 = stock. In windowed mode this is the floor INSIDE the transition bands only. |
| bind_start | FLOAT | 0.550–1 | Denoise progress (0=start,1=end) where audio begins ramping in. |
| bind_end | FLOAT | 0.750–1 | Denoise progress where audio binding reaches full. |
| transition_framesopt | STRING | Comma-separated keyframe transition frames (timeline frames, e.g. '34,63,93'). Empty = global ramp (audio gated everywhere). Set = WINDOWED: audio binds fully everywhere except a band around these frames. | |
| total_framesopt | INT | 00–100000 | Clip length in timeline frames (e.g. 146). Required for windowed mode to map frames -> latent grid. |
| transition_windowopt | INT | 80–100000 | Half-width (timeline frames) of the audio-protected band around each transition. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |