LTX 2.3 Audio-Reactive LoRA
Create audio-reactive videos with LTX 2.3 and the Audio-Reactive LoRA.
简介
This ComfyUI workflow turns a single still image into an audio‑reactive video using the LTX‑Video 2.3 model enhanced with the Audio‑Reactive LoRA. You provide one image via LoadImage and an audio track via LoadAudio; a GeminiNode in the Create Audio‑Reactive LoRA Prompt group helps craft a clean, descriptive text prompt from your idea (and optionally your image context). That prompt, together with the image and audio, flows into the LTX 2.3 video generator node (dacae91a-7342-43be-a654-227b303c33bc), where the Audio‑Reactive LoRA modulates motion and visual rhythm in response to the soundtrack.
You can preview output with PreviewAny and export the final result with SaveVideo.
Technically, the workflow applies the Audio‑Reactive LoRA from https://huggingface.co/100percentrobot/LTX-2.3-Audio-Reactive-LORA at inference time on top of LTX 2.3. The LoRA strength parameter controls how strongly the audio‑driven behavior influences the video: use 1.0–2.0 overall, with 1.4+ for more pronounced reactivity. This design is practical for fast, beat‑aware animations of posters, album art, and social posts: you focus on a concise prompt and good source media, while the LTX node handles frame synthesis and timing, and SaveVideo writes a ready‑to‑share clip.
你需要提供
- 正在读取工作流
在 ComfyUI 中运行。 此工作流无法在本页面运行。你可以在 Comfy Cloud 中打开(已预先加载所需内容),或下载后在自己的 ComfyUI 中使用。
在 Cloud 中试用查看工作流内部
节点图的只读预览。在 Comfy Cloud 中打开或下载后即可编辑节点。
Loading the graph
Open full-size workflow preview- 作者
- ComfyUI
需要自定义节点
- 正在读取工作流
通过代码使用此工作流
尽可能根据工作流图和输入自动生成代码,否则显示已保存的示例。运行代码可能产生费用,请先核对凭据和端点。
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
需要付费的 Cloud 方案和额度。
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"666": {
"class_type": "LoadImage",
"inputs": {
"image": "a7cab6d454766c95811afb8c96935c5778ef0ac02f0f3a2d387395c9c01848ca.png"
},
"_meta": {
"title": "Load Image"
}
},
"683": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/ComfyUI",
"format": "auto",
"format.codec": "auto",
"video": [
"790:312",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"753": {
"class_type": "GeminiNode",
"inputs": {
"audio": [
"771",
0
],
"images": [
"666",
0
],
"model": "gemini-3-1-flash-lite",
"prompt": "Continuous audio-reactive video.",
"seed": 144553724312715,
"system_prompt": "You are an expert prompt engineer specializing in LTX-2.3 video generation prompts, especially audio-reactive LoRA workflows.\n\nYour task is to generate cinematic, continuous, high-motion video prompts using the required trigger phrase:\n\ncontinuous audio-reactive video\n\nAlways include this exact phrase near the beginning of every prompt.\n\nThe user will provide, imply, or request a visual concept, music genre, or motion style. Transform their idea into a polished prompt that follows this structure:\n\nA continuous audio-reactive video that transitions smoothly from [Phase 1: Initial Subject & Action] to [Phase 2: First Evolution & Motion], then warps/morphs into [Phase 3: Second Evolution & Morphing] before warping/morphing into [Phase 4: Final Chaotic/Complex State], with every [Type of Visual Motion/Deformation] perfectly synchronized to the [Musical Element 1], [Musical Element 2], and [Musical Element 3] of the [Music Genre & Vibe] track.\n\nOutput rules:\n- Always answer with only one finished prompt.\n- Do not include explanations, headings, labels, notes, negative prompts, recommended settings, batch guidance, or extra sections.\n- Do not ask clarifying questions.\n- Make a reasonable creative choice when the user gives limited detail.\n- Always include 2 to 4 distinct phases.\n- Prefer 4 phases for complex, chaotic, surreal, or high-energy transformations.\n- Prefer 2 or 3 phases for elegant, minimal, stable, or slower concepts.\n- Make the video feel continuous, not like separate scenes.\n- Use smooth transition language such as “transitions smoothly,” “melts into,” “warps into,” “morphs into,” “fractures into,” “blooms into,” or “folds into.”\n- Emphasize visible motion, rhythmic deformation, fluid morphing, and high-motion transformation.\n- Avoid static composition language unless paired with motion.\n- Avoid vague phrases like “cool visuals,” “nice effects,” or “beautiful animation.”\n- Do not overcomplicate the scene with too many unrelated subjects.\n- Keep the subject visually trackable as it evolves.\n- Synchronize visual motion to musical features such as bass hits, kick drums, snares, hi-hats, synth pulses, vocal chops, risers, drops, cymbal crashes, arpeggios, sub-bass waves, or tempo shifts.\n- For image-to-video requests, preserve the starting image’s core subject, composition, color palette, and camera angle while adding audio-reactive motion and morphing.\n\nStyle:\nUse vivid, cinematic, motion-heavy language. Prioritize fluid morphing, rhythmic deformation, beat-synced escalation, and seamless phase-to-phase transformation.\n\nFinal answer format:\nReturn only the completed prompt as plain text."
},
"_meta": {
"title": "Google Gemini"
}
},
"754": {
"class_type": "PreviewAny",
"inputs": {
"source": [
"753",
0
]
},
"_meta": {
"title": "Preview as Text"
}
},
"771": {
"class_type": "LoadAudio",
"inputs": {
"audio": "7a29278de26075c7c4427ba063619794fea87b636bd658b02b36c44e402cb21b.mp3"
},
"_meta": {
"title": "Load Audio"
}
},
"790:285": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 42
},
"_meta": {
"title": "RandomNoise"
}
},
"790:286": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 932062505248290
},
"_meta": {
"title": "RandomNoise"
}
},
"790:287": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"790:309",
1
],
"video_latent": [
"790:296",
0
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"790:288": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_cfg_pp"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"790:289": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "0.85, 0.7250, 0.4219, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"790:290": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"790:791",
0
],
"negative": [
"790:292",
1
],
"positive": [
"790:292",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"790:291": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"790:315",
0
],
"latent_image": [
"790:326",
0
],
"noise": [
"790:286",
0
],
"sampler": [
"790:298",
0
],
"sigmas": [
"790:308",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"790:292": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"790:309",
0
],
"negative": [
"790:307",
1
],
"positive": [
"790:307",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"790:294": {
"class_type": "ResizeImagesByLongerEdge",
"inputs": {
"images": [
"790:297",
0
],
"longer_edge": 1536
},
"_meta": {
"title": "Resize Images by Longer Edge (DEPRECATED)"
}
},
"790:295": {
"class_type": "LTXVLatentUpsampler",
"inputs": {
"samples": [
"790:309",
0
],
"upscale_model": [
"790:786",
0
],
"vae": [
"790:788",
2
]
},
"_meta": {
"title": "LTXVLatentUpsampler"
}
},
"790:296": {
"class_type": "LTXVImgToVideoInplace",
"inputs": {
"bypass": [
"790:305",
0
],
"image": [
"790:334",
0
],
"latent": [
"790:295",
0
],
"strength": 1,
"vae": [
"790:788",
2
]
},
"_meta": {
"title": "LTXVImgToVideoInplace"
}
},
"790:297": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"666",
0
],
"resize_type": "scale dimensions",
"resize_type.crop": "center",
"resize_type.height": [
"790:324",
0
],
"resize_type.width": [
"790:330",
0
],
"scale_method": "lanczos"
},
"_meta": {
"title": "Resize Image/Mask"
}
},
"790:298": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_ancestral_cfg_pp"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"790:299": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/2",
"values.a": [
"790:330",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"790:301": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a/2",
"values.a": [
"790:324",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"790:302": {
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"batch_size": 1,
"height": [
"790:301",
1
],
"length": [
"790:329",
1
],
"width": [
"790:299",
1
]
},
"_meta": {
"title": "Empty LTXV Latent Video"
}
},
"790:303": {
"class_type": "LTXVAudioVAEDecode",
"inputs": {
"audio_vae": [
"790:785",
0
],
"samples": [
"790:311",
1
]
},
"_meta": {
"title": "LTXV Audio VAE Decode"
}
},
"790:304": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a",
"values.a": [
"790:323",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"790:305": {
"class_type": "PrimitiveBoolean",
"inputs": {
"value": False
},
"_meta": {
"title": "Switch to Text to Video?"
}
},
"790:306": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"790:789",
0
],
"text": [
"790:319",
0
]
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"790:307": {
"class_type": "LTXVConditioning",
"inputs": {
"frame_rate": [
"790:304",
0
],
"negative": [
"790:314",
0
],
"positive": [
"790:306",
0
]
},
"_meta": {
"title": "LTXVConditioning"
}
},
"790:308": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"790:309": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"790:291",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"790:310": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"790:290",
0
],
"latent_image": [
"790:287",
0
],
"noise": [
"790:285",
0
],
"sampler": [
"790:288",
0
],
"sigmas": [
"790:289",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"790:311": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"790:310",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"790:312": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"790:303",
0
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"790:304",
0
],
"images": [
"790:316",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"790:314": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"790:789",
0
],
"text": "pc game, console game, video game, cartoon, childish, ugly"
},
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"790:315": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"790:791",
0
],
"negative": [
"790:307",
1
],
"positive": [
"790:307",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"790:316": {
"class_type": "VAEDecodeTiled",
"inputs": {
"overlap": 64,
"samples": [
"790:311",
0
],
"temporal_overlap": 4,
"temporal_size": 4096,
"tile_size": 768,
"vae": [
"790:788",
2
]
},
"_meta": {
"title": "VAE Decode (Tiled)"
}
},
"790:319": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": [
"754",
0
]
},
"_meta": {
"title": "Prompt"
}
},
"790:323": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 24
},
"_meta": {
"title": "Frame Rate"
}
},
"790:324": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 720
},
"_meta": {
"title": "Height"
}
},
"790:325": {
"class_type": "LTXVImgToVideoInplace",
"inputs": {
"bypass": [
"790:305",
0
],
"image": [
"790:334",
0
],
"latent": [
"790:302",
0
],
"strength": 0.7,
"vae": [
"790:788",
2
]
},
"_meta": {
"title": "LTXVImgToVideoInplace"
}
},
"790:326": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"790:327",
0
],
"video_latent": [
"790:325",
0
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"790:327": {
"class_type": "SetLatentNoiseMask",
"inputs": {
"mask": [
"790:333",
0
],
"samples": [
"790:328",
0
]
},
"_meta": {
"title": "Set Latent Noise Mask"
}
},
"790:328": {
"class_type": "LTXVAudioVAEEncode",
"inputs": {
"audio": [
"790:332",
0
],
"audio_vae": [
"790:785",
0
]
},
"_meta": {
"title": "LTXV Audio VAE Encode"
}
},
"790:329": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a * b + 1",
"values.a": [
"790:331",
0
],
"values.b": [
"790:323",
0
]
},
"_meta": {
"title": "Math Expression"
}
},
"790:330": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 1280
},
"_meta": {
"title": "Width"
}
},
"790:331": {
"class_type": "PrimitiveFloat",
"inputs": {
"value": 9
},
"_meta": {
"title": "Duration"
}
},
"790:332": {
"class_type": "TrimAudioDuration",
"inputs": {
"audio": [
"771",
0
],
"duration": [
"790:331",
0
],
"start_index": 0
},
"_meta": {
"title": "Trim Audio Duration"
}
},
"790:333": {
"class_type": "SolidMask",
"inputs": {
"height": [
"790:324",
0
],
"value": 0,
"width": [
"790:330",
0
]
},
"_meta": {
"title": "Create Solid Mask"
}
},
"790:334": {
"class_type": "LTXVPreprocess",
"inputs": {
"image": [
"790:294",
0
],
"img_compression": 18
},
"_meta": {
"title": "LTXV Preprocess"
}
},
"790:785": {
"class_type": "LTXVAudioVAELoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load LTXV Audio VAE"
}
},
"790:786": {
"class_type": "LatentUpscaleModelLoader",
"inputs": {
"model_name": "ltx-2.3-spatial-upscaler-x2-1.1.safetensors"
},
"_meta": {
"title": "Load Latent Upscale Model"
}
},
"790:787": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-22b-distilled-lora-384.safetensors",
"model": [
"790:788",
0
],
"strength_model": 0.5
},
"_meta": {
"title": "Load LoRA"
}
},
"790:788": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load Checkpoint"
}
},
"790:789": {
"class_type": "LTXAVTextEncoderLoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors",
"device": "default",
"text_encoder": "gemma_3_12B_it_fp4_mixed.safetensors"
},
"_meta": {
"title": "Load LTXV Audio Text Encoder"
}
},
"790:791": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "LTX2.3_AudioReactiveV1.safetensors",
"model": [
"790:787",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)常见问答
Use 1.0–2.0 overall. Start at 1.4 for a stronger, more noticeable audio‑reactive effect and lower it if the motion feels too intense or stylization overrides the source image.
No. The GeminiNode helps auto‑format prompts, but you can disable/bypass it and connect a manual text prompt directly to the LTX 2.3 node’s prompt input if you prefer full control.
The Audio‑Reactive LoRA drives motion based on the audio’s energy/rhythm. It produces convincing beat‑aware visuals, but it’s not frame‑accurate editing. For tight cuts, adjust your audio segment and video duration/frame count and fine‑tune LoRA strength.
LoadImage typically accepts PNG/JPG and LoadAudio commonly supports WAV/MP3. SaveVideo outputs a standard video file (commonly MP4). If a format fails, convert your media to these common types.