Two-shot talking-character video on LTX-2.3 — shot 2 is a TRUE audio+video extension of shot 1, not a cut. The last ~3 seconds of shot 1's video and audio become latent context, so the model generates forward from an ongoing utterance: the voice carries over by construction, identity holds, and the join is a continuous take. The character speaks in a reference voice you supply.
Core ComfyUI nodes plus one node from ComfyUI-KJNodes (LTXVAudioVideoMask), which powers the extension.
A word on expectations. This is a bleeding-edge pipeline — a 22B audio+video model on consumer hardware. It works, but your first clean render will likely take some tuning to YOUR machine. Every setting that matters is documented in note blocks inside the workflow, so the guidance travels with the graph. If you get stuck, comment here or open a GitHub issue — I answer.
Quick fixes — read this first
Nearly every problem reported with this workflow is one of these.
Second shot doesn't lip-sync — voiceover over a barely-moving face
Why: You are on v1.x, which chained shots on shot 1's decoded last frame. That guide is pixel-continuable, so the sampler copies it instead of animating. Structural — no setting fixes it.
Fix: Update to v2.0+. Shot 2 is now a true audio+video latent extension.LTXVAudioVideoMasknode is missing (red)
Why: v2 uses one node from ComfyUI-KJNodes for the extension.
Fix: Install ComfyUI-KJNodes. Everything else is core ComfyUI.Burned-in subtitles or captions appear
Why: The graph ships at cfg 1, and at cfg 1 negative prompts are inert on distilled models — your negative is doing nothing.
Fix: Raise cfg to about 1.3 on both CFGGuider nodes.The voice comes out British
Why: LTX drifts to a British accent unless told otherwise.
Fix: Name it affirmatively in the positive prompt: “in a casual American accent”.The model reads your scene description aloud
Why: Nothing told it which words are spoken.
Fix: Keep the exclusivity block: “She is the only person speaking, and the only voice on the audio track is hers … nothing else is read aloud.”Audio and video durations drift apart after changing length
Why: In v1 the audio latent did not follow thelengthprimitive — a silent desync.
Fix: Fixed in v2. Changelength, then set the AV-extend node'svideo_end_time/audio_end_timeto(length + 72) / 25. At the shipped 241 that is 12.52; for ~20 s use length 265 and 13.48.Length change errors out
Why: LTX-2.3 hard constraints.
Fix: Frames must be 8n+1 (121, 241, 265, 329…) and both dimensions divisible by 32.Output is mush, or the face wanders
Why: Wrong checkpoint class.
Fix: This graph's 8-step sigma ladder assumes a distilled LTX-2.x checkpoint. A non-distilled one will not resolve in 8 steps.Out of VRAM, or renders crawl
Why: A bf16 LTX-2.3 checkpoint is ~40 GB of weights.
Fix: Pick an fp8 checkpoint inUNETLoader, and drop resolution before you drop steps.
The one people miss most: cfg 1 makes your negative prompt do nothing. If you are fighting burned-in text, that is why.
What you get
SETUP -> SHOT 1 -> [last ~3s of video AND audio as latent context]
-> SHOT 2 (extends it) -> FINISH (join + refine) -> FINALWhat you need
A distilled LTX-2.x checkpoint
The LTX-2.3 VAEs and a Gemma-3-12B text encoder
The TalkVid ID-LoRA for reference-voice mode
Two settings worth knowing
cfg ships at 1, which makes negative prompts inert. Raise to ~1.3 if you need one.
length drives everything except the AV-extend end times, which are
(length + 72) / 25. At 241 that is 12.52; for ~20 s use 265 and 13.48.
Everything else I've published
JoyAI-Echo multishot patch — nodes, releases, issues
LTX-2.3 Multishot Lite — the core-node workflow
Support this work
Everything I publish — workflows, merges, quants, patches — is free and stays free. The models are non-commercial by license and I have no plans to change that.
If something here saved you an evening:
GitHub Sponsors — recurring, no platform cut
Ko-fi — one-off, no account needed
Liberapay — recurring, open-source and non-profit
Bug reports are worth as much as money. Most of the fixes in these packages exist because somebody posted a log.
Description
**v2.0 — the chained shot is now a true audio+video extension. If you used v1.x for two-shot work, please re-download: the second shot was structurally broken and no setting could fix it.**
**What was wrong.** v1 chained shots by feeding shot 1's decoded last frame into shot 2 as a guide. Three problems compounded:
- `LTXVAddGuide` does not "set frame 0" — it **appends** the guide as a competing token at the same timestamp, and at `strength 1.0` it skips its attention mask entirely. Every official Lightricks workflow uses 0.7.
- That guide was shot 1's own output at *exactly* the render size: VAE round-tripped, on-manifold, **pixel-continuable**. Reproducing it verbatim is a cheaper solution for the sampler than lip-syncing — which is why chained shots came out as "voiceover over a barely-moving face", and why it got **worse** on more strongly distilled checkpoints.
- Shot 2's audio restarted from pure noise mid-sentence while its video was pinned to a frozen frame — two contradictory anchors, every render.
**What v2 does instead.** The last ~3 seconds of shot 1 — video **and audio** — are encoded as latent context, and the model generates forward from an ongoing utterance. This is the pattern community extend workflows and Lightricks' own hosted `/extend` endpoint use. Consequences:
- The voice carries over by construction. The chained shot needs **no reference-audio node at all**.
- Identity holds through the join, and the join is a continuous take rather than a cut.
- Measured on the shipped demo config, chained-shot audio/mouth correlation went from ~0.1–0.4 (wildly unstable) to **0.64** — and the second shot now syncs *better* than the first.
**Also in v2.0**
- Guide strength is **0.7** everywhere (the official value; 1.0 silently disables the guide's attention mask).
- Every length-dependent value now follows the single `length` primitive automatically — negative indexing for the last frame, clamped trims — so changing duration is a one-widget edit instead of seven. (In v1 the audio latent did *not* follow `length`, so anyone who changed duration silently desynced audio from video.)
- Notes inside the graph rewritten to match the new architecture.
**One dependency change.** The extension node (`LTXVAudioVideoMask`) ships in **ComfyUI-KJNodes**. Everything else is still core ComfyUI. v1's "no custom nodes at all" claim is retired — if you work with LTX you almost certainly have KJNodes already, and it buys working multishot.
**Requirements unchanged otherwise:** a *distilled* LTX-2.x checkpoint, the LTX-2.3 VAEs and Gemma text encoder, and the ID-LoRA for reference-voice mode.
*Note: the workflow ships at cfg 1, which makes negative prompts inert on distilled models. If you need a negative to take effect — for example to suppress burned-in subtitles — raise it to about 1.3.*
Comments (5)
Thanks for posting this core only version. Question. In your opinion what do you think we are giving up by using core only WFs vs WFs that use all those custom nodes? Quality? Speed? Efficiency? I tend to keep using very old versions of WFs becuz I've had new custom nodes bork my entire comfy install. When I load a new WF and see it requires tons of new nodes I've never heard of, I get this Jenga feeling. Thanks.
Ha, I get the feeling, I've been in the same boat when I first started getting into all this. For my personal workflows, and the custom nodes I've created, you're missing out on long-form videos. You can get up to five-minute-long videos with no identity or voice drift. I designed this specifically because I'm running an AI sci-fi web show, and I wanted longer episodes.
I think my models will provide quality and speed, regardless of which workflows you use. I am doing my best to build models for everyone for whatever hardware they might have.
That said, my main workflow isn't "easy mode" and can absolutely be a huge pain in the arse to get setup. If anyone opens a discussion in HF or Github and has trouble, I try to be on it right away and help as much as I can.
Honestly, even this "easy" workflow is probably a little more advanced than most, but it uses mostly core node packs, plus just the ComfyUI-LTXVideo pack - which I imagine anyone playing with LTX already has or will need anyway.
Feel free to ask questions, I am happy to help.
P.S. I am updating all of my models tonight as well. I included reference audio in this specific workflow, and noticed lip sync was a little off, so I've been rebuilding models all day to get it fixed.
@joeygambino Thanks for the great explaination, I tend to create short clips but I have been meaning to try longer more complex projects. I will look out for your updates. Thanks again!
Should I wait for a V3, or you think we're good with V2?
I think we are good at the moment. If you find anything specific you think could be improved, definitely let me know. I am personally not using this workflow myself, it was a user request, so while I tested extensively to make sure all the pieces work, it doesn't mean you or someone else won't try to do something I didn't encounter yet.