LTX-2とは?

LTX-2 は、Lightricks が公開している 音声+動画を同時に生成できる拡散モデルです。


推奨設定値

  • 解像度
    • 640×640(1:1)
    • 768×512(3:2)
    • 704×512(4:3)
    • ※後処理で2倍にアップスケールするので、実際の出力は1280×1280になります
    • ※32の倍数である必要があります
  • FPS
    • 24 / 25 / 30
  • フレーム
    • 最大:257 frames(25fpsで約10秒)
    • 推奨:121–161(品質とメモリのバランス)
    • ※8n+1 になる必要があります

モデルのダウンロード

📂ComfyUI/
└── 📂models/
    ├── 📂checkpoints/
    │   └── ltx-2-19b-dev-fp8.safetensors
    ├── 📂latent_upscale_models/
    │   └── ltx-2-spatial-upscaler-x2-1.0.safetensors
    ├── 📂loras/
    │   └── ltx-2-19b-distilled-lora-384.safetensors
    └── 📂text_encoders/
        └── gemma_3_12B_it_fp8_scaled.safetensors

基本的な処理の流れ

Wan などに比べるとノード数が多いため複雑に感じるかもしれませんが、やっていることはこれだけです。

    1. text2video + audio
    • まずベースとなる動画(音声も)を生成します。
    1. Hires.fix(2段階目)
    • できた動画を 2 倍にアップスケールし、video2video でもう一度回してリファインします。
    • これをパスして直接デコードすることも出来ますが、品質的に、Hires.fixするのをオススメします。
    1. デコード
    • 動画と音声を別々にデコードして出力します。

text2video

  • LTX-2_text2video_V2.json
  • LTX-2_text2video.json

上で説明した基本的な処理に沿ってworkflowを組んでいきます。

  • 1, 2, 3 が 1段目
  • 4, 5 が Hires.fix
  • 6 が デコード です

1. 動画解像度・長さ・FPSの設定

生成したい動画と音声のパラメータをここで決めます。

  • EmptyLTXVLatentVideo / LTXV Empty Latent Audio に、解像度・フレーム数・FPS を入力します。
  • 推奨設定値 に従って設定してください。
  • 🚨後処理で解像度を 2 倍にします。
    • つまり、ここに設定する解像度は、作りたい動画の 半分 の値にしてください。

2. プロンプト

LTXシリーズの特徴ですが、プロンプトは多少こだわらないと大した動画が作れません。

  • とはいってもLLMの力を借りるほど細かいフォーマットが決まっているわけではありません。
  • 小説を書くように、生成したい動画を記述してみてください。
  • cf. Prompting Guide for LTX-2

3. サンプリング(1段目)

見慣れた KSampler ではないので少し複雑に見えますが、基本は「ステップ数と CFG を決めてサンプリングする」だけです。

  • この workflow では、20 steps / CFG 4.0 で 1段目を回しています。
  • LTXVScheduler という専用スケジューラーを使っています。
    • 動きとしてはlinear_quadraticに似たものですが、あまり気にしなくて大丈夫です。
  • LTX-2 は動画と音声を同時に扱うため、🟫LTXVConcatAVLatentで、動画 latent と音声 latent を 1 本にまとめます。

4. latent のアップスケール(x2)

動画latentの解像度を二倍にアップスケールします。

  • 専用のモデル (ltx-2-spatial-upscaler-x2)を使用します。

5. サンプリング(2段目 / video2video)

アップスケール後の latent を 短いステップでリファインします。

  • こちらでは4~8ステップで生成できるようになる distilled-loraを使用します。
    • 他のモデルでいうところの Lightning / Turbo のようなものだと考えてください。
    • この workflow では 3 steps で回しています。
    • これに合わせて、CFGは 1.0 に変更します。
  • Manual Sigma を使っているため少し分かりにくいですが、Simple 相当で考えるなら denoise = 0.47 前後に近い挙動です。

6. デコード

最後に、動画と音声をそれぞれデコードして書き出します。

  • latent を動画用 / 音声用に分け、適切なVAEでデコードします。
  • (VRAMに余裕が無いためTiled VAEを使っています。)

text2video 8ステップ

上ではHires.fixでのみ distilled-lora を使いましたが、1段目にも適用し、8ステップで高速に生成してみましょう。

  • LTX-2_text2video_distilled_V2.json
  • LTX-2_text2video_distilled.json

distilled-loraを適用するため、サンプリング設定をいくつか変更します。

  • CFG : 1.0
  • scheduler : Simple
  • steps : 8

20ステップ / 8ステップ distilled-lora比較

20ステップ
8ステップ(distilled-lora)

私が試した限りでは、distilled-lora を適用したほうが安定して生成できます。
そのため、速度アップを兼ねて以降のworkflowは全て 1段目からdistilled-loraを適用 していきます。


image2video

single-frame I2V

  • LTX-2_image2video_distilled_V2.json
  • LTX-2_image2video_distilled.json

基本は「1フレーム目を入力画像で固定して、残りを生成」です。

例えば 121フレームの動画を作るなら、ざっくりこういう流れになります。

(1) 121 frames の枠を作る(8n+1)
    [ 🌫️ 🌫️ 🌫️ 🌫️ 🌫️ ... 🌫️ ]

(2) 1フレーム目だけ入力画像で上書き
    [ 🖼️ 🌫️ 🌫️ 🌫️ 🌫️ ... 🌫️ ]

(3) 残りの120フレームを生成
    [ 🖼️ ✨ ✨ ✨ ✨ ... ✨ ]

🖼️ を起点に、後ろのフレーム(✨)が埋まっていくイメージです。

1. 入力画像のリサイズ(2系統作る)

  • まず、最終出力したい解像度に合わせた フル解像度版 を作ります。
    • 任意のサイズにリサイズ (ここでは1MP)。
    • 幅・高さは 64 の倍数にします。
      • 1段目は 1/2 解像度で回すため、半分にしても 32 の倍数になるように 64 の倍数にします。
  • つぎに、1段目(半解像度)用に、上の画像を 縦横 1/2 にした版も作ります。
    • EmptyLTXVLatentVideo には、この 半解像度側の width/height を入力します。

2. 画像の下処理

LTX-Videoからの特徴ですが、動画は静止画と違い、少し圧縮されて劣化しているため、綺麗すぎる画像を使うと、全く動かない動画が生成されることがあります。

  • これを回避するため、LTXVPreprocess でわざと動画の圧縮っぽく劣化させます。

3. LTXVImgToVideoInplace(1段目の差し込み)

ここが image2video の本体です。

  • 1段目(半解像度)の video latent に対して、1フレーム目を画像で差し込みます。

4. アップスケール側(2段目)にも同じことをする

2段目も同様に画像を差し込みます。

  • 必ずspatialノードの あと にこのノードを接続してください。
  • strengthは 1.0 にします。
    • これを小さくすると、差し込んだ画像自体も image2image されるような挙動になります。
    • 全体として馴染ませたいときはそれでも良いですが、 入力画像と1フレーム目を完全一致させたいなら 1.0 にします。

出力例

入力
入力
出力

既知の問題として、ほとんど画面が動かなかったり、ズームアウトするだけの動画になることがあります。
適切なプロンプトを使うことで多少マシになりますが、これを対策するための LoRA が登場したので紹介します。

link + workflow : LTX-2 Image2Video Adapter LoRa


multi-frame I2V

先ほどの image2video workflow は、入力として 1枚の画像 だけでなく 画像バッチ(=動画) も渡せます。
これを応用すると、任意の動画の末尾を「のりしろ」にして、その先を延長する workflow が作れます。

LTX-2_Extension_distilled.json

入力された動画の末尾数フレームを取得し、その続きを生成する、ということをします。

(1) 入力動画(=画像バッチ)
    [ 🖼️ 🖼️ 🖼️ 🖼️  ... 🖼️ 🖼️ 🖼️ ]

(2) 末尾から N frames を取る(N = 8n+1)
    [ 🖼️ 🖼️ 🖼️ 🖼️... 🖼️ 🖼️ 🖼️ ]
                      └─── N ───┘

(3) 121 frames の枠を作り、先頭に N frames を上書きして入れる
    [ 🖼️ 🖼️ 🖼️ 🌫️ 🌫️ 🌫️ ... 🌫️ ]
      └── N ──┘     

(4) 残り(121 - N frames)を生成して続きを作る
    [ 🖼️ 🖼️ 🖼️ ✨ ✨ ✨ ... ✨ ]

(5) 先頭の N frames を削除(元動画末尾と重複するため)
    [ ✨ ✨ ✨ ... ✨ ]
    
(6) 元の動画 + 続きを結合
    [ 🖼️ 🖼️ 🖼️ ... 🖼️] + [ ✨ ✨ ✨ ... ✨ ]

1. 末尾の画像バッチ取得

入力動画の末尾から、のりしろとなる画像バッチを取得します。

  • Get Image or Mask Range From Batchnum_frames に任意の枚数を入力します(8n+1 の縛りあり)。
  • N を増やすほど元動画の動きや雰囲気を引き継ぎやすくなります。
  • ただし、生成する区間は 121 - N frames になるので、N を増やすほど「続き」は短くなります。

2. 生成した動画と元の動画を結合

生成結果には、先頭に「のりしろ(元動画末尾 N frames)」が含まれていますが、この部分は元動画と重複するので、結合前に削除します。

  • 生成した動画の先頭 N frames を削除(この例では 25 frames)
  • 元の動画の末尾に結合

出力例

入力
出力

audio2video

LTX-2 は「動画+音声」を同時に扱うモデルなので、音声を入力として渡して 音に引っ張られた動画 を作る構成もできます。

  • LTX-2_audio2video_distilled_V2.json
  • LTX-2_audio2video_distilled.json
  • Trim Audio Duration で音声を適当な長さにトリミング
  • 音声をエンコードして、LTXVConcatAVLatent に接続します。
  • 二段目の LTXVConcatAVLatent にも接続します。
  • 出力動画には、入力音声をそのまま使います(生成音声は使いません)。

🚨音声の長さが生成する動画の長さより 短い 場合、音声条件が効きません。音と無関係な動画が生成されます。
無音でもいいので生成する動画の長さより余計に長くしておく必要があります。

ここに Set Latent Noise Mask を使うworkflowも見かけますが、あってもなくても同じ結果になります。

出力例


audio-image2video

上2つを組み合わせることも出来ます。
顔画像に喋っている音声を組み合わせれば、talking headのようなことも出来ます。やってみましょう。

  • LTX-2_audio-image2video_distilled_V2.json
  • LTX-2_audio-image2video_distilled.json
  • audio2video / image2video この 2 つのworkflowを組み合わせるだけです。

出力例

入力
入力
出力

実はあまりセリフに動画が追従しなかったため、プロンプトにセリフを入れています。もっと良いworkflowがあるかもしれません。


video2audio

audio2video の逆で、動画を入力して それに合う音(効果音や環境音) を生成することもできます。

このタスクは安定しません。おそらく改良が必要です。

LTX-2_video2audio_distilled.json

出力例

※音が大きいので注意してください。


Temporal inpainting

時間方向の inpainting(=動画の一部だけ作り直す)です。VACE Extensionのようなものですね。

LTX-2_temporal-inpainting_distilled.json

基本は video2video です。
動画のうち「作り直したい時間範囲」だけをマスクし、その区間だけを再生成してもらいます。

(1) 入力動画(= 既存の video latent)
    [ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ 🖼️ ]

(2) 作り直したい区間を指定(start_time ~ end_time)
    例: 2.0s ~ 4.0s
    [ 🖼️ 🖼️ | 🖼️ 🖼️ 🖼️ | 🖼️ 🖼️ 🖼️ ]
             ^           ^
         start_time   end_time

(3) 指定区間だけマスクを立てる
    [   0    0 |  1   1   1 |  0   0   0  ]
               └─── Mask ───┘

(4) マスク区間だけ再生成
    [ 🖼️ 🖼️ | ✨ ✨ ✨ | 🖼️ 🖼️ 🖼️ ]
             └─ inpaint ─┘

仕組み上、二段階 workflow(低解像度 → Hires.fix)を組みにくいため、最初から 1.5MP で生成しています。

1. LTXVAudioVideoMask

inpainting したい時間範囲を指定します。

  • video_fps:基本的には入力動画と同じ fps にします
  • video_start_time : inpainting 開始(秒)
  • video_end_time : inpainting 終了(秒)
  • audio_start_time / audio_end_time:基本は video と同じにしますが、ずらすことで「音は保ったまま映像だけ編集」「映像は保ったまま音だけ編集」もできます

延長もできる

end_time を 入力動画の長さより後ろに指定すると、はみ出した部分は新規生成され、結果として動画が延長されます。 例:入力が「2秒」なら

  • 2.0s → 5.0s を作り直す(= 2秒以降を新規生成して延長する)
  • start_time = 2.0 / end_time = 5.0

出力例

入力
出力

IC-LoRA

IC-LoRA は、ポーズや深度マップ、エッジなどの 制御信号から動画を作ります。

モデルのダウンロード

📂ComfyUI/
└── 📂models/
    └── 📂loras/
        ├── ltx-2-19b-ic-lora-canny-control.safetensors
        ├── ltx-2-19b-ic-lora-depth-control.safetensors
        ├── ltx-2-19b-ic-lora-detailer.safetensors
        └── ltx-2-19b-ic-lora-pose-control.safetensors

IC-LoRA (Pose)

text2video の workflow をベースに、ControlNet のような制御用の動画入力を追加します。

  • LTX-2_IC-LoRA(Pose)_distilled_V2.json
  • LTX-2_IC-LoRA(Pose)_distilled.json

1. 制御動画のリサイズ

生成する動画と同じ比率・解像度に揃えます。

  • 任意のサイズにリサイズ (ここでは1.5MP)。
  • 幅・高さは 64 の倍数にします。
  • EmptyLTXVLatentVideo に、 縦横 1/2 にした画像の width/height を入力します。

2. ポーズ画像の生成

動画から棒人間の画像を作ります。

  • OpenPose や DWPose でポーズを抽出

3. LTXVAddGuide

制御信号(ポーズ動画)を conditioning に入れます。

  • LTXVAddGuide に、先ほど作ったポーズ動画を入力します。

4. IC-LoRAの適用

IC-LoRA (今回はPose) を適用してサンプリングします。

  • IC-LoRA は strength = 1.0 を前提に設計されています。
  • この workflow では 1段目のサンプリングだけ IC-LoRA を適用しています。
    • 2段目はリファインに専念させたほうがキレイな動画になります。

5. LTXVCropGuides

1段目が終わったあと、一度デコードしてみると分かりやすいんですが、生成した動画に先程作ったポーズ動画が混ざっています。

これがまさにIC-LoRAの仕組みですが、出力には不要なものなので、2段目に入る前に削除します。

  • LTXVCropGuidesは、latent / conditioning から 制御画像 を取り除くためのノードです。

ポーズ画像・IC-LoRAを、Canny / Depth へ変更すれば同じように使えます。
注意点として、基本1種類の使用が推奨されています。(Pose と Depth を同時に適用したりするのは非推奨です。)

出力例

入力
出力

IC-LoRA (Pose) + image2video

複数IC-LoRAを重ねることは出来ませんが、image2videoやaudio2videoと組み合わせることはできます。

  • LTX-2_IC-LoRA(Pose)_image2video_distilled_V2.json
  • LTX-2_IC-LoRA(Pose)_image2video_distilled.json

やっていることは、上の IC-LoRA (Pose) と image2video を合体させただけです。

  • 注意点として、LTXVAddGuideLTXVImgToVideoInplaceあと に接続します。
    • 逆だと制御が効きません。
  • これはあくまで image2video であり、VACE のような reference2video ではありません
    • 入力画像は「1フレーム目として固定される画像」なので、ポーズ動画の1フレーム目と大きくズレると期待通りの動画になりません。
    • 事前に ControlNet や Qwen-Image-Edit などで「ポーズ1フレーム目に寄せた画像」を作りましょう。

出力例

入力
出力

IC-LoRA (Detailer)

IC-LoRA (Detailer)は、低解像度の動画のディテールや質感を修復します。

カスタムノードのインストール

  • ComfyUI-LTXVideo

  • コアノードだけでも動かすこと自体はできますが、大きな解像度・長時間動画を扱うためにはカスタムノードが必要です。

  • LTX-2_IC-LoRA(Detailer)_V2.json
  • LTX-2_IC-LoRA(Detailer).json

基本は IC-LoRA(Detailer) を適用した video2video です。

  • 🟦 先に、入力動画を 最終的に欲しいサイズ にリサイズします。
  • SamplerCustomAdvanced の代わりに 🅛🅣🅧 LTXV Looping Sampler を使います。
    • これはUltimate SD upscaleのように時間・空間をタイルに分けて処理するため、VRAM 節約をすることができます。
    • この workflow では 時間方向だけ タイリングしています。
  • 蒸留LoRAを使っていませんが、3 ステップで生成します。

出力例

入力
出力

参考