# ComfyUI Wan 2.2 I2V ワークフロー

## 概要

このワークフローは、Wan 2.2 I2V を使って、1~2枚の画像を始点・終点として指定して動画生成する ComfyUI ワークフローです。  
- 1stパスで低解像度の動画を作成し、2ndパスでアップスケールとフレーム補間を行います。パスごとの実行も可能です。  
- うぷ主が25年11月ごろから使い続けているものです。26年3月のComfyUI 0.17.2 で動作確認をしています（ので古くなっているノードもあるかもしれません）。
- このファイルでは /images フォルダの画像を参照しています。

## ワークフロー全体図

![ワークフロー全体](images/fig0_all.png)

### ざっくり使い方
1. New Setの 'Action!' をクリック（2ndパスがbypassされて、Seedがランダムになる）
2. 始点画像、終点画像、プロンプトなどの設定をする
3. Runする（Ctrl+Enter）
4. よき動画が出来たら **upscale ratio以外の設定を変えずに** Upscale Setの'Action'をクリック（2ndパスがenableとなって、Seedが今のものに固定される）
5. Runする（Ctrl+Enter）と、生成した動画のアップスケールとフレーム補間が行われる（設定を変えなければ1stパスの生成処理はスキップされる）

### 補足
* たまに Actionボタンのあるノードの設定がすべて 'None' となってしまうことがあります。この場合はワークフロー各部の画像に従って直してください。
* PlaySoundでエラーがでる場合はノードを削除してください（音を鳴らすだけの機能です）。
* 本ワークフローで生成済の動画をアップスケールしたい場合
  1. 本ワークフローで作成した（メタデータの残った）動画ファイルをドラッグ&ドロップ 
  2. Upscale Setの'Action'をクリック
  3. Enable Upscale videoを'yes' 
  4. Upscale videoに動画を設定
  5. Runする（Ctrl+Enter）

## 必要なモデルファイル

### wan2.2_i2v_high_noise_14B_Q4_K_S.gguf  
Wan2.2 I2V の High Noise 側モデル  
配置先：ComfyUI/models/unet  
ダウンロード先  
<https://huggingface.co/bullerwins/Wan2.2-I2V-A14B-GGUF/blob/main/wan2.2_i2v_high_noise_14B_Q4_K_S.gguf>

### wan2.2_i2v_low_noise_14B_Q4_K_S.gguf  
Wan 2.2 I2V の Low Noise 側モデル  
配置先：ComfyUI/models/unet  
ダウンロード先  
<https://huggingface.co/bullerwins/Wan2.2-I2V-A14B-GGUF/blob/main/wan2.2_i2v_low_noise_14B_Q4_K_S.gguf>

#### WAN2.2モデルについての補足

- `t2v(text to video)` と `i2v(image to video)` があります。  
  - `t2v` は始点画像を指定せずに動画を生成する方式、`i2v` は画像をもとに動画を生成する方式です。  
  - `t2v`方式は `i2v` モデルでも代用できるようです。

- `Q` の数字は量子化ビット数です。  
  - 数字が大きいほどクオリティが高くなりやすい一方、VRAM 使用量も大きくなります。  
  - 数字が小さいほどクオリティは下がりやすいですが、VRAM 使用量は小さくなります。  
  - 例えば、`Q3` は軽量寄り、`Q5` は品質寄りです。

- `S / M / L` は、それぞれ **軽量寄り / バランス寄り / 品質寄り** を表します。  
  - ただし、`Q` の数字による違いほど影響は大きくありません。

- 本ワークフローでは `Q4_K_S` を使用しています。使用環境に応じて以下より適切なモデルをダウンロードしてください。

    <https://huggingface.co/bullerwins/Wan2.2-I2V-A14B-GGUF/tree/main>  
※Wan公式ではなく、GGUF量子化版の公開リポジトリです。

### umt5_xxl_fp8_e4m3fn_scaled.safetensors  
Wan 用 Text Encoder  
配置先：ComfyUI/models/text_encoders  
ダウンロード先  
<https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors>

### wan_2.1_vae.safetensors
Wan 用 VAE（2.1用ですが問題なく使えます。2.2用は性能が悪いと言われています）  
配置先：`ComfyUI/models/vae`  
ダウンロード先  
<https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/blob/main/split_files/vae/wan_2.1_vae.safetensors>  

### lightx2v_I2V_14B_480p_cfg_step_distill_rank32_bf16.safetensors
少ないステップで生成するための蒸留LoRA  
配置先：`ComfyUI/models/loras`  
ダウンロード先  
<https://huggingface.co/Kijai/WanVideo_comfy/blob/main/Lightx2v/lightx2v_I2V_14B_480p_cfg_step_distill_rank32_bf16.safetensors>

### RealESRGAN_x2.pth
2倍アップスケールするための RealESRGAN モデル  
配置先：`ComfyUI/models/upscale_models`  
ダウンロード先：<https://huggingface.co/ai-forever/Real-ESRGAN/blob/main/RealESRGAN_x2.pth>

### rife47.pth
RIFE によるフレーム補間モデル  
配置先：`ComfyUI/models/vfi/rife`  
実行時にComfyUI-Frame-Interpolation の RIFE VFI ノードが自動ダウンロードを試みます。

### bounce_test_HighNoise-000005.safetensors & bounce_test_LowNoise-000005.safetensors
お胸を揺らすWan用LoRA。同様のLoRAで代用可。  
配置先：`ComfyUI/models/loras/`  
ダウンロード先（HighとLowの両方をDLしてください）  
https://civitai.red/models/1944129/slop-bounce-wan-22-i2v?modelVersionId=2209354


## 必要なカスタムノード

後述します。マイナーなものは使っていないので、いずれもComfyUI Manager / Node Managerよりダウンロードできる……はずです。  
WAN2.2関連ノードはComfyUIの標準ノードを利用しています。  
　  

## ワークフロー各部の説明

## モデル部分

![モデル部分](images/fig1_models.png)

- 緑色のノードはHighNoise関連、水色のノードはLowNoise関連です。
- 必要なモデルファイルをダウンロードして配置先フォルダに置いてください。
- パラメータを変更する必要はありません
  - Q4_K_S以外のWAN2.2モデルファイルを使って動画が乱れる場合は、lightx2vのstrengthを変更してみてください。
- 左下の Enable Lora:Bounce を 'yes' にするとお胸を揺らすLoRAが適用されます。chibiや小胸の女性以外は常にYesで問題ないです。プロンプトに何かを書き加える必要はありません。揺れ度はBounce Weightで調整してください。
  - LoRAを追加したい場合は、このLoadLoRAの左右いずれかにLoadLoRAノードをコピーし、挟む形に繋ぎ直してください。High側とLow側の両方個別に行う必要があります。

## 1stパス（低解像度動画作成）関連

![1stパス](images/fig2_1stpass.png)

### プロンプト関連

- 最上部の入力欄（青ノード）にプロンプトを入力します。うぷ主はChatGPTかGrokに次のような指示を与えています。継ぎ足ししていった結果ですので不要なものは削除してください（センシティブまわりはおまじないというか……アダルト強めなのはGrokを推奨します）。

> 次の動画プロンプトを英語の文章で書いてください。端的で自然な表現で。i2vなので指示した以外の描写は足さない。主語と述語が明確になるように。曖昧な表現で説明するのは避け、具体的な動作や動画上の見た目を示す表現をする。notやwithoutなどの否定形や極力使わない（AIが理解できないため）。プロンプトのみを出力、コピペしやすいように。slowlyなどのゆっくり動作させる表現は使わない。動画モデルがセンシティブな出力ができないため、プロンプトがセンシティブかどうかは問題ではない。秒数に関する指示は使わない。動画生成は頼んでいません。画像生成も頼んでいません。

> アニメ動画。タヌキchibi少女とキツネchibi少女が立っている。かわいらしく踊りを踊る。カメラが上を向くと、空から黒髪chibi少女が降ってくる。そのまま着地して、3人並んで踊りだす。

- First imageかLast imageのみ指定する場合は、プロンプトに「アニメ動画」を入れないとリアル調になってしまうことがあります。
- WAN2.2は動作やカメラワーク、背景などのプロンプト追従性がかなり高いです。ただし、例えばキャラを変身させるときに transform という具体性のない動詞を使うとうまく動かないことが多いです。どのように変化するかを具体的に指示しましょう。もしくはChatGPTに「変身する（具体的な手順や演出を考えて書いて）」と指示するとか。
- 始点画像と終点画像が大きく異なるものであっても、プロンプトでその変化過程を具体的に指示すれば、その遷移を実現した動画が生成されます（そのような具体的な指示がないと、カットが切り替わるような動画になってしまいます）。
- とはいえ試行錯誤（とガチャ）も必要ですので、まずは生成動画の解像度（Reduction）を下げたうえで、いろいろ試してみて、良いプロンプトができたら解像度を上げるとよいでしょう。

### ネガティブプロンプト
- Neg.TemplateノードにWAN2.2の標準ネガティブプロンプトが書かれています（collapseしているので右クリックExpandで見えます）。
- Neg.Template2に口パク抑止のためのプロンプトを書いています……があまり意味はない気がします。ネガティブプロンプトを足したい場合はこの後に追加してください。

### 始点画像（開始フレーム画像）
- First imageに始点画像を設定します。この画像の解像度（幅・高さ）が生成動画の解像度（幅・高さ）の基準となるので、始点画像を使わない場合でも何かしらの画像は設定してください。
- Enable First imageが '1' の場合は設定された画像を生成動画の始点画像とします。'2' の場合は始点画像を指定せずに動画を生成します。
- 'Reduction(%)' は生成動画の解像度に関する設定です。始点画像にこの比率をかけたサイズを16の倍数になるように切り捨てを行っています（Wanは16の倍数の解像度を前提としているため、事前に16の倍数へ切り捨てています）。
- 生成動画の解像度はResolution Checkの画像下に表示されます。

### 終点画像（最終フレーム画像）
- Last imageに終点画像を設定します。使わない場合は設定しなくても問題ありません。
- Enable Last imageが 'yes' の場合は設定された画像を生成動画の終点画像とします。'no'の場合は終点画像を指定せずに動画を生成します。
- 解像度を始点画像とそろえなくても、自動的に始点画像と同じ解像度に変更されます。

### 始点画像と終点画像について
- 始点画像と終点画像の両方を使用しない場合は、プロンプトのみに従ったt2v動画生成になります（i2vモデルでもt2vで生成可能です）。
- 終点画像のみを指定すると、プロンプトに従ってその終点画像に向かうように、動画の開始フレーム画像が自動生成されます。
- 始点画像と終点画像の両方を指定する場合、特に背景を工夫しないと、背景がおかしな動きになります。
  - 単色背景を使う、inpaint画像生成などで背景をそろえる、プロンプトで背景が変わることを明示する、途中でカメラをズームしてごまかす……など
  - 少し手間ですが、まず始点画像（もしくは終点画像）のみで動画生成をして、生成された動画の最終フレーム（もしくは開始フレーム）をもとにi2iで画像生成し、それを終点画像（もしくは始点画像）として指定する……ということもできます。特にカメラワークのある動画は自然な動きになりやすくなります。
  - フレーム取り出しはChromeで動画再生して右クリック「動画フレームに名前をつけて保存」でできます。
- 生成した動画の最終フレームは厳密に終点画像になるとは限りません。特に色味が異なることがよく知られています。最終フレームを次の動画の開始フレームとして動画をつないでいく場合に不自然になるのはWANの仕様です（解決はなかなか難しいようで……）

### 生成動画の長さ（フレーム数）
- lengthで変更できます。標準設定は81フレームです（16fpsで保存するなら約5秒）
- フレーム数は自由に変更できますが、41,81,121 のように、4の倍数+1となる値がよく使われるそうです。
- ただし21フレームのような短すぎる設定だと、生成動画がチラつくことがあります。また81フレームより大きいと、内容によってループ風の動きになりやすい傾向があります。


### Step1 CFG
- High Noise処理の最初の1ステップのCFGを設定するノードです。大きくすることで生成動画の動きがダイナミックになることが期待できますが、色味が変わったり破綻するケースも増えます。初期値は1.4にしています。経験上1.6前後なら破綻はせず、動きの大きな動画も生成できるようです。

### New Set
- New Setの "Action!" ボタンを押すことで、1stパスのみを実行するように設定されます（乱数シードを毎回ランダム、upscale関係のノードをすべてバイパスする）。
  - たまに設定がNoneとなってしまうことがあるので、その場合は画像のように設定しなおしてください。


## 1stパス動画生成

![1stパス動画生成](images/fig3_KSsample.png)

- 1stパスは全4stepで、左上ノード（設定した高CFGでのHighNoise処理）が1step、左下ノード（CFG=1.0でのHighNoise処理）が1step、右下ノード（LowNoise処理）が2stepです。HighNoise処理をこのように分割処理することでダイナミックでありながら破綻しにくくできるとされています。
- これらのノードのパラメータを変更する必要はありません


## 1stパス動画出力

![1stパス動画出力](images/fig4_1stout.png)

- Time Formatノードは保存ファイル名のprefix設定に利用しています。初期値は %y%m%d//[WAN1st]%y%m%d です。
- Video Combine（動画保存ノード）のパラメータについて
  - frame_rateの標準は16(fps)です
  - crfは小さいほど高画質（ファイルサイズ大）です
  - save_metadataが 'true' だと動画ファイルにワークフロー情報が保存されます
  - save_outputが 'false' だと動画ファイルが保存されなくなります。同名の画像ファイルはいずれの場合も保存されます（ワークフロー保存用？）

- PlaySoundノードは生成終了時に音を鳴らすためのものです。ファイル名を変更する場合は次のフォルダにmp3ファイルを置いて、ファイル名を変更してください（collapseしているので右クリックExpandで見えます）。
  - ComfyUI\custom_nodes\ComfyUI-Custom-Scripts\web\js\assets


## 2ndパス（アップスケール）設定部分

![2ndパス1](images/fig5_2ndpass.png)

- Upscale Setの "Action!" ボタンを押すことで、2ndパスを実行するように設定されます（乱数シードを1つ前の生成に固定、UpscaleグループをEnableにする）。
  - たまに設定がNoneとなってしまうことがあるので、その場合は画像のように設定しなおしてください。
- Upscale ratioはアップスケール後のサイズ設定用パラメータです。1stパスの出力動画の解像度にこの値を掛けた解像度になります。
- Enable upscaleノードとSeedノードは、Upscale Setにより制御されるので、直接設定を変える必要はありません
- 1stパスでよき動画が出来たら **upscale ratio以外の設定を変えずに** Upscale Setの'Action'をクリックして、Runする（Ctrl+Enter）することで、その動画のアップスケールとフレーム補間が行われます。
  - 1stパス関係の設定を変えなければ、1stパスの生成処理はスキップされます


## 2ndパス（アップスケール）処理部分

![2ndパス2](images/fig6_2ndout.png)

- アップスケール処理は、1stパス生成動画の各フレーム静止画をそれぞれupscale ratio倍にしたものを入力として、再度WANによる処理を行っています。
  - アップスケール時にこのようなWAN処理を行わないとフレーム間の遷移が不自然になります。
  - 正確にはRealESRGAN_x2（性能のよいアップスケーラー）により解像度を2倍にしてから、upscale ratioに合う形に縮小しています。

 - KSamplerでアップスケールした画像を入力として動画の再生成を行います。各パラメータを変更する必要はありません。
   - Q4_K_S以外のWAN2.2モデルファイルを使う場合などに、画質が悪い場合は次のパラメータを変更してみてください。
   - `Start Step` : どのステップから生成を開始するか（＝入力動画にノイズを乗せる量）を指定。初期値は8。
      - 値が大きいほど、ノイズ量が少なくなり、元の動画を保ちやすくなります。
      - 値が小さいほど、ノイズ量が多くなり、元の動画より描き直しが強くなります。
   - `Upscale Step Number` : 何ステップの再生成処理を行うかを設定。初期値は2ステップ。

- Frame Interpolationノードによりフレーム補間を行います。
  - multiplierはフレーム補間倍率で、`2` だとフレーム数が2倍になります

- Time FormatとVideo Combineは1stパスと同じです
  - フレーム補間によりフレーム数が2倍になっているのでframe rateも2倍の32にしています。
  - 保存ファイル名のprefix初期値は %y%m%d//upscale//[WAN2nd]%y%m%d です。

- 右下のLast Frameは生成動画の最終フレームを表示しています。不要であれば削除して問題ありません。

## 本ワークフローで生成済の動画ファイルをアップスケール処理する

![2ndパス2](images/fig7_upscale_only.png)

- 本ワークフローで生成済の動画をアップスケールする時用のフローです。
- アップスケールしたい動画（このワークフローで作成した動画でメタデータが保存されているもの。同時生成された画像ファイルでも可）をComfyUIにドラッグ&ドロップします。
    -  始点画像、終点画像、プロンプトなどの設定を反映するためです。メタデータがなければ、自力でプロンプトなどの設定を行ってください。
- Upscale Setの 'Action' をクリックしてから、Enable Upscale videoを 'yes' にしてください
- Upscale videoに動画を設定して Runします（Ctrl+Enter）

- PlaySoundは本処理の開始時に音を鳴らすために使っています（手順を間違えたときの注意喚起用）。不要であれば削除してください。

　　
## ワークフローで使用しているカスタムノード
必要なカスタムノードは、基本的に ComfyUI Manager / Nodes Manager からインストールできます。  
まずはワークフローを読み込んだ後、Manager の「Install Missing Custom Nodes」を実行してください。  
見つからないものがある場合は、ノード名またはGitHubリポジトリ名で検索し、それでも見つからない場合は手動で `ComfyUI/custom_nodes` に導入してください。

-  WAN 関連の主要処理はComfyUIの標準ノードを利用しています。

### ComfyUI Essentials  
ワークフロー内の主なノード：`SimpleMath+`, `GetImageSize+`  
ComfyUI本体にない便利機能を追加する補助ノード集  
<https://github.com/cubiq/ComfyUI_essentials>  

### ComfyLiterals  
ワークフロー内の主なノード：`Int`, `Float`  
数値などの固定値を扱う入力ノード  
<https://github.com/M1kep/ComfyLiterals>  

### Comfyroll Studio / Comfyroll Custom Nodes  
ワークフロー内の主なノード：`CR Text`, `CR Image Input Switch`  
テキスト入力や画像入力切替などのユーティリティノード集  
<https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes>  

### ComfyUI_hus_utils  
ワークフロー内の主なノード：`Date Time Format`  
日時文字列などを生成するユーティリティ  
<https://github.com/hustille/ComfyUI_hus_utils>  

### ComfyUI-Custom-Scripts  
ワークフロー内の主なノード：`MathExpression|pysssss`, `PlaySound|pysssss`  
数式処理や実行完了音などを追加する便利スクリプト集  
<https://github.com/pythongosssss/ComfyUI-Custom-Scripts>  

### ComfyUI Frame Interpolation  
ワークフロー内の主なノード：`RIFE VFI`  
RIFEなどで動画フレームを補間するノード集  
<https://github.com/Fannovel16/ComfyUI-Frame-Interpolation>  

### ComfyUI-GGUF  
ワークフロー内の主なノード：`UnetLoaderGGUF`  
GGUF形式の量子化モデルを読み込むためのノード  
<https://github.com/city96/ComfyUI-GGUF>  

### ComfyUI mxToolkit  
ワークフロー内の主なノード：`mxSlider`  
スライダーなど、パラメータ操作をしやすくする補助ノード集  
<https://github.com/Smirnov75/ComfyUI-mxToolkit>  

### ComfyUI Unload Model  
ワークフロー内の主なノード：`UnloadAllModels`  
ワークフロー中の指定位置で、読み込まれているモデルをメモリから解放するためのノード(なくても動作します) 
<https://github.com/SeanScripts/ComfyUI-Unload-Model>  

### ComfyUI Video Helper Suite  
ワークフロー内の主なノード：`VHS_LoadVideo`, `VHS_VideoCombine`, `VHS_SplitImages`  
動画の読み込み、結合、分割を行うノード集  
<https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite>  

### rgthree-comfy  
ワークフロー内の主なノード：`Any Switch (rgthree)`, `Seed (rgthree)`, `Fast Bypasser`, `Fast Groups Bypasser`, `Mute / Bypass Relay`, `Mute / Bypass Repeater`, `Fast Actions Button`  
ノードやグループの切替、バイパス、ワークフロー操作を効率化するノード集  
<https://github.com/rgthree/rgthree-comfy>  