Painter LTX2V Omni
The node that gives Bernini a voice
- positive
- negative
- video_vae
- audio_vae
- start_image
- end_image
- source_video
- reference_image1
- reference_image2
- positive
- negative
- video_latent
- audio_latent
Bernini makes gorgeous silent video, and "the king is mute" is the community's favorite jab at it. The standard workaround is to run the render through LTX-2.3 to add sound - and PainterLTX2Vomni is the node that makes that one pass instead of a Franken-workflow. It's an omni (video + audio) conditioning and latent builder for LTX 2.x: feed it the silent video, prompt conditioning, both VAEs, and it returns the video latent, the audio latent, and conditioning for a single LTX omni sampling pass that outputs picture and synced sound.
What it is
A model/conditioning/ltxv node, and the newest star in the pack's changelog: "can dub and lip-sync Bernini-generated silent video, works very well, worth trying." The author frames it as supporting text-to-video, image-to-video, first/last-frame, and reference video tasks too - but the reason people install it is the Bernini dubbing path.
How it works
LTX-2/2.3 is a multimodal model: one DiT renders both video and audio, and it has two VAEs - a video_vae for the frames and an audio_vae for the sound. This node expects both (they come from your LTX 2.3 loader), then builds both latents. The outputs tell the story: video_latent and audio_latent - you feed both into the omni sampler, and the decoded result is video with a native audio track, mouth movements included. That's the whole magic of the "dub a silent Bernini clip" workflow: the LTX pass re-renders with the audio baked in, giving you Wan-2.2-level motion (from Bernini) plus LTX's sound.
The strength input (default 0.7) controls how hard the omni pass re-conditions the source - lower keeps the original footage closer, higher lets LTX re-animate more aggressively for the lipsync. reference1_frame_idx / reference2_frame_idx pick which frames of the source get treated as reference anchors (negative values work as offsets). Resolution steps by 32 and length steps by 8, matching LTX-2.3's hard rule that width/height are divisible by 32 and frame count is 8n+1 - off-grid values fail on this model, so the stepping is doing you a favor.
Inputs and outputs that matter
- source_video - the silent clip to dub (this is the Bernini output slot).
- video_vae / audio_vae - both VAEs from your LTX 2.3 stack.
- strength - how much the omni pass re-animates the source.
- frame_rate / length - timing and frame count (
8n+1). - start_image / end_image / reference_image1/2 - optional anchors for I2V and reference tasks.
- Outputs:
positive/negative/video_latent/audio_latent→ into the omni sampler.
Install
Part of the PainterNodes pack. ComfyUI Manager → search "PainterNodes" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes
pip install -r requirements.txt
The full graph is in workflows/bernini+ltx2.3.json - that's the reference for the "Bernini render → LTX dub" pipeline.
Common issues
- No audio in the output - you decoded only the video latent. The omni sampler needs both latents; a sampler that doesn't know about the audio latent will cheerfully drop it.
- Resolution/length errors - LTX 2.3 enforces the 32 /
8n+1rules hard, and off-grid values fail rather than round. The node steps by 8 on length, but if you're typing odd numbers yourself, expect errors. - It's heavy - LTX 2.3 is 22B. On 16GB cards the GGUF quants are the way; on 8–12GB you're in slow territory and 64GB system RAM helps more than you'd think.
This is the node that patches the single most complained-about gap in the best open editing model of 2026. If you run Bernini, you'll want it.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| width | INT | 76864–16384 | — |
| height | INT | 51264–16384 | — |
| length | INT | 971–16384 | — |
| frame_rate | FLOAT | 25.000–1000 | — |
| strength | FLOAT | 0.700–10 | — |
| reference1_frame_idx | INT | 0-9999–9999 | — |
| reference2_frame_idx | INT | 0-9999–9999 | — |
| start_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| source_videoopt | IMAGE | — | |
| reference_image1opt | IMAGE | — | |
| reference_image2opt | IMAGE | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| video_latent | LATENT | — |
| audio_latent | LATENT | — |