XB-BOX - 🔄 LTX2.3 数字人无限时长对口型
Unlimited-length LTX 2.3 lipsync, stitched from segments
- model
- video_vae
- audio_vae
- clip
- start_image
- audio
- prev_video
- accumulated_video
- original_audio
- output_fps
- output_filepath
Video models don't do long clips. LTX 2.3 tops out around a few hundred frames before quality collapses and VRAM runs out, yet every "digital human" workflow - a talking head reading a script, an avatar answering questions - wants a video as long as the audio. XB_LTX23_InfiniteStreamer is XB_ToolBox's answer: it generates a long LTX 2.3 clip by generating short segments in a loop and stitching them into one continuous video with audio.
The "digital human lipsync" framing in the node name isn't marketing fluff - LTX 2.3's killer app is synchronized audio-video, and this node is built around exactly that: you feed it an audio track and a start frame, and it produces a video of a face talking for as long as the audio runs.
How it works
The mechanism is a segment relay, and it's worth understanding because it decides what you can get away with. The node:
- Takes your
total_framesand splits it into chunks ofsegment_frames(default 97 - the LTX-friendly1+8Nframe count). - For each segment, it takes the current image, runs image-to-video (
LTXVImgToVideoInplace) on it, and encodes the matching slice of youraudiowithLTXVAudioVAEEncodeso each segment carries its own synced audio latent. - It keeps
overlap_frames(default 8) frames from each segment's tail and feeds them into the next segment as the starting image - the "relay" that keeps motion continuous. - The last segment writes everything out to
ComfyUI/output/LTX23_Infinite_Output.mp4.
It uses the 8-step distilled LTX settings by default (euler, with a preset gen_sigmas string), which is the only way this is practical on a consumer card. At 8 steps, segments add up fast.
The inputs that matter
The required list is long, so here's what you actually set:
- model, video_vae, audio_vae, clip - LTX 2.3 needs the video VAE and the separate audio VAE. The pack's
XB_ModelLoaderV3(dual VAE + dual CLIP) was built for exactly this pairing. - start_image - the first frame your talking head begins from.
- audio - the driving track. Length decides the output: the relay stops when the audio is exhausted.
- width / height / total_frames / fps - the canvas and the target length.
- segment_frames / overlap_frames - segment size and relay overlap. 8 is the author's suggested overlap (multiples of 8 keep LTX's temporal structure happy).
- img2video_strength (default 0.7) - how much of each new segment follows the previous image vs. wanders. Crank it down if faces drift between segments.
- img_compression - latent compression for the video VAE.
Optional inputs give you tiled VAE decoding (vae_tile_size, vae_overlap, plus temporal tile controls) for when a full-res decode OOMs - this is the same tiled temporal decode trick the pack's "原版优化" VAE node wraps. There's also prev_video to continue an existing clip instead of starting from a single image.
Outputs: accumulated_video (the full IMAGE sequence), original_audio (your audio passed back), output_fps (FLOAT), and output_filepath (where the mp4 landed).
Where it fits
Real-world lipsync wisdom, from people who've pushed this pattern hard: LTX makes talking heads easier than Wan but plasticizes realistic faces - the community's fix is LTX for the lipsync draft, then a Wan pass to fix the teeth and skin. Use this node as the LTX stage of that two-step pipeline, not as a claim that LTX alone is a finished digital human. Also: LTX punishes short prompts, so give the positive prompt some context per segment rather than one word.
Install & issues
cd ComfyUI/custom_nodes
git clone https://github.com/WJLUOXIAO/XB_ToolBox.git
# or: ComfyUI Manager → "XB_ToolBox"
This node leans entirely on ComfyUI's native LTX nodes, so there's no extra pip install - but your ComfyUI must be current enough to ship the LTX 2.3 nodes (EmptyLTXVLatentVideo, LTXVAudioVAEEncode, LTXVImgToVideoInplace) and have LTX 2.3 weights in your models folder.
Where people get burned: overlap too small = visible seams where segments restart; overlap too big = double-motion smearing; and the classic - the relay keeps going until audio runs out, so if your audio is an hour of silence, expect an hour of segments queued. And if you see segment-to-segment flicker, it's usually the temporal VAE tiling, not the sampler - bump vae_temporal_overlap rather than fighting the prompts.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| clip | CLIP | — | |
| start_image | IMAGE | — | |
| width | INT | 宽度 | |
| height | INT | 高度 | |
| total_frames | INT | 总帧数 | |
| fps | INT | 帧率 | |
| audio | AUDIO | — | |
| segment_frames | INT | 975–4096 | 每段生成帧数 |
| overlap_frames | INT | 81–33 | 接力重叠帧数(建议8的倍数) |
| positive_prompt | STRING | — | |
| negative_prompt | STRING | — | |
| seed | INT | 00–18446744073709550000 | — |
| sampler_gen | COMBO | euler | 采样器(8步) |
| gen_sigmas | STRING | 1.0,0.99375,0.9875,0.98125,0.975,0.909375,0.725,0.421875,0.0 | Sigmas(8步) |
| img_compression | INT | 180–100 | — |
| img2video_strength | FLOAT | 0.700–1 | — |
| prev_videoopt | IMAGE | — | |
| vae_tile_sizeopt | INT | 32064–4096 | — |
| vae_overlapopt | INT | 640–512 | — |
| vae_temporal_sizeopt | INT | 801–4096 | — |
| vae_temporal_overlapopt | INT | 160–256 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| accumulated_video | IMAGE | — |
| original_audio | AUDIO | — |
| output_fps | FLOAT | — |
| output_filepath | STRING | — |