}

0円で爆速マスター!Wan2.2で始める神動画作成術~Wan2.2の5Bモデルインストール編

プラットフォーム
この記事は約30分で読めます。

先日、Wan2.2を動作させるための基本的な環境構築までは完成させることができました。
おやおや、そんな記事知らないぞ?という方はこちらをご一読ください。

今日はその続きの、「ComfyUIにWan2.2をインストールする」というところまでを解説していきたいと思います。
ローカル環境でWan2.2を動かせたらいいですよね?

果たしてうまくインストールできるでしょうか?

ドキドキです!
さぁ、いってまいりましょー!

スポンサーリンク

ComfyUIにWan2.2を載せてみよう!

Wan2.2とは?

Wan2.2は、最新の動画生成AIモデルで、

  • テキスト→動画(T2V)
  • 画像→動画(I2V)
  • テキスト+画像→動画(TI2V)
    など、多彩な生成モードを搭載。

しかも商用利用OK(Apache 2.0ライセンス)です。

Wan2.2 5Bモデルのインストール手順(Windows編)

1. 動作環境の確認

Wan2.2の5Bモデルは、AIによる高精度かつ爆速の動画生成が魅力ですが、その分PCへの負荷も大きめ。
スムーズに動かすためには、まず自分のPCが必要スペックを満たしているかをチェックしましょう。

項目最低動作環境推奨環境(快適動作)
OSWindows 10 / 11 (64bit)Windows 11 (最新更新適用)
CPUIntel Core i5 第10世代以上 または Ryzen 5 3600以上Intel Core i7 第12世代以上
GPU(VRAM)NVIDIA RTX 4080以上(VRAM 16GB以上)NVIDIA RTX 4080以上(VRAM 16GB以上)
メモリ(RAM)16GB32GB以上
ストレージ空き容量 20GB以上(SSD推奨)NVMe SSD(読み込み速度 3000MB/s以上)
PythonPython 3.10 ~ 3.11 以上Python 3.12
ComfyUIインストール済み

GPUはNVIDIA製(CUDA対応)が必須。AMDやIntel内蔵GPUでは
動作不可のケース多数。
VRAM不足の場合は出力解像度を下げると安定。
HDDでは非常に遅いので、必ずSSD以上で運用。

ここまでの環境構築は、前回やりましたので割愛させていただきます。

2. Git をインストールする方法

Git は pip ではインストールできません
Python パッケージではなく、独立したコマンドラインツールだからです。
Windows では公式インストーラーから入れるのが確実です。

手順1. 公式サイトから Windows 用 Git をダウンロード

ダウンロードはこちら

手順2. インストーラーを起動

「Git from the command line and also from 3rd-party software」 を選択。

インストールが開始されます。

手順3. Anaconda PowerShellを再起動

インストール完了後、Anaconda PowerShell を閉じて再起動します。

手順4. バージョン番号が表示されるかの確認

動作確認をします。次のコマンドを打ち、バージョン番号が表示されればインストール成功です。

git --version

3. Wan2.2 を GitHub からダウンロード

mkdir C:\comfyui\extensions
cd C:\comfyui\extensions
git clone https://github.com/Wan-Video/Wan2.2.git
cd Wan2.2

ここまで、案外すんなり来て驚いています(Gitのインストールで戸惑ったくらいでした)。

4. flash_attn を使わないバージョンでインストール

まず、NumPyが再度邪魔をしてくるので、また対策を取ります。次のコマンドを入力します。

python -m pip install numpy==1.26.4

Wan2.2 は flash_attn が必須ではないので、まず requirements から除外します。

cd C:\comfyui\extensions\Wan2.2
findstr /V "flash_attn" requirements.txt > requirements_no_flash.txt
python -m pip install --upgrade pip wheel setuptools
python -m pip install -r requirements_no_flash.txt

5. モデル本体・VAE・テキストエンコーダーのインストール

フォルダ構造例:

C:\comfyui\
 ├─ models\
 │   ├─ diffusion_models\
 │   │    └─ wan2.2_ti2v_5B_fp16.safetensors
 │   ├─ vae\
 │   │    └─ wan2.2_vae.safetensors
 │   └─ text_encoders\
 │        └─ umt5_xxl_fp8_e4m3fn_scaled.safetensors
 └─ extensions\
      └─ Wan2.2\

以下のスクリプトを、「C:\comfyui」下に、「download_wan2_2.py」という名前で保存します。

import requests
import os
from urllib.parse import urlparse

# 設定
DIFFUSION_DIR = "C:/comfyui/models/diffusion_models"
VAE_DIR = "C:/comfyui/models/vae"
TEXT_ENCODERS_DIR = "C:/comfyui/models/text_encoders"

os.makedirs(DIFFUSION_DIR, exist_ok=True)
os.makedirs(VAE_DIR, exist_ok=True)
os.makedirs(TEXT_ENCODERS_DIR, exist_ok=True)

# ダウンロード対象のURLと保存先
files_to_download = [
    {
        "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_ti2v_5B_fp16.safetensors",
        "save_path": os.path.join(DIFFUSION_DIR, "wan2.2_ti2v_5B_fp16.safetensors"),
        "name": "Wan2.2 5B Main Model"
    },
    {
        "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/vae/wan2.2_vae.safetensors",
        "save_path": os.path.join(VAE_DIR, "wan2.2_vae.safetensors"),
        "name": "Wan2.2 VAE"
    },
    {
        "url": "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors",
        "save_path": os.path.join(TEXT_ENCODERS_DIR, "umt5_xxl_fp8_e4m3fn_scaled.safetensors"),
        "name": "UMT5 XXL Text Encoder"
    }
]

def download_file(url, save_path):
    filename = os.path.basename(save_path)
    print(f"Checking {filename} ...")

    if os.path.exists(save_path):
        print(f"Already exists: {filename}\n")
        return True

    print(f"Downloading {filename} ...")
    try:
        response = requests.get(url, stream=True, timeout=30)
        response.raise_for_status()
        with open(save_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"Saved: {save_path}\n")
        return True
    except Exception as e:
        print(f"Failed to download {filename}: {e}\n")
        if os.path.exists(save_path):
            os.remove(save_path)
        return False

# 実行
print("Wan2.2 5B モデルのダウンロードを開始します...\n")

success_count = 0
for file in files_to_download:
    print(f"[{file['name']}]")
    if download_file(file["url"], file["save_path"]):
        success_count += 1

print(f"ダウンロード完了: {success_count} / {len(files_to_download)} ファイル成功")
print("Wan2.2 5B モデルのセットアップが完了しました。")
print("ComfyUI を再起動してください。")

「Anaconda PowerShell」で、次のコマンドを実行。

conda activate PyTorch
pip install huggingface_hub
pip install safetensors

これも。

cd C:\comfyui
python download_wan2_2.py

すると、「C:\comfyui\models\」以下にそれぞれのファイルが自動で配置されます。

これでダウンロードに失敗する際は、以下のサイトから直接ダウンロードしてください。

ComfyUI 向け再パッケージ化モデル (推奨)
  • URL: https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged
  • 内容: ComfyUIユーザー向けに再構成されたリポジトリ。
    • split_files/diffusion_models/ に基本モデル
    • split_files/vae/ に VAE (wan2.2_vae.safetensors)
    • split_files/text_encoders/ に Text Encoder (umt5_xxl_fp8_e4m3fn_scaled.safetensors)

6. モデル本体・VAE・テキストエンコーダーの登録

通常、ComfyUI では追加のテンプレートは次のフォルダに作ります。

C:\comfyui\custom_nodes\wan2_2_module
C:\comfyui\custom_nodes\wan2_2_module\example_workflows

もしなければ テンプレート用 フォルダを作って大丈夫です。

mkdir C:\comfyui\custom_nodes\wan2_2_module
mkdir C:\comfyui\custom_nodes\wan2_2_module\example_workflows

作成した「C:\comfyui\custom_nodes\wan2_2_module\example_workflows」下に移動し、「Wan2.2 5B 画像生成.json」ファイルを作成して、次のスクリプトを「UTF-8形式(BOMなし)」で書いて保存します。

必要なら、「C:\comfyui\custom_nodes\wan2_2_module\example_workflows」下に、サムネイル用の「jpg」ファイルも用意してください(ファイル名は「Wan2.2 5B 画像生成.jpg」、サイズは 256 x 256)。

以下のjsonファイルは使用しません。デフォルトのものを使用することにしました。

{
  "id": "8fd07cea-ddf9-450d-9ca2-7ebc68e7835b",
  "revision": 0,
  "last_node_id": 7,
  "last_link_id": 8,
  "nodes": [
    {
      "id": 1,
      "type": "CLIPTextEncode",
      "pos": [0, 0],
      "size": [200, 100],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [
        {
          "name": "clip",
          "type": "CLIP",
          "link": 1
        }
      ],
      "outputs": [
        {
          "name": "CONDITIONING",
          "type": "CONDITIONING",
          "links": [2]
        }
      ],
      "properties": {
        "Node name for S&R": "CLIPTextEncode"
      },
      "widgets_values": [
        "A beautiful sunset over the mountains, cinematic, 4K"
      ]
    },
    {
      "id": 2,
      "type": "CheckpointLoaderSimple",
      "pos": [0, 200],
      "size": [210, 120],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "MODEL",
          "type": "MODEL",
          "links": [3]
        },
        {
          "name": "CLIP",
          "type": "CLIP",
          "links": [1, 8]
        },
        {
          "name": "VAE",
          "type": "VAE",
          "links": [4]
        }
      ],
      "properties": {
        "Node name for S&R": "CheckpointLoaderSimple"
      },
      "widgets_values": [
        "wan2.2_ti2v_5B_fp16.safetensors"
      ]
    },
    {
      "id": 3,
      "type": "KSampler",
      "class_type": "KSampler",
      "pos": [300, 0],
      "size": [320, 250],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [
        {
          "name": "model",
          "type": "MODEL",
          "link": 3
        },
        {
          "name": "positive",
          "type": "CONDITIONING",
          "link": 2
        },
        {
          "name": "negative",
          "type": "CONDITIONING",
          "link": 9
        },
        {
          "name": "latent_image",
          "type": "LATENT",
          "link": 5
        }
      ],
      "outputs": [
        {
          "name": "LATENT",
          "type": "LATENT",
          "links": [6]
        }
      ],
      "properties": {
        "Node name for S&R": "KSampler"
      },
      "widgets_values": [
        0,
        0,
        30,
        7,
        "euler",
        "normal",
        1.0,
        123456
      ]
    },
    {
      "id": 4,
      "type": "EmptyLatentImage",
      "pos": [300, 300],
      "size": [200, 100],
      "flags": {},
      "order": 3,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "LATENT",
          "type": "LATENT",
          "links": [5]
        }
      ],
      "properties": {
        "Node name for S&R": "EmptyLatentImage"
      },
      "widgets_values": [
        512,
        512,
        16
      ]
    },
    {
      "id": 5,
      "type": "VAEDecode",
      "pos": [650, 0],
      "size": [200, 100],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "samples",
          "type": "LATENT",
          "link": 6
        },
        {
          "name": "vae",
          "type": "VAE",
          "link": 4
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [7]
        }
      ],
      "properties": {
        "Node name for S&R": "VAEDecode"
      }
    },
    {
      "id": 6,
      "type": "SaveImage",
      "pos": [900, 0],
      "size": [200, 100],
      "flags": {},
      "order": 5,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 7
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "SaveImage"
      },
      "widgets_values": {
        "filename_prefix": "wan22_frames"
      }
    },
    {
      "id": 7,
      "type": "CLIPTextEncode",
      "pos": [100, 500],
      "size": [200, 100],
      "flags": {},
      "order": 6,
      "mode": 0,
      "inputs": [
        {
          "name": "clip",
          "type": "CLIP",
          "link": 8
        }
      ],
      "outputs": [
        {
          "name": "CONDITIONING",
          "type": "CONDITIONING",
          "links": [9]
        }
      ],
      "properties": {
        "Node name for S&R": "CLIPTextEncode"
      },
      "widgets_values": [""]
    }
  ],
  "links": [
    [1, 2, 1, 1, 0, "CLIP"],
    [2, 1, 0, 3, 1, "CONDITIONING"],
    [3, 2, 0, 3, 0, "MODEL"],
    [4, 2, 2, 5, 1, "VAE"],
    [5, 4, 0, 3, 3, "LATENT"],
    [6, 3, 0, 5, 0, "LATENT"],
    [7, 5, 0, 6, 0, "IMAGE"],
    [8, 2, 1, 7, 0, "CLIP"],
    [9, 7, 0, 3, 2, "CONDITIONING"]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.0,
      "offset": [0, 0]
    },
    "ue_links": [],
    "frontendVersion": "1.23.4",
    "VHS_latentpreview": false,
    "VHS_latentpreviewrate": 0,
    "VHS_MetadataImage": true,
    "VHS_KeepIntermediate": false
  },
  "version": 0.4
}

そして、「C:\comfyui\custom_nodes\wan2_2_module」下に、「__init__.py」ファイルをUTF-8形式(BOMなし)で作成します。

※__init__.pyファイルも作成しなくても構いません。

# C:\comfyui\custom_nodes\wan2_2_module\__init__.py

from pathlib import Path
import json

# === 必須定義 ===
NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}

# === get_node_info 関数(トップレベルにシンプルに定義)===
def get_node_info():
    # モジュールのディレクトリを取得
    module_path = Path(__file__).parent
    workflows_dir = module_path / "example_workflows"

    # テンプレートリスト
    templates = []

    # example_workflows が存在するか?
    if workflows_dir.exists() and workflows_dir.is_dir():
        for file in workflows_dir.iterdir():
            if file.suffix.lower() == ".json":
                try:
                    with open(file, "r", encoding="utf-8") as f:
                        data = json.load(f)

                    # 名前と説明
                    template_name = data.get("template_name") or data.get("name") or file.stem
                    description = data.get("description", "")

                    # テンプレート追加
                    templates.append({
                        "name": template_name,
                        "description": description,
                        "workflow": data
                    })

                except Exception as e:
                    print(f"[wan2_2_module] Failed to load {file.name}: {e}")

    # 結果を返す
    return {
        "name": "wan2_2_module",
        "templates": templates
    }

# === 外部公開 ===
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "get_node_info"]

7. ComfyUI-Manager のインストール

cd C:\comfyui\custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager

ComfyUIを再起動します。

python main.py

ここまでできたら、一旦、Anaconda PowerShellを再起動します。

8. まとめると Wan2.2 のインストール手順はこうなります

mkdir C:\comfyui\extensions
cd C:\comfyui\extensions
git clone https://github.com/Wan-Video/Wan2.2.git
cd Wan2.2

python -m pip install numpy==1.26.4

cd C:\comfyui\extensions\Wan2.2
findstr /V "flash_attn" requirements.txt > requirements_no_flash.txt
python -m pip install --upgrade pip wheel setuptools
python -m pip install -r requirements_no_flash.txt

cd C:\comfyui
python download_wan2_2.py

mkdir C:\comfyui\custom_nodes\wan2_2_module
mkdir C:\comfyui\custom_nodes\wan2_2_module\example_workflows

cd C:\comfyui\custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager

python main.py

9. なぜ GitHub 方式が安心か

  • 公式ソース直取得:GitHub リポジトリから直接ダウンロードするため安心かつ最新版対応。
  • 依存関係が可視化requirements.txt によって必要ライブラリが明確。
  • ComfyUI 連携:UI操作と組み合わせやすく、初心者にも優しい導入が可能。

10. 起動テスト

「Anaconda PowerShell」上から、次のコマンドを実行します。

conda activate PyTorch
cd C:\comfyui
python main.py

次にブラウザ上から、下のアドレスを入力します。

http://127.0.0.1:8188

正常に起動すれば、ブラウザが開きます。

「テンプレートを参照」をクリックし、そこからWan2.2を探せます。※試行錯誤の結果、テンプレートに備え付けのWan2.2 5Bを使用することにしました。

クリックするとWan2.2 5Bバージョンのテンプレートが立ち上がります。
アラートが出るのは、バージョンの違いによりjsonファイルが整合性が取れないみたいなことが、AIの解答で得られましたが、時間があるときに解決しておきますね。
※2025/08/26 うまく動いているjsonファイルをベースにQwen(AI)で修正をかけたところ、正常に動作するjsonファイルを作ることができました!

以上、お疲れ様でした。
次はいよいよ、Wan2.2を使ったAIによる動画生成編です。

おさらい

ComfyUIの起動

「Anaconda PowerShell」を起動させ、次のコマンドを打つ。

conda activate PyTorch
cd C:\comfyui
python main.py

ブラウザを立ち上げ、次のURLを打つ。

http://127.0.0.1:8188

ComfyUIが立ち上がる。完成!

最後に

これで、あなたのPCでWan2.2の5Bモデルが動く準備が整いました。
前回は14時間ほどの時間を費やしましたが、今回もまるまる土曜一日と、本日日曜も7時間ほどを費やしました。疲れました。皆さん、私の屍を超えていってください。

あとはプロンプトを入力して、思い通りの神動画を生成するだけです。

次回予告:
0円で爆速マスター!Wan2.2で始める神動画作成術~AIによる動画作成編

です。
次回は、クオリティと速度を両立させるプロンプト設定方法を解説していきたいと思います。おらわくわくすっぞ!

では、次回お会いしましょう。

白川秋
白川秋

ではでは、参考までに。

コメント

タイトルとURLをコピーしました