ComfyUIのAPIでACE-Step音楽生成をPythonから実行する

AIテキスト

前回はComfyUI上でACE-Stepを動かして音楽を作りました。

同じワークフローをそのまま「APIで叩ける形」にして、Pythonから実行できる状態にします。

API用JSONの書き出しから実行、完了確認、出力ファイルの取得までを試してみましょう。

ComfyUIのAPIでできること

ComfyUIは、画面からのノード操作に加えて、HTTP APIとWebSocketを提供します。

ワークフロー実行は基本的に POST /prompt でキューに投入し、進捗は /ws で受け取り、結果は /history/{prompt_id} で確認する流れです。

これらの主要ルートは公式ドキュメントにまとまっています。
Routes – ComfyUI

API用のJSONをエクスポートする

ComfyUIには、通常のワークフローJSONエクスポートとは別に、API実行向けに最適化されたJSON形式があります。

利用したいワークフローを開いた状態で、UIのアイコンメニューから「ファイル」→「エクスポート (API)」を選択します。

API用のJSONエクスポートをメニューから選ぶ。

適宜、ファイル名をつけて保存します。

ファイル名をつけて保存

外部からのAPI呼び出しはこのJSONを使うと簡単です。

Pythonで入力パラメータを差し替えてPOSTする

公式ドキュメントでは、/prompt にワークフローをPOSTして実行キューに入れる流れが説明されています。

画像の例が多いのですが、ACE-Stepの場合は、曲調タグや歌詞を入力するノードのinputsを差し替えます。

保存したAPI用JSONを開き、画面上のノードのタイトル”TextEncodeAceStepAudio“で検索すると、入力内容が入ったノードが見つかります。

  ...
  "74:14": {
    "inputs": {
      "tags": "medieval fantasy, night, campfire, calm, healing,\nbackground music, ambient, lute, flute, soft strings, pad, bell\n",
      "lyrics": "[instrumental]",
      "lyrics_strength": 0.9900000000000002,
      "clip": [
        "74:40",
        1
      ]
    },
    "class_type": "TextEncodeAceStepAudio",
    "_meta": {
      "title": "TextEncodeAceStepAudio"
    }
  }
  ...

利用環境や入力した内容によって、タグは変わる可能性があります。

ChatGPTなど生成AIにJSONを見せてコードを書いて貰う方法も有効ですが、AIはよくタグ指定を間違うので目視して確かめることをお勧めします。

実行は、ComfyUIが起動した状態で POST /prompt を呼び出し、成功時はレスポンスとしてprompt_idが返ります。

import json
import uuid
import requests

server = "http://127.0.0.1:8188"
client_id = str(uuid.uuid4())

with open("workflow_api.json", "r", encoding="utf-8") as f:
    prompt = json.load(f)

# 例:ノードID 74:14内の曲調タグ"tags"、歌詞"lyrics"を指定。JSONに合わせて差し替える
prompt["74:14"]["inputs"]["tags"] = "lofi, warm, mellow, jazz"
prompt["74:14"]["inputs"]["lyrics"] = "[instrumental]"

payload = {"prompt": prompt, "client_id": client_id}
r = requests.post(f"{server}/prompt", json=payload, timeout=60)
r.raise_for_status()
prompt_id = r.json()["prompt_id"]

これで画面上のUIにプロンプトを入力し、実行ボタンを押したと同じ処理となり、ComfyUIサーバ側でワークフローが実行されます。

環境によりますが生成には数分程度かかるため、生成が終わったタイミングでダウンロードを行う必要があります。

今回のようにローカルでのComfyUI実行であれば、終わった頃にComfyUIの出力フォルダを直接覗く方法もシンプルです。

完了確認はWebSocketかGETで行う

生成が終わったかどうかを知る方法は2つあります。

確実なのは WebSocket (/ws) で進捗メッセージを受け取り、最後に実行完了の通知”executed”を待つ方法です。ただWebSocketは少し複雑な実装になるため、別の記事で取り扱います。

ACE-Stepは比較的短時間で生成が完了するため、WebSocketでの接続は省略し、GET /history/{prompt_id} をポーリングしても良いでしょう。

出力ファイルはhistoryから辿ってviewで取り出す

完了後は /history/{prompt_id} のレスポンスに、保存されたファイル名やディレクトリ情報が入ります。

そこから GET /view でファイルを取得できます。公式のドキュメントでは画像向けの説明が中心ですが、公式Routesでは「view an image」として実装参照の案内があり、用途に応じてパラメータ指定で取り出します)。

まとめ

ComfyUIのAPI利用は、ComfyUIで作ったACE-StepワークフローをAPI形式で書き出し、Pythonから POST /prompt で実行し、**GET /history/{prompt_id}**(必要なら /ws)で完了と出力を確認する流れです。

ここまでできると、プロンプトを変えながらの連続生成や、夜間バッチの「自動ガチャ」も可能になります。

次回はこの土台を使って、プロンプト候補の生成と実行を一気通貫にして効率化します。

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