1. ComfyUIの基本操作とカスタムノードの準備 [0]

thumbnail ComfyUIは、ノードを繋ぎ合わせて機能を拡張していくことで、テキストからの動画生成や顔の入れ替えまで実現できる高機能なツールである。

1.1. ComfyUIの基本とカスタムノードのインストール [12]

  1. ComfyUIの基本操作とワークフローの組み方 [0]

    • 前回はComfyUIの準備と基本操作を説明し、今回はワークフローの組み方を説明する。[0]
    • 高機能なComfyUIを用いて、プロンプトからの動画生成、動画から動画への変換、フレーム補間、顔の入れ替えまでを行う。[2]
    • ComfyUIの特徴は、必要な機能をノードとして追加し、できることを増やしていく点にある。[5]
  2. 必要なカスタムノードのインストール [14]

    • 動画生成や顔の入れ替えに必要となるカスタムノードを事前に集めてインストールする。[14]
    • インストールする主なカスタムノードは以下の通りである。[21]
      • ComfyUI Managerから検索し、インストールする。[20]
      • ComfyUI Video Helper Suite (既にインストール済みの場合はスキップ) [18]
      • Comfy ControlNet Preprocessors [21]
      • ComfyUI Frame Interpolation [21]
      • UI Advanced ControlNet [21]
      • AnimateDiff UI [21]
      • Reactor [21]
    • カスタムノードが不足している状態でワークフローを読み込むと、エラーが表示されることがある。[24]
    • 「Install Missing Custom Nodes」機能もあるが、未知のノードがインストールされる可能性があるため推奨されない。[25]
  3. カスタムノードのインストールエラーへの対処 [26]

    • Reactorのインストールに失敗した場合、一度ComfyUIを閉じ、GitHubのトラブルシューティングを確認する。[27]
    • Pythonのバージョンを確認し、最新化してからInsightfaceを再インストールする。[32]
    • BasicSRも再インストールする。[34]
    • Pythonのインストールディレクトリに移動し、コマンドプロンプトでバージョンを確認する(例: 3.11系)。[36]
    • 必要なパッケージをダウンロードし、Pythonのエンベリフォルダーに配置する。[38]
    • コマンドプロンプトでパッケージのバージョンアップとインストールを実行する。[42]
    • OpenCVでエラーが発生した場合も、同様にトラブルシューティングを行う。[43]
    • Pythonエンベリフォルダーで、現在のOpenCVをアンインストールし、指定されたバージョンを再インストールする。[46]
    • これらの対処により、エラーが解消される。[49]

1.2. モデルのダウンロードと配置 [51]

  1. ワークフローに必要なモデルの準備 [51]

    • カスタムノードのインストール後、モーションモデルとControlNetのモデルをダウンロードして配置する。[51]
    • 今回のワークフローで必要となるモデルは以下の通りである。[52]
      • V3モーションモデル [52]
      • LoRA [52]
      • ControlNetのOpenPose [52]
      • ControlNetのDepth [53]
  2. 各モデルのダウンロードと配置手順 [56]

    • V3モーションモデル (V3 SD15 MM): ComfyUI Managerから「Install Models」を選択し、検索してインストールする。[56]
    • LoRA (V3 SD15 Adapter): 同様に「Install Models」から検索してインストールする。[57]
    • ControlNetモデル (OpenPose, Depth): Hugging Faceなどの配布元からダウンロードする。[59]
    • ダウンロードしたControlNetモデルは、ComfyUIの「models/controlnet」フォルダーに配置する。[60]
    • ControlNetのプリプロセッサーは、初回使用時に自動でダウンロードされる。[62]

2. テキストからの動画生成ワークフローの構築 [63]

thumbnail テキストプロンプトから動画を生成するために、基本的なワークフローにアニメーション関連のノードを追加し、出力形式を動画に変更する。

2.1. 基本ワークフローの読み込みと改造 [64]

  1. サンプルワークフローの読み込み [64]

    • まず、説明欄にあるJSONリンクからサンプルのワークフローをダウンロードする。[65]
    • ダウンロードしたJSONファイルをComfyUIにドラッグ&ドロップすると、グラフが表示される。[66]
    • このワークフローは、テキストから静止画を生成するように組まれている。[68]
  2. 動画生成のためのワークフロー改造 [69]

    • 静止画生成ワークフローを動画生成用に改造する。[68]
    • AnimateDiffノードを追加し、ロードチェックポイントの後にLoRAノードを挟むためのスペースを作成する。[71]
    • これにより、「Loader」ノードが2つ追加される。[71]
    • クリップの流れを新しく繋ぎ直し、モデルのルートも変更する。[72]
    • 静止画出力用の「Save Image」ノードを削除し、代わりに動画出力用の「Video Combine」ノードを追加する。[78]
    • 「Video Combine」ノードにイメージを繋ぐことで、動画生成のリンクが完成する。[80]

2.2. パラメーター設定と動画生成 [81]

  1. 動画生成パラメーターの設定 [81]

    • ワークフローのリンクが完成したら、各ノードのパラメーターを設定する。[81]
    • LoRA: V3動画生成用のLoRAを使用し、強度は1に設定する。[82]
    • AnimateDiff: モデルはV3モデルを選択し、ベータスケジュールは「Square Root」から「Linear」に変更する。[84]
    • V2モデルズプロンプトは無効にし、エンティティレートイメージも変更する。[85]
    • バッチサイズを動画のフレーム数として設定する(例: 16)。[86]
    • Video Combine: 保存ファイル名を日付に変更する。[87]
    • フォーマットがGIFアニメになっている場合は、H.264動画に変更する。[89]
  2. 動画生成の実行 [92]

    • プロンプトを入力し、生成を実行する。[92]
    • 設定が完了すると、動画が生成されるようになる。[93]

3. 動画から動画への変換ワークフローの構築 [95]

thumbnail テキストからの動画生成ワークフローを、動画を入力として受け取り、それを変換するワークフローに改造する。

3.1. 動画入力ノードの追加と接続 [95]

  1. 動画入力ノードの追加 [96]

    • 動画から動画への変換では、エンティティレートイメージの代わりに動画を入力する。[96]
    • 「Load Video」ノードを追加し、ここに変換したい動画を読み込む。[99]
    • 動画を選択する。[101]
  2. 動画入力の接続とエンコード [102]

    • 読み込んだ動画をKsamplerに繋ぐ必要がある。[102]
    • 動画のピクセル画像を潜在画像に変換するために、「VAE Encode」ノードを挟む。[104]
    • 「Empty Latent Image」ノードは不要になるため削除する。[106]
    • VAEノードを繋ぐことで、動画入力の準備が完了する。[107]

3.2. 長い動画生成への対応と修正 [108]

  1. 生成時間の問題と対策 [108]

    • 動画から動画への変換を実行すると、学習フレーム数に対して生成時間が長くなりすぎる場合がある。[109]
    • この問題に対処するため、「AnimateDiff」ノードのコンテキストオプションに「Context Options Standard Uniform」を追加する。[110]
    • このノードを「AnimateDiff」ノードに接続することで、長い動画も処理できるようになる。[112]
  2. 修正後の動画生成 [113]

    • 修正を加えたワークフローで動画生成を実行する。[113]
    • 生成には時間がかかるが、127フレームの動画が生成される。[114]
    • ただし、この時点では元の動画の動きがほとんど反映されていない。[115]

4. 元の動画の動きを反映させるためのControlNet活用 [116]

thumbnail 生成される動画が元の動画の動きに追従するように、ControlNetをワークフローに組み込む。

4.1. ControlNetの概念と導入 [116]

  1. 元の動きを反映させるための課題 [116]

    • 現状では、生成された動画が元の動画の動きにほとんど反応していない。[115]
    • 生成される動画の動きを元の動画に合わせる必要がある。[117]
  2. ControlNetによる制御 [118]

    • 従来のワークフローでは、Ksamplerにはテキスト情報(プロンプト)と潜在画像のみが入力されていた。[118]
    • しかし、動画の動きを制御するには、画像生成処理に影響を与える「コンディショニング」情報が必要である。[120]
    • コンディショニングは、クリップの影響を強く受ける。[122]
    • このコンディショニングを制御するのがControlNetである。[123]
    • コンディショニングがKsamplerに届く前にControlNetを挟み込むことで、元の動画の動きを反映させる。[124]

4.2. ControlNetノードの追加と接続 [126]

  1. ControlNet関連ノードの追加 [126]

    • 「Load Video」からの画像は、「Preprocessor」を通してControlNetに渡される。[126]
    • ControlNetの「OpenPose」と「Depth」の2つのプリプロセッサーを追加する。[128]
    • 「Apply ControlNet Advanced」ノードを追加し、クローンして2つにする。[129]
    • ControlNet用のモデルローダーも追加する。[130]
    • これにより、ControlNet関連のノードが2組作成される。[131]
  2. ノード間の接続とパラメーター設定 [132]

    • 追加したControlNetノード群を、既存のコンディショニングの流れに挟み込む。[132]
    • ControlNetを2つ使用する場合は、直列に接続する。[133]
    • 新しいノードの流れに合わせてリンクを繋ぎ直す。[134]
    • 明るい緑色のリンクは、参照データ(学習データなど)を示す。[135]
    • 「Load Video」からの画像は、プリプロセッサーに送られる。[137]
    • 全てのリンクを繋ぎ終えたら、パラメーターを設定する。[138]

4.3. ControlNetのパラメーター設定と動画のコンパクト化 [139]

  1. ControlNetのパラメーター設定 [139]

    • 1つ目のControlNetは「OpenPose」に設定する。[139]
    • 2つ目のControlNetは「Depth」に設定する。[140]
    • これにより、2つのControlNetが接続され、動画の制御が可能になる。[141]
  2. 動画のコンパクト化と生成時間短縮 [143]

    • Load Videoノードの設定で、動画のフレームレート(FPS)を調整する。[144]
      • 例えば、フォースレートを8に設定すると、元の30FPS動画が8FPSとして扱われる。[144]
      • FPSを減らすことで、生成時間が短縮され、コンテキスト(同時に使用できるフレーム数)を伸ばすことができる。[145]
      • コンテキストを長く継続できると、絵が崩れにくくなる。[145]
    • 画像のサイズを変更することも可能で、例えばカスタムハイトを512に設定すると、幅は自動調整され、小さい画像として扱えるため生成時間が短縮される。[147]
    • このように、「Load Video」で動画をコンパクトにすることは重要である。[150]
    • 設定後、動画生成を実行すると、ControlNetが機能し、元の動画の動きを反映した生成結果が得られる。[151]

5. フレーム補間による動画の滑らか化 [152]

thumbnail 生成された動画のカクつきを解消し、滑らかな映像にするためにフレーム補間を導入する。

5.1. フレーム補間の必要性と導入 [152]

  1. フレームレートの調整と課題 [152]

    • ControlNetを適用した結果、動画は良くなったが、8FPSではカクつきが見られる。[152]
    • 通常のミュージックビデオなどでは30FPS程度が必要となるため、フレーム数を上げる必要がある。[155]
  2. フレーム補間ノードの追加 [155]

    • フレーム数を上げるために、ワークフローの最後にフレーム補間ノードを挿入する。[158]
    • 「ComfyUI Frame Interpolation」ノードを追加し、「RIFE vfi」を「Video Combine」に流れるイメージの間に挟む。[159]
    • これにより、Ksamplerでの生成枚数は少なくても、出力される動画は滑らかになる。[165]

5.2. フレーム補間パラメーターの設定と実行 [160]

  1. RIFE vfiのパラメーター設定 [160]

    • 「RIFE vfi」ノードの設定は3箇所で行う。[161]
      • 「Video Combine」のフレームレートを32に設定する。[161]
      • 「RIFE vfi」のマルチプライヤーを32に設定する。[161]
      • 「Load Video」のポーズレートを順になるように設定する(例: 10 x 3 = 30)。[162]
    • これにより、少ない生成枚数でも滑らかな出力が得られる。[164]
  2. フレーム補間実行後の結果 [165]

    • 設定後、動画生成を実行すると、映像が滑らかになる。[165]

6. 顔の入れ替え(Face Swap)機能の実装 [166]

thumbnail 生成された動画の顔を、別の顔画像に差し替える機能(顔入れ替え)を実装する。

6.1. 顔入れ替えノードの追加と接続 [167]

  1. 顔入れ替えの仕組み [167]

    • 顔の入れ替えは、生成されたイメージの顔部分を検出し、別の顔画像を適用することで実現する。[168]
  2. Reactorノードの追加と接続 [169]

    • 「Reactor」ノードと、顔画像読み込み用の「Image Load Image」ノードを追加する。[170]
    • 本線の流れ(生成された動画)を「Reactor Fast Face Swap」ノードに接続する。[171]
    • 顔画像も「Image Load Image」ノードから「Reactor」ノードに接続する。[172]
    • 「Reactor」ノードにはソースイメージとターゲットイメージを繋ぐ。[173]
    • 細かい設定もあるが、まずは基本的な接続で動作する。[175]

6.2. 顔入れ替えの実行と画質向上 [176]

  1. 顔入れ替えの実行 [176]

    • 顔画像を読み込み、ワークフローを実行する。[176]
    • 生成された動画の顔が、指定した顔画像に変わる。[177]
  2. 画質向上と注意点 [177]

    • 「Reactor」は一度書き直すため、わずかに画質も向上する。[177]
    • イメージ関連のノードは、接続順序が異なると動作が変わる場合があるため注意が必要である。[181]
    • 例えば、アップスケーラーをフレーム補間(RIFE vfi)の後に入れると上手く動作しない場合があり、フレーム補間よりも前に入れる方が良い場合がある。[182]

7. ワークフロー全体のまとめと応用 [183]

thumbnail これまで構築してきたワークフロー全体を俯瞰し、各ノードの役割と連携を理解する。

7.1. ワークフロー全体の構造理解 [184]

  1. ノード間の連携概要 [184]

    • 全体像を把握すると、各ノードの役割が理解しやすくなる。[185]
    • チェックポイントを変更すると、クリップはテキストエンコーダーから、コンディショニングはモデルとLoRAを通ってAnimateDiffへ流れる。[187]
    • Apply ConditionはControlNetを経由してから計算される。[188]
    • 動画入力の場合は、Apply ControlNet Advancedを使用する。[189]
  2. 画像生成から最終出力までの流れ [190]

    • 画像生成はKsamplerが行う。[190]
    • Ksamplerが生成した潜在画像はエンコードされ、水色のイメージになる。[191]
    • このイメージは、Reactorで顔が入れ替えられ、RIFE vfiでフレームが増やされ、Video CombineでH.264動画として出力される。[192]

7.2. ワークフローの応用と利点 [193]

  1. ワークフローのダウンロードと活用 [193]

    • 今回構築したワークフローは、説明欄からダウンロードして答え合わせに利用できる。[193]
  2. ComfyUIの利点と難しさ [194]

    • ComfyUIは多機能で何でもできそうだが、最初の学習コストは高い。[195]
    • しかし、プロンプト任せで生成するよりも、意図した結果を得るまで早く到達できる可能性がある。[196]
    • 考え抜いて行ったことは結果に現れるため、ミニ四駆の改造に例えられる。[197]