Using LTX 2.3 Video on Chutes
LTX 2.3 is Lightricks' 22B joint audio-video foundation model: it generates video and a synchronized soundtrack in one pass. On Chutes it runs as an 8-step FP8 distilled deployment covering text-to-video, image-to-video, and multi-keyframe interpolation through a single endpoint.
Overview
LTX 2.3 updates LTX-2 (paper: "LTX-2: Efficient Joint Audio-Visual Foundation Model", arXiv 2601.03233) with improved audio and visual quality and stronger prompt adherence. It is a DiT-based model that produces synchronized video and audio within a single model rather than pairing separate generators. Lightricks publishes several checkpoints; the full trainable model is ltx-2.3-22b-dev, and this chute serves ltx-2.3-22b-distilled-1.1, distilled to run in 8 steps at CFG=1 with, per Lightricks, a different aesthetic and improved audio versus distilled 1.0. Weights are released under the LTX-2 Community License Agreement.
The runtime checkpoint here is ltx23-2.3-distilled-1.1-fp8-merged.safetensors: the FP8-scaled transformer from Kijai/LTX2.3_comfy merged with BF16 video and audio VAEs, text projection, and the Lightricks x2 spatial upscaler, using the Comfy-Org FP8 Gemma text encoder from the LTX-2 repo.
Model specifications
| Property | Value |
|---|---|
| Parameters | 22B (per Lightricks checkpoint naming) |
| Architecture | DiT-based joint audio-video foundation model |
| Modes | Text-to-video, image-to-video, multi-keyframe interpolation |
| Audio | Synchronized, generated jointly (on by default) |
| Inference steps | Fixed at 8 (distilled-1.1, CFG=1) |
| Resolution | 256x256 up to 3840x2160; snapped to multiples of 64 on this chute |
| Duration | ~20 s at 480p-1080p, ~10 s at 1440p, ~5 s at 4K width |
| Frame rate | 8-50 fps, default 24; frame count snapped to Nx8+1 |
| License | LTX-2 Community License Agreement |
| Precision | FP8 transformer + BF16 VAE/text-projection/upscaler (as served) |
| Release | March 2026 (Lightricks/LTX-2.3 on Hugging Face) |
Quick start
Own-host chute: POST a flat JSON body to /generate. Only prompt is required; the response is raw MP4 bytes (with audio) unless return_json is true.
curl -X POST "https://vonkaiser-ltx-23-video.chutes.ai/generate" \
-H "Authorization: Bearer $CHUTES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "rain on a neon-lit street at night, a taxi passes, distant thunder",
"width": 768,
"height": 512,
"duration": 6,
"generate_audio": true,
"guidance_scale": 3.1
}' \
--output output.mp4
import base64
import os
import requests
resp = requests.post(
"https://vonkaiser-ltx-23-video.chutes.ai/generate",
headers={"Authorization": f"Bearer {os.environ['CHUTES_API_KEY']}"},
json={
"prompt": "the portrait comes alive, she smiles and turns toward the window",
"input_image_b64": base64.b64encode(open("portrait.png", "rb").read()).decode(),
"width": 768,
"height": 512,
"duration": 5,
"generate_audio": True,
"guidance_scale": 3.1,
},
timeout=900,
)
resp.raise_for_status()
open("output.mp4", "wb").write(resp.content)
const resp = await fetch("https://vonkaiser-ltx-23-video.chutes.ai/generate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CHUTES_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
prompt: "a paper boat drifts down a gutter stream after rain, close tracking shot",
width: 1280,
height: 704,
duration: 6,
video_format: "mp4",
}),
});
const { writeFile } = await import("node:fs/promises");
await writeFile("output.mp4", Buffer.from(await resp.arrayBuffer()));
For keyframe interpolation, send a keyframes array of 2+ entries (base64 image + frame index, optional strength/crf); at least one keyframe must be at frame index 0, and keyframes takes precedence over input_image_b64.
Parameters and tuning
| Field | Default | Effect |
|---|---|---|
| prompt | required | Scene, motion, and sound description |
| width x height | 768 x 512 | Snapped to multiples of 64 (256-3840 x 256-2160); 1920x1080 becomes 1920x1088 |
| duration / num_frames / fps | ~4 s at 24 fps | Duration derives frame count; num_frames snaps to Nx8+1; fps 8-50 |
| guidance_scale | 3.1 | Prompt adherence vs. naturalness; chute readme documents 1.0-5.1 |
| generate_audio | true | Joint soundtrack in the MP4 |
| negative_prompt | "shaky, glitchy, low quality, worst quality, deformed, distorted" | Artifact suppression |
| enhance_prompt | false | On-GPU Llama 3.2 3B prompt rewrite (+Florence-2 captioning for I2V/keyframe); adds 1-3 s |
| num_inference_steps | 8 (fixed) | Silently overridden to 8 regardless of input |
| seed / use_random_seed | random | Set seed with use_random_seed: false for reproducibility |
| video_format | "mp4" | mp4 or webm |
Step count and CFG are baked in by distillation, so guidance_scale, prompt quality, and resolution/duration choices are your main levers. Lightricks' prompting guide emphasizes descriptive, cinematic prose; if your prompt is terse, enhance_prompt does that expansion for you on GPU.
What it's best at
The standout feature is sound: one call returns a clip with a synchronized soundtrack, which removes an entire post-production step for social clips, mood pieces, animatics, and product teasers. Image-to-video animates a still with matching audio, and keyframe interpolation generates coherent motion through multiple anchor frames, useful for controlled transitions and storyboard-driven shots. The 8-step distilled schedule keeps latency low for a 22B model, and 4K-width output is available for short clips.
Honest limits: durations cap at roughly 20 seconds and shrink as resolution rises; steps are fixed so you cannot trade time for extra quality; audio without speech can be lower quality per the model card; and like all video diffusion models it will not render reliable factual or text-heavy content.
How Chutes serves this model
The chute runs on a single RTX 6000 Pro (80 GB VRAM) with the merged FP8 transformer and BF16 VAE stack described above, on its own host with a flat JSON body. Output is streamed back as raw video bytes; return_json: true switches to a JSON envelope. The optional prompt enhancer (Llama 3.2 3B via SGLang, plus Florence-2 for image inputs) runs on the same GPU. See the model page, llms.txt, and openapi.json.
FAQ
Does LTX 2.3 really generate audio with the video?
Yes. LTX-2 is a joint audio-visual foundation model, and this chute has generate_audio: true by default, so the returned MP4 includes a synchronized soundtrack. Lightricks notes audio without speech can be lower quality. Set generate_audio: false for silent output.
Can I change the number of inference steps or use CFG like the full model?
No. This deployment runs the distilled-1.1 checkpoint, which is trained for exactly 8 steps at CFG=1; the endpoint silently overrides any num_inference_steps you send. You can still tune guidance_scale (default 3.1, range 1.0-5.1 per the chute readme).
How does keyframe interpolation work?
Pass a keyframes array of 2 or more entries, each with a base64 image and a frame index (optionally strength and crf); at least one must have frame index 0. The model generates coherent motion through the anchors. keyframes takes precedence over input_image_b64.
What resolutions and durations are supported?
Width and height snap to multiples of 64, from 256x256 up to 3840x2160. Duration caps scale with resolution: roughly 20 seconds at 480p-1080p, 10 seconds at 1440p, and 5 seconds at 4K width. Frame counts snap to Nx8+1 and fps runs 8-50 (default 24).
How do I call the API?
POST a flat JSON body to https://vonkaiser-ltx-23-video.chutes.ai/generate with Authorization: Bearer $CHUTES_API_KEY. Only prompt is required. The response is raw video bytes (mp4 by default, webm optional); set return_json: true to get JSON instead.
Can I use the output commercially?
The weights are under the LTX-2 Community License Agreement, not a standard OSI license. Review the license at github.com/Lightricks/LTX-2/blob/main/LICENSE for the permitted-use terms that apply to your case.
What does enhance_prompt do and should I use it?
It expands your prompt on-GPU with Llama 3.2 3B Instruct before generation, and for I2V/keyframe jobs also captions the first image with Florence-2 so the rewrite matches your input. It is off by default and adds 1-3 seconds. Use it for terse prompts; skip it when you have already written a detailed prompt.
Why did my 1920x1080 request come back as 1920x1088?
The chute snaps dimensions to multiples of 64, so 1080 rounds to 1088. Either accept the snap or request dimensions that are already multiples of 64.