問題の概要:AnimateDiffで動画生成時のフレーム制御エラー
ComfyUIの強力な動画生成拡張機能「AnimateDiff」を使用する際、生成される動画のフレーム数が想定と異なったり、動画が正常に生成されなかったりする問題が頻発します。具体的には、以下のようなエラーや不具合に遭遇することがあります。
- 設定したフレーム数(例:16フレーム)で生成したはずが、出力される動画は8フレームや32フレームなど、異なる長さになってしまう。
- 動画ファイルは生成されるが、中身が真っ黒だったり、最初の1フレームしか表示されない。
- エラーメッセージが表示され、プロセスが途中で停止する。
Error occurred when executing AnimateDiffLoader: 'latent_format' キーが存在しません または RuntimeError: The size of tensor a (16) must match the size of tensor b (8) at non-singleton dimension 0 - 動画の動きがカクつく、またはフレーム間の補間がうまくいかず、内容が大きく飛躍してしまう。
これらの問題は、AnimateDiffの複雑なワークフローと、複数のノード間でのフレーム数設定の不一致が主な原因です。初心者だけでなく、中級者でも設定を見落としがちなポイントがいくつか存在します。
原因の解説:なぜフレーム制御がうまくいかないのか?
AnimateDiffにおけるフレーム制御の問題は、主に以下の4つの原因に集約されます。
1. 複数ノード間でのフレーム数設定の不一致
AnimateDiffワークフローでは、少なくとも3つの場所でフレーム数を設定する必要があります。
- AnimateDiff Loaderノード: 動きのモデル自体の設定。
- 空のLatent(潜在変数)生成ノード: 動画の「土台」となる潜在変数のバッチサイズ。
- 動画保存ノード(Save Animated WEBP/PNG等): 出力時のフレーム数指定。
これらの数値が一致していない場合、Tensorの次元不一致エラーが発生したり、フレームが切り捨てられたり、余分なフレームが生成されたりします。
2. サンプラー(Sampler)のステップ数とContext Lengthの関係
AnimateDiffモデルには「Context Length」という概念があります。これは、モデルが一度に処理できる最大フレーム数のことです(例:16, 24, 32)。生成したいフレーム数がこのContext Lengthを超える場合、特別な設定(後述の「ビデオ長延長」設定)が必要になります。これを無視すると、指定したフレーム数まで生成されません。
3. カスタムノードやモデルのバージョン互換性
AnimateDiffは開発が活発で、カスタムノード(e.g., AnimateDiff Evolved, AnimateDiff-CLIP)や様々なモーションモデル(mm_sd_v14, mm_sd_v15_v2など)が存在します。使用するノードのバージョンとモーションモデルのバージョン、さらにはComfyUIマネージャー自体のバージョンが互換性がないと、フレーム関連のエラーが発生します。
4. メモリ不足によるサイレントエラー
フレーム数を多く設定しすぎると、GPUメモリが不足します。ComfyUIはメモリ不足時に明確なエラーを出さず、真っ黒な動画を出力したり、最初の数フレームだけ処理して止まったりすることがあります。これはエラーメッセージがないため、特に原因の特定が難しい問題です。
解決方法:ステップバイステップでのフレーム制御
以下、確実に希望通りのフレーム数で動画を生成するための設定手順を説明します。
ステップ1:基本設定の統一(最も重要)
ワークフロー内の以下の3つの数値を必ず一致させてください。
- Empty Latent Imageノード: 「Batch Size」を生成したいフレーム数に設定します。ここが動画の長さの根源です。
Batch Size = 16 # 16フレームの動画を生成したい場合 Width = 512 Height = 512 - AnimateDiff Loaderノード: 「context_length」を上記のBatch Sizeと同じ値に設定します。モデルが16フレーム用(mm_sd_v15)なら、ここも16に。
model: mm_sd_v15.ckpt context_length: 16 - Save Animated WEBP/PNGノード: 「frame_rate」は好みで設定しますが、「frames」の数がBatch Sizeと同じか、それを超えないようにします。通常は同じ値を設定します。
frames: 16 frame_rate: 8
ステップ2:長い動画(Context Length超え)を生成する場合
32フレームなど、使用するモーションモデルのContext Length(例:16)を超える動画を作りたい場合は、AnimateDiff Loaderノードの「ビデオ長延長」設定を有効にします。
- AnimateDiff Loaderノードで「enable_length_extension」を有効(チェック)にします。
- 「context_length」はモデルの基本値(例:16)のままにします。
- 「length」を生成したい総フレーム数(例:32)に設定します。
model: mm_sd_v15.ckpt context_length: 16 # モデルの基本値 enable_length_extension: True length: 32 # 生成したい総フレーム数 - Empty Latent Imageノードの「Batch Size」もこの総フレーム数(32)に合わせます。
ステップ3:モーションモデルとノードのバージョン確認
エラーが解消しない場合は、環境の整合性を確認します。
# ComfyUIマネージャーでカスタムノードを更新
# 1. ComfyUIフォルダ内でターミナルを開く
cd ComfyUI/custom_nodes
# 2. AnimateDiff関連ノードを更新(例:AnimateDiff Evolvedを使用している場合)
cd ComfyUI-AnimateDiff-Evolved
git pull
# 3. モーションモデルが正しいパスにあるか確認
# 通常は ComfyUI/models/animatediff/ 以下に .ckpt ファイルがある
使用するモーションモデル(.ckptファイル)と、AnimateDiff Loaderノードが対応しているバージョンかを確認してください。古いワークフローを読み込んだ場合、ノードが新しいモデル形式に対応していない可能性があります。
ステップ4:メモリ不足の対処
フレーム数を増やすとメモリ使用量が直線的に増加します。対策として:
- 生成解像度(Width, Height)を下げる(768×768 → 512×512)。
- バッチサイズ(フレーム数)を一旦減らして試す(32 → 16)。
- ComfyUI起動時に低メモリモードを指定する(可能な場合)。
- AnimateDiff Loaderの「frame_rate」を下げることで、処理負荷を軽減できる場合があります(品質には影響)。
コード例・ワークフロー例
以下は、16フレームの動画を正常に生成するための、主要ノード設定の擬似コード表現です。
# 1. Empty Latent Image ノード
{
"batch_size": 16,
"height": 512,
"width": 512
}
# 2. AnimateDiff Loader ノード (基本設定)
{
"model": "mm_sd_v15.ckpt",
"context_length": 16,
"enable_length_extension": False, # 16フレーム以内ならFalse
"length": 16
}
# 3. Sampler (KSampler) ノード
# ここは通常通り。ステップ数などは画像生成と同様。
{
"steps": 20,
"cfg": 8.0,
"sampler_name": "euler",
"scheduler": "normal"
}
# 4. Save Animated WEBP ノード
{
"filename_prefix": "AnimateDiff_Output",
"frames": 16, # Empty Latentのbatch_sizeと一致
"frame_rate": 8,
"lossless": True,
"quality": 90
}
また、長い動画(例:32フレーム)を生成する場合のAnimateDiff Loader設定は以下のようになります。
# AnimateDiff Loader ノード (長尺設定)
{
"model": "mm_sd_v15.ckpt", # Context Lengthが16のモデル
"context_length": 16, # モデルの基本値はそのまま
"enable_length_extension": True, # 延長機能をON
"length": 32 # 最終的に欲しいフレーム数
}
# この場合、Empty Latent Imageのbatch_sizeも32に設定する。
まとめ・補足情報
ComfyUIのAnimateDiffでフレーム制御に問題が発生した場合、まずは「Empty Latent ImageのBatch Size」、「AnimateDiff Loaderのcontext_length(とlength)」、「保存ノードのframes」の3点が一致しているかを徹底的に確認してください。これだけで9割の問題は解決します。
追加のTips:
- テストは短いフレーム数から: 新しいワークフローやモデルを試す際は、まずフレーム数4や8で動作確認し、成功したらフレーム数を増やしていきましょう。
- プロンプトの影響: 動画の滑らかさは、プロンプト(特に動きに関する記述)にも大きく依存します。「slow pan left」、「gentle zoom in」など、具体的な動きの指示を入れると良い結果が得られやすいです。
- ControlNetとの併用: AnimateDiffにControlNet(Depth, OpenPose等)を組み合わせると、動きの制御が格段に向上します。この場合、ControlNet適用ノードにもフレーム数(Batch Size)の設定がある場合があるので注意が必要です。
- キャッシュのクリア: 不可解なエラーが続く場合は、ComfyUIのブラウザキャッシュ(Shift+F5またはCtrl+Shift+R)をクリアし、再読み込みしてみてください。古いノード定義が残っていることが原因の場合があります。
AnimateDiffは設定項目が多く、最初は戸惑うかもしれませんが、一度基本の流れを理解すれば、安定して思い通りの長さの動画を生成できるようになります。フレーム制御はその最も基礎かつ重要な部分です。本記事の手順を参考に、問題の解決と理想的な動画生成をお役立ていただければ幸いです。