問題の概要:AnimateDiffによる動画生成時のフレーム制御エラー
ComfyUIのAnimateDiffを使用して動画を生成する際、特に長い動画や特定のフレーム数を指定した場合に、以下のような問題が頻繁に発生します。
- 指定したフレーム数(例:64フレーム)で生成したはずが、実際の出力動画はそれより短い(例:16フレーム)
- 動画が途中でループせず、不自然に終了する
- エラーメッセージは表示されないが、期待通りの動画が生成されない
- ワークフローを実行しても、
AnimateDiff Loaderノードの設定が反映されていないように見える
これらの問題は、AnimateDiffの内部的なフレーム制御メカニズムと、ComfyUIのノード設定の相互作用を理解していないことが主な原因です。初心者から中級者までが陥りやすい落とし穴となっています。
原因の解説:フレーム制御の多重構造
AnimateDiffでの動画生成におけるフレーム制御問題は、主に以下の3つの要素が複雑に絡み合うことで発生します。
1. Context Lengthとビデオ長の不一致
AnimateDiff Loaderノードにはcontext_lengthというパラメータがあります。これは、AnimateDiffモデルが一度に処理する「コンテキストウィンドウ」のフレーム数を指します。多くのプリトレインモデルでは、この値が16や24などに固定されています。たとえ後段のノードでより長いフレーム数を指定しても、このcontext_lengthを超える連続性をモデルは学習しておらず、結果として動画が分割されたり、ループ設定が機能しなくなったりします。
2. ループ設定の不適切な適用
長い動画を生成する場合、context_lengthの制限を超えるフレームを生成するために「ループ」設定が使用されます。しかし、AnimateDiff Loaderのloopオプションと、動画保存ノード(VHS_VideoCombineなど)でのフレーム連結設定が矛盾していることが多々あります。これにより、意図した通りのスムーズなループ動画が生成されません。
3. サンプラーステップとフレーム生成の関係
ComfyUIの標準的な画像生成ノード(KSamplerなど)は、本質的には静止画生成のために設計されています。AnimateDiffはこれを拡張して動画を生成しますが、サンプラーのステップ数と生成フレーム数が独立したパラメータとして存在するため、設定が複雑化します。特に、batch_sizeの設定を誤ると、フレーム生成が期待通りに行われません。
解決方法:ステップバイステップでのフレーム制御
ステップ1:使用モデルに適したContext Lengthの確認と設定
まず、使用しているAnimateDiffモデルが対応しているcontext_lengthを確認します。一般的なプリトレインモデルでは以下の値がよく使われます。
- mm_sd_v15_v2.ckpt: context_length = 16
- mm_sd_v15_v2.ckpt (拡張設定): context_length = 24
- temporal-diffusion系モデル: モデルにより異なる
AnimateDiff Loaderノードで、この値を正しく設定することが第一歩です。
ステップ2:ワークフロー内でのフレーム数指定の統一
ComfyUIワークフロー内でフレーム数を指定する場所は複数あります。これらを統一しないと矛盾が発生します。
- AnimateDiff Loader:
context_lengthを設定 - Empty Latent Imageノード: バッチサイズとしてフレーム数を設定(ここが実際の生成フレーム数となる)
- 動画結合ノード (VHS_VideoCombineなど): 入力フレーム数とFPSを設定
推奨される設定手順は以下の通りです。
ステップ3:長い動画生成のためのループ設定
context_length(例:16)より長いフレーム数(例:64)の動画を生成したい場合、以下の設定が必要です。
AnimateDiff Loaderノードでloopオプションを有効化(チェックを入れる)AnimateDiff Loaderのcontext_lengthをモデル対応値(例:16)に設定Empty Latent Imageノードのバッチサイズを目標フレーム数(例:64)に設定closed_loopオプションの必要性を検討(動画の最後と最初をスムーズにつなげたい場合)
ステップ4:サンプラー設定の最適化
動画生成では、フレーム間の一貫性が重要です。以下のサンプラー設定を推奨します。
- Sampler:
dpmpp_2mまたはeuler_ancestral(一貫性が高い) - Scheduler:
karrasまたはsimple - Steps: 20〜30(動画生成は静止画より若干多めのステップが安定)
- CFG Scale: 7〜10(高すぎるとフレーム間で激しく変動)
コード例・コマンド例
正しいワークフロー設定の例(64フレーム動画生成)
以下は、context_length=16のモデルで64フレームの動画を生成するための、主要ノードの設定例です。
# AnimateDiff Loader ノードの設定例
{
"inputs": {
"model": "(Stable Diffusionモデル)",
"latent": "(Empty Latent Imageからの接続)",
"model_name": "mm_sd_v15_v2.ckpt",
"context_length": 16,
"loop": true,
"closed_loop": false,
"frame_rate": 8,
"start_percent": 0,
"end_percent": 1
}
}
# Empty Latent Image ノードの設定例
{
"inputs": {
"width": 512,
"height": 512,
"batch_size": 64 # ここが実際の生成フレーム数
}
}
# VHS_VideoCombine ノードの設定例(ComfyUI-VideoHelperSuite使用時)
{
"inputs": {
"frames": "(生成されたフレーム群)",
"frame_rate": 8,
"loop_count": 0, # 0=ループなし、1以上=ループ回数
"filename_prefix": "animated_output",
"format": "video/h264-mp4"
}
}
よくある間違いとその修正例
間違い例: context_lengthを目標フレーム数と同じ64に設定してしまう。
# 間違い
"context_length": 64, # モデルが対応していない値を設定
"loop": false, # ループ無効
# 結果: 最初の16フレームのみ正常、以降は破綻した動画に
修正例: モデル対応値に設定し、ループを有効化。
# 修正後
"context_length": 16, # モデル対応値
"loop": true, # ループ有効
# 結果: 64フレーム全体がスムーズに生成
トラブルシューティング用カスタムノードの導入
より高度な制御が必要な場合、以下のカスタムノードの導入を検討してください。
- AnimateDiff Evolved: より詳細なフレーム制御オプションを提供
- Frame Interpolationノード: 生成フレーム間を補間して滑らかに
- Batch Managerノード: 大規模なバッチ処理を効率化
これらのノードは、ComfyUI Managerを通じて簡単にインストールできます。
まとめ・補足情報
ComfyUIのAnimateDiffで安定した動画生成を行うには、context_length、loop設定、およびワークフロー全体でのフレーム数指定の一貫性が不可欠です。特に、使用するモデルの仕様を理解し、その制限内でどのように長い動画を構築するかを設計することが成功の鍵となります。
追加のヒント:
- テストは短いフレーム数から: まずは16フレームなど短い動画でワークフローをテストし、問題がないことを確認してからフレーム数を増やしましょう。
- メモリ管理: 長い動画生成はVRAMを大量に消費します。バッチサイズを調整するか、
--lowvramオプションでComfyUIを起動することを検討してください。 - キャッシュのクリア: 設定を変更しても挙動が変わらない場合、ComfyUIのキャッシュ(
comfyui/web`フォルダ内)をクリアすると解決することがあります。 - モデルの互換性: AnimateDiffモデルとStable Diffusionモデルのバージョン互換性に注意してください。v1.5モデル用とv2.xモデル用は一般に互換性がありません。
これらのポイントを押さえることで、AnimateDiffを用いた高品質な動画生成の成功率が大幅に向上します。動画生成は多くのパラメータが関わる複雑なプロセスですが、体系的なアプローチで確実に問題を解決していきましょう。