Video with sound: LTX-2.5
Lesson "video-ltx", in the group Video of the lesson list. Steps: 16.
What you will be able to do
One run draws a clip and its sound together, from a prompt.
What you need
- It goes on from Video on a modest graphics card: Wan 2.2 5B. The card says so; it is a hint, not a lock.
- Model files the lesson checks:
- for
unet_nameof Load Diffusion Model: a file whose name hasltx-2; - for
clip_nameof Load CLIP: a file whose name hasgemma; - for
vae_nameof Load VAE (VAE of the video): a file whose name hasltxandvideo; - for
vae_nameof Load VAE (sound VAE): a file whose name hasltxandaudio; - for
model_nameof Load Latent Upscale Model: a file whose name hasltxandupscaler.
- for
- Nodes: Load Diffusion Model, Load CLIP, Load VAE, CLIP Text Encode (Prompt), LTXVConditioning, EmptyLTXVLatentVideo, Empty LTXV Latent Audio, LTXVConcatAVLatent, RandomNoise, KSamplerSelect, ManualSigmas, LTXVDualCFGGuider, SamplerCustomAdvanced, LTXVSeparateAVLatent, Load Latent Upscale Model, LTXVLatentUpsampler, VAE Decode (Tiled) / VAE Decode, LTXV Audio VAE Decode, Create Video, Save Video.
- The app downloads and installs nothing. The step texts below say which files and folders, and which ComfyUI template names them.
The steps
The words of each step, as the lesson shows them. Node names are in bold.
What it costs, first (reading)
LTX-2.5 by Lightricks draws the picture and the sound in one go: steps, rain, a voice. The graph works in two stages: the first draws the clip at half size, a latent upscaler doubles it, and the second stage finishes the detail.
What you need: the distilled model (over 20 GB) in
models/diffusion_models; the Gemma text encoder (about 12 GB) inmodels/text_encoders; two VAE files, one for the video and one for the sound, inmodels/vae; the upscaler inmodels/latent_upscale_models. A card with 24 GB is comfortable; with less, ComfyUI moves parts to system memory and the run is slower. The distilled model needs only eight steps and three, so a five-second clip takes minutes.The graph is the largest of these lessons. If the canvas already holds another graph, start from an empty one: "File ▸ New project".
Load the model
Add a Load Diffusion Model node and choose the
ltx-2.5distilled file inunet_name.If the file you need is not in the list, your ComfyUI does not have it. The app downloads nothing. The easiest way is to open, in ComfyUI itself, the "LTX-2.5: Text to Video" template: it shows which files are missing and where to put them. Then choose "Sync ▸ Sync now" in this app's menu, and the files appear in the lists.
The text encoder and the two VAEs
Add Load CLIP, Load VAE and a second Load VAE.
- In
clip_nameof Load CLIP choose the Gemma file made for LTX-2.5 and settypetoltxv. - In
vae_nameof Load VAE choose thevideo-vaefile. - In
vae_nameof the second VAE loader choose theaudio-vaefile.
The picture and the sound have their own VAE; mixing them up gives noise in place of sound.
- In
Write the prompt with its sound
Add two CLIP Text Encode (Prompt) nodes and connect the
CLIPoutput of Load CLIP to each. In thetextfield of one, describe the scene in several sentences, and say what is heard: "rain drums on a tin roof", "she says quietly: we are late". The other is the negative prompt.LTX reads long, detailed prompts best.
Tell the model the frame rate
Add a LTXVConditioning node. Connect the two prompts to its
positiveandnegativeinputs and setframe_rateto 24.The model needs to know how fast time runs in the clip, for the motion and for the sound to keep pace.
Size and length of the first stage
Add a EmptyLTXVLatentVideo node. Set
widthto 768,heightto 512 andlengthto 121.This is half the final size: the upscaler doubles it. For LTX the number of frames is of the form 8n + 1 (97, 121) and the sides are multiples of 32. 121 frames at 24 fps make five seconds.
A blank for the sound, joined to the video
Add Empty LTXV Latent Audio and LTXVConcatAVLatent.
- Connect the output of the sound VAE loader to the
audio_vaeinput of Empty LTXV Latent Audio. Setframes_numberto 121 andframe_rateto 24, as for the video. - Connect the output of EmptyLTXVLatentVideo to
video_latentof LTXVConcatAVLatent, and the output of Empty LTXV Latent Audio toaudio_latent.
The model draws picture and sound in one latent, so the two blanks travel together.
- Connect the output of the sound VAE loader to the
Noise, sampler and steps
Add RandomNoise, KSamplerSelect and ManualSigmas.
- In
sampler_nameof KSamplerSelect chooseeuler_ancestral. - In
sigmasof ManualSigmas write:1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0.
This custom sampler is built of parts. The list of numbers is the noise left after each step: the distilled model was trained for exactly these eight steps.
- In
The guider
Add a LTXVDualCFGGuider node. Connect the model to its
modelinput, and thepositiveandnegativeoutputs of LTXVConditioning to its inputs. Setvideo_cfgandaudio_cfgto 1.The distilled model needs no extra push from the prompt; a higher value burns the picture.
The first stage
Add a SamplerCustomAdvanced node and connect to it: noise from RandomNoise, guider from LTXVDualCFGGuider, sampler from KSamplerSelect, sigmas from ManualSigmas, and latent_image from LTXVConcatAVLatent.
- Double the size of the video
Add LTXVSeparateAVLatent, Load Latent Upscale Model, LTXVLatentUpsampler and a second LTXVConcatAVLatent.
- The
outputof the first stage goes intoav_latentof LTXVSeparateAVLatent: it parts the video and the sound. - In
model_nameof Load Latent Upscale Model choose the LTX-2.5 spatial upscaler file. Its output goes intoupscale_modelof LTXVLatentUpsampler, the video VAE intovae, andvideo_latentof LTXVSeparateAVLatent intosamples. - The output of LTXVLatentUpsampler goes into
video_latentof the new join, andaudio_latentof LTXVSeparateAVLatent into itsaudio_latent.
Only the video is enlarged; the sound goes on as it is.
- The second stage
Add a second ManualSigmas with sigmas 0.85, 0.7250, 0.4219, 0.0, and a second SamplerCustomAdvanced. Connect to the new sampler the same noise, guider and sampler choice, the new list of steps, and the output of the second join to latent_image.
Three short steps finish the detail of the larger clip. The template has a copy of the noise, the guider and the sampler choice for each stage, with the same settings; one of each serves both.
- Turn the result into frames and sound
Add a second LTXVSeparateAVLatent, a VAE Decode (Tiled) and a LTXV Audio VAE Decode.
- The
outputof the second stage goes intoav_latentof the new separating node. - Its
video_latentgoes intosamplesof VAE Decode (Tiled), with the video VAE intovae. - Its
audio_latentgoes intosamplesof LTXV Audio VAE Decode, with the sound VAE intoaudio_vae.
The tiled decoder turns a large clip into frames piece by piece, so the end of the run needs less memory.
- Make the clip with its sound
Add Create Video and Save Video: the frames into images, the sound into audio, the clip into video. Set fps to 24, as in LTXVConditioning.
- When the result is not right (reading)
- The sound does not fit the picture: describe the sound in the prompt as clearly as the picture.
- The clip is still: describe one clear action and the camera's motion.
- It does not fit in memory: lower
lengthto 97, or the size to 640 × 384.
- The graph is ready (reading)
Save the graph with "File ▸ Save workflow for ComfyUI…", open the file in ComfyUI and run it there. This app runs nothing in ComfyUI itself.
What the lesson checks
A reading step is done when you press Got it, next. A doing step ticks itself off when the canvas holds:
- Step 2, Load the model:
- a Load Diffusion Model node.
unet_nameof Load Diffusion Model holds a file whose name hasltx-2(capitals, dots and dashes do not matter).
- Step 3, The text encoder and the two VAEs:
- a Load CLIP node.
- a Load VAE node.
- a Load VAE node.
clip_nameof Load CLIP holds a file whose name hasgemma(capitals, dots and dashes do not matter).typeof Load CLIP isltxv.vae_nameof Load VAE (VAE of the video) holds a file whose name hasltxandvideo(capitals, dots and dashes do not matter).vae_nameof Load VAE (sound VAE) is not the same file asvae_nameof Load VAE (VAE of the video).vae_nameof Load VAE (sound VAE) holds a file whose name hasltxandaudio(capitals, dots and dashes do not matter).
- Step 4, Write the prompt with its sound:
- a CLIP Text Encode (Prompt) node.
- a CLIP Text Encode (Prompt) node.
CLIPof Load CLIP intoclipof CLIP Text Encode (Prompt) (prompt).CLIPof Load CLIP intoclipof CLIP Text Encode (Prompt) (negative prompt).textof CLIP Text Encode (Prompt) (prompt) holds at least 40 characters.
- Step 5, Tell the model the frame rate:
- a LTXVConditioning node.
CONDITIONINGof CLIP Text Encode (Prompt) (prompt) intopositiveof LTXVConditioning.CONDITIONINGof CLIP Text Encode (Prompt) (negative prompt) intonegativeof LTXVConditioning.frame_rateof LTXVConditioning is24.
- Step 6, Size and length of the first stage:
- a EmptyLTXVLatentVideo node.
widthof EmptyLTXVLatentVideo is from 512 to 960; Do this for me sets 768.heightof EmptyLTXVLatentVideo is from 288 to 544; Do this for me sets 512.lengthof EmptyLTXVLatentVideo is from 49 to 121; Do this for me sets 121.
- Step 7, A blank for the sound, joined to the video:
- a Empty LTXV Latent Audio node.
- a LTXVConcatAVLatent node.
VAEof Load VAE (sound VAE) intoaudio_vaeof Empty LTXV Latent Audio.LATENTof EmptyLTXVLatentVideo intovideo_latentof LTXVConcatAVLatent (join, first stage).LATENTof Empty LTXV Latent Audio intoaudio_latentof LTXVConcatAVLatent (join, first stage).frames_numberof Empty LTXV Latent Audio equalslengthof EmptyLTXVLatentVideo.frame_rateof Empty LTXV Latent Audio equalsframe_rateof LTXVConditioning.
- Step 8, Noise, sampler and steps:
- a RandomNoise node.
- a KSamplerSelect node.
- a ManualSigmas node.
sampler_nameof KSamplerSelect iseuler_ancestral.sigmasof ManualSigmas (first stage) is1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0.
- Step 9, The guider:
- a LTXVDualCFGGuider node.
MODELof Load Diffusion Model intomodelof LTXVDualCFGGuider (a LoraLoaderModelOnly or EasyCache in between is accepted).positiveof LTXVConditioning intopositiveof LTXVDualCFGGuider.negativeof LTXVConditioning intonegativeof LTXVDualCFGGuider.video_cfgof LTXVDualCFGGuider is1.audio_cfgof LTXVDualCFGGuider is1.
- Step 10, The first stage:
- a SamplerCustomAdvanced node.
NOISEof RandomNoise intonoiseof SamplerCustomAdvanced (first stage).GUIDERof LTXVDualCFGGuider intoguiderof SamplerCustomAdvanced (first stage).SAMPLERof KSamplerSelect intosamplerof SamplerCustomAdvanced (first stage).SIGMASof ManualSigmas (first stage) intosigmasof SamplerCustomAdvanced (first stage).LATENTof LTXVConcatAVLatent (join, first stage) intolatent_imageof SamplerCustomAdvanced (first stage).
- Step 11, Double the size of the video:
- a LTXVSeparateAVLatent node.
- a Load Latent Upscale Model node.
- a LTXVLatentUpsampler node.
- a LTXVConcatAVLatent node.
outputof SamplerCustomAdvanced (first stage) intoav_latentof LTXVSeparateAVLatent (after the first stage).video_latentof LTXVSeparateAVLatent (after the first stage) intosamplesof LTXVLatentUpsampler.LATENT_UPSCALE_MODELof Load Latent Upscale Model intoupscale_modelof LTXVLatentUpsampler.VAEof Load VAE (VAE of the video) intovaeof LTXVLatentUpsampler.LATENTof LTXVLatentUpsampler intovideo_latentof LTXVConcatAVLatent (join, second stage).audio_latentof LTXVSeparateAVLatent (after the first stage) intoaudio_latentof LTXVConcatAVLatent (join, second stage).model_nameof Load Latent Upscale Model holds a file whose name hasltxandupscaler(capitals, dots and dashes do not matter).
- Step 12, The second stage:
- a ManualSigmas node.
- a SamplerCustomAdvanced node.
NOISEof RandomNoise intonoiseof SamplerCustomAdvanced (second stage).GUIDERof LTXVDualCFGGuider intoguiderof SamplerCustomAdvanced (second stage).SAMPLERof KSamplerSelect intosamplerof SamplerCustomAdvanced (second stage).SIGMASof ManualSigmas (second stage) intosigmasof SamplerCustomAdvanced (second stage).LATENTof LTXVConcatAVLatent (join, second stage) intolatent_imageof SamplerCustomAdvanced (second stage).sigmasof ManualSigmas (second stage) is0.85, 0.7250, 0.4219, 0.0.
- Step 13, Turn the result into frames and sound:
- a LTXVSeparateAVLatent node.
- a VAE Decode (Tiled) or VAE Decode node.
- a LTXV Audio VAE Decode node.
outputof SamplerCustomAdvanced (second stage) intoav_latentof LTXVSeparateAVLatent (after the second stage).video_latentof LTXVSeparateAVLatent (after the second stage) intosamplesof VAE Decode (Tiled) or VAE Decode.VAEof Load VAE (VAE of the video) intovaeof VAE Decode (Tiled) or VAE Decode.audio_latentof LTXVSeparateAVLatent (after the second stage) intosamplesof LTXV Audio VAE Decode.VAEof Load VAE (sound VAE) intoaudio_vaeof LTXV Audio VAE Decode.
- Step 14, Make the clip with its sound:
- a Create Video node.
- a Save Video node.
IMAGEof VAE Decode (Tiled) or VAE Decode intoimagesof Create Video.AUDIOof LTXV Audio VAE Decode intoaudioof Create Video.VIDEOof Create Video intovideoof Save Video.fpsof Create Video is24.