見出し画像

ComfyUIのワークフローをやめた——Claude Codeに話しかけるだけで動画が生成できた

はじめに

前回の記事で、WAN 2.2を使ってAnimaの静止画を動画にするところまで書いた。

ワークフローを組んで、画像を読み込んで、キューに投げて、50分待つ。それ自体は動いた。

ただ、毎回ワークフローを手で操作するのが面倒だと感じていた。パラメータを変えたいとき、別の画像を試したいとき、そのたびにComfyUIのGUIを操作する必要がある。

Pythonスクリプトで自動化できないか。

画像生成の方はすでにPython + ComfyUI APIで動いている。同じことを動画でもやる。Claude Codeに指示を出すだけでスクリプトができて、実際に動くまでの話を書く。


ComfyUI APIとは

ComfyUIにはHTTP APIが内蔵されている。GUIで「Queue Prompt」ボタンを押す操作は、内部的にはPOSTリクエストを `/prompt` に投げているだけだ。

Pythonから同じリクエストを送れば、GUIを操作せずに生成を走らせられる。

基本の流れはシンプルだ。

  1. `POST /upload/image` — 入力画像をComfyUIにアップロード

  2. `POST /prompt` — ワークフローJSON + パラメータを送信

  3. `GET /history/{prompt_id}` — 完了を確認(ポーリング)

  4. `GET /view` — 生成された動画ファイルを取得・保存


Claude Codeへの指示だけでスクリプトが生成された

画像生成用の既存スクリプト構成(`comfy_base.py`)を参考に渡して、動画生成版を作るよう指示した。

出てきたのが `wan_base.py`(コア処理)と `wan_test.py`(実行スクリプト)の2ファイル構成だ。

image_gen/wan_video/
├── wan_base.py   # ComfyUI APIとのやり取り、ワークフロー定義
└── wan_test.py   # テスト実行(入力画像・プロンプト・出力先の指定)

`wan_base.py` の中で定義しているワークフロー構成は、前回記事で使ったものと同じだ。

  • UNETLoader、CLIPLoader、VAELoader(モデル読み込み)

  • CLIPTextEncode × 2(プロンプト処理)

  • LoadImage + Wan22ImageToVideoLatent(画像→潜在空間)

  • KSampler(生成)

  • VAEDecode + SaveAnimatedWEBP(出力)

これをPythonの辞書として定義してAPIに投げるだけだ。


デバッグ:2つのつまずきポイント

動かすまでに2つ問題があった。正直に書く。

1. ポートが8000じゃなかった

ComfyUIの設定では8000番ポートを指定していたが、実際のアクセス先は8001になっていた。

原因はComfyUIが2重起動していたこと。先に起動していたプロセスが8000を押さえていて、後から起動したプロセスが自動的に8001にフォールバックしていた。

起動ログに `To see the GUI go to: http://127.0.0.1:8001` と出ていたので気づけた。重複プロセスを終了させて再起動したら8000に戻った。

2. electronアプリのログ処理との競合

KSamplerが実行されると、内部でtqdmがプログレスバーを`\r`文字でstderrに書き出す。これがComfyUI Managerのstderrパッチ処理を経由して、electronアプリのloggerに渡るときに `[Errno 22] Invalid argument` で落ちる。

ComfyUIのGUI上から動かすと問題ないのに、APIから呼ぶと落ちる理由がこれだ。GUIから実行するときはWebSocket経由でプログレスが送られるためtqdmが抑制されるが、外部APIからだとtqdmが動いてしまう。

修正はシンプルだった。ComfyUI Managerの `prestartup_script.py` 内の該当箇所に `try/except OSError: pass` を追加するだけ。エラーを無視して処理を続けるようにした。

ここから先は

1,111字

¥ 300

Amazon Payで支払うと最大2%還元のチャンス! 9/30まで

この記事が気に入ったらチップで応援してみませんか?