【ComfyUI】AnimateDiffで動画生成時にフレーム数がおかしい・動かない問題の解決法

問題の概要: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つの場所でフレーム数を設定する必要があります。

  1. AnimateDiff Loaderノード: 動きのモデル自体の設定。
  2. 空のLatent(潜在変数)生成ノード: 動画の「土台」となる潜在変数のバッチサイズ。
  3. 動画保存ノード(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つの数値を必ず一致させてください。

  1. Empty Latent Imageノード: 「Batch Size」を生成したいフレーム数に設定します。ここが動画の長さの根源です。
    Batch Size = 16  # 16フレームの動画を生成したい場合
    Width = 512
    Height = 512
    
  2. AnimateDiff Loaderノード: 「context_length」を上記のBatch Sizeと同じ値に設定します。モデルが16フレーム用(mm_sd_v15)なら、ここも16に。
    model: mm_sd_v15.ckpt
    context_length: 16
    
  3. Save Animated WEBP/PNGノード: 「frame_rate」は好みで設定しますが、「frames」の数がBatch Sizeと同じか、それを超えないようにします。通常は同じ値を設定します。
    frames: 16
    frame_rate: 8
    

ステップ2:長い動画(Context Length超え)を生成する場合

32フレームなど、使用するモーションモデルのContext Length(例:16)を超える動画を作りたい場合は、AnimateDiff Loaderノードの「ビデオ長延長」設定を有効にします。

  1. AnimateDiff Loaderノードで「enable_length_extension」を有効(チェック)にします。
  2. 「context_length」はモデルの基本値(例:16)のままにします。
  3. 「length」を生成したい総フレーム数(例:32)に設定します。
    model: mm_sd_v15.ckpt
    context_length: 16  # モデルの基本値
    enable_length_extension: True
    length: 32  # 生成したい総フレーム数
    
  4. 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:メモリ不足の対処

フレーム数を増やすとメモリ使用量が直線的に増加します。対策として:

  1. 生成解像度(Width, Height)を下げる(768×768 → 512×512)。
  2. バッチサイズ(フレーム数)を一旦減らして試す(32 → 16)。
  3. ComfyUI起動時に低メモリモードを指定する(可能な場合)。
  4. 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は設定項目が多く、最初は戸惑うかもしれませんが、一度基本の流れを理解すれば、安定して思い通りの長さの動画を生成できるようになります。フレーム制御はその最も基礎かつ重要な部分です。本記事の手順を参考に、問題の解決と理想的な動画生成をお役立ていただければ幸いです。

この記事は役に立ちましたか?