Wan2.1でvideo to video

この記事では、ComfyUIとWan2.1を使用して動画を変換する手順を説明します。

環境|.
---|---
OS|Windows11
GPU|RTX3090

## 1. 背景

ComfyUI は、Stable Diffusion や関連モデルを GUI で操作するためのオープンソースツールです。
Wan2.1は、アリババが開発したオープンソースの動画生成AIモデルで、テキストや画像から高品質な動画を生成できる点が特徴です。独自の3D VAEと拡散DiTを採用し、高速かつ高品質な動画生成を実現しています。

## 2. 環境構築

以下の手順で ComfyUI と必要なカスタムノード、モデルファイルをセットアップします。

### 2.1 ComfyUI のインストール
1. [ComfyUI の GitHub ページ](https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#direct-link-to-download) の「Direct Link to Download」から **Windows Portable 版**をダウンロードします。
2. ダウンロードした ZIP ファイルを解凍し、任意のフォルダに配置します。

### 2.2 ComfyUI-Manager のインストール
ComfyUI-Manager は、カスタムノードや依存関係を簡単に管理するための拡張機能です。
1. 解凍したフォルダ内でコマンドプロンプトを開きます。
   - フォルダ内で右クリック → `ターミナルを開く`
2. ComfyUI-Manager をクローンします:
   ```bash
   git clone https://github.com/ltdrdata/ComfyUI-Manager.git
   ```

### 2.3 ComfyUI の起動
1. `ComfyUI_windows_portable` フォルダ内の `run_nvidia_gpu.bat` をダブルクリックして起動します。
2. 初回起動時に依存関係（Python パッケージなど）が自動的にインストールされます。

### 2.4 ワークフローのインポート
1. 以下のワークフローファイルをダウンロードします:
   - [workflowダウンロードリンク](https://drive.google.com/file/d/1VeqgNQz4dr37ko4IwlkaV9IXyjjAb4wX/view?usp=sharing)
2. [ComfyUI のウェブインターフェース](http://localhost:8188) を開き、ダウンロードしたworkflowファイルをドラッグアンドドロップして読み込みます。

### 2.5 ComfyUI とカスタムノードの更新
1. ComfyUI インターフェース右上の「Manager」ボタンをクリックします。
   ![Manager ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/d3ced267-259f-4e0d-b2a1-ed83294f393d.png)
2. 「Update: ComfyUI Nighty Version」を選択し、「Update ComfyUI」をクリックします。
3. 更新後、ブラウザでページを再読み込み（F5 またはリロード）します。
4. 「Install Missing Custom Nodes」を開き、表示されるすべてのノードをインストールします。
   - バージョンはデフォルトのままで問題ありません。
5. インストール後、「Restart」をクリックして ComfyUI を再起動します。
6. ノードがすべて正しく読み込まれていることを確認します。

## 3. モデルファイルの配置

Wan2.1 モデルおよび関連ファイルを、Hugging Face からダウンロードし、適切なフォルダに配置します。

### 3.1 モデルファイルのダウンロードと配置
以下のファイルをダウンロードし、指定されたフォルダに格納します。ファイル名を変更する場合は注意してください。

| ファイル | ダウンロード元 | 格納先フォルダ |
|----------|----------------|----------------|
| `diffusion_pytorch_model.safetensors` | [リンク](https://huggingface.co/alibaba-pai/Wan2.1-Fun-1.3B-Control/blob/main/diffusion_pytorch_model.safetensors) | `ComfyUI_windows_portable\ComfyUI\models\diffusion_models` |
| `wan_2.1_vae.safetensors` | [リンク](https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/vae/wan_2.1_vae.safetensors) | `ComfyUI_windows_portable\ComfyUI\models\vae` |
| `clip_vision_h.safetensors` | [リンク](https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/clip_vision/clip_vision_h.safetensors) | `ComfyUI_windows_portable\ComfyUI\models\clip_vision` |
| `umt5_xxl_fp8_e4m3fn_scaled.safetensors` | [リンク](https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors) | `ComfyUI_windows_portable\ComfyUI\models\text_encoders` |

### 3.2 Depth-Anything モデルの配置
1. 以下のファイルをダウンロードします:
   - [depth_anything_v2_vitl.pth](https://huggingface.co/depth-anything/Depth-Anything-V2-Large/blob/main/depth_anything_v2_vitl.pth)
2. ファイルを以下に格納します:
   - `ComfyUI_windows_portable\ComfyUI\custom_nodes\comfyui_controlnet_aux\ckpts\depth-anything\Depth-Anything-V2-Large`

---

## 4. 動画変換の準備

動画変換を行う前に、入力動画と置き換える画像を準備します。

### 4.1 入力動画の準備
1. 変換したい動画ファイルを用意します
2. 動画からフレームを抽出します（FFmpeg や動画編集ソフトを使用）
   - 例: FFmpeg コマンドでフレーム抽出
     ```bash
     ffmpeg -i input.mp4 -vf "select=eq(n\,100)" -vframes 1 frame_100.jpg
     ```
3. 抽出したフレームを元に、**Gemini 2.0 Flash (Image Generation)** などを利用して別の画像を生成します。
     | Original | Generated |
     |----------|-----------|
     | ![オリジナル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/044c8afd-585d-4b3a-ac9d-8faed9d365b3.png) | ![生成画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/8124e66c-efbf-4c2b-a7fc-4f591a60cb6e.jpeg) |

### 4.2 ワークフロー設定
1. ComfyUI のワークフロー内で「Load Video」ノードを使用して入力動画を読み込みます。
2. 動画サイズと長さを調整します:
   - **Width** と **Height**: 出力動画の解像度。大きくすると VRAM 消費量が増加します。
   - **Length**: 出力フレーム数。最大値は`frame_load_cap`に表示（例: 426 フレーム）。
     ![動画設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/a6267f86-1aa2-4459-96f8-09f2a63eab7a.png)
3. ControlNet の設定:
   - `画像ブレンド`ノードでDepthとlineartの比率を調整できます。0.5なら半々、0だとDepthのみになります。
     ![ControlNet 設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/1f51c1b7-c207-45f8-b8fc-767ed3aee8ca.png)
4. 生成した画像をアップロードします:
   - ワークフロー内の`画像を読み込む`からアップロード
     ![画像アップロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/af6d2cb0-8e0a-4848-b834-1ed174a75b23.png)
5. ポジティブプロンプトを調整します:
   - 生成する動画のスタイルや内容を記述。基本的にプロンプトは生成結果に大した影響を与えません。
     ![プロンプト設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231080/b93ffdbf-95b5-4504-88a8-ed7eac4dc7ee.png)

## 5. 動画生成の実行

1. すべての設定が完了したら、`実行する`をクリックします
2. 生成処理が開始され、GPU の性能や動画の長さに応じて数分から数時間かかります
3. 生成された動画は、ComfyUI の出力フォルダ（通常は `ComfyUI_windows_portable\ComfyUI\output`）に保存されます

## 6. まとめ
この記事では、ComfyUIとWan2.1を使用してvideo to videoを実行する手順を解説しました。
こちらは今回生成した動画を編集したものです。

<iframe width="922" height="519" src="https://www.youtube.com/embed/ATzHDeSs2yo" title="wan2.1 データ拡張テスト" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 7. 参考

https://youtu.be/ruhvCGcpsDg?si=x1NXGMmWFGqz_q6j