ComfyUI APIで生成した音楽ファイルをダウンロードする方法

前回の記事では、ComfyUIのAPIを利用して、ACE-Stepによる音楽生成の進捗をWebSocketで受け取る方法を紹介しました。

パレイド
ComfyUI APIでWebSocket進捗を確認しながらACE-Step音楽生成を行う
ComfyUIのWebSocket APIを使い、ACE-Step音楽生成の進捗をリアルタイムに受け取りながらPythonで処理する基本構造と実装例を整理します。

今回はその続きとして、生成が完了した音楽ファイルをAPI経由でダウンロードする方法を試します。

ComfyUIのAPI構成を整理する

ComfyUIのAPIは、生成ジョブの投入、進捗確認、生成結果の取得をHTTPベースで行う仕組みです。

生成結果そのものは即時に返ってくるわけではなく、まず /prompt によってジョブを投入し、完了後に /history/{prompt_id} で出力情報を確認します。

実ファイルの取得は、その履歴情報をもとに /view エンドポイントを使って行います。

この流れは公式ドキュメントのサーバールート一覧でも説明されており、ComfyUIのAPI利用の基本となる考え方です。
https://docs.comfy.org/development/comfyui-server/comms_routes

historyから出力ファイルを特定する

/history/{prompt_id} をGETすると、そのジョブで実行されたノードと出力結果がJSONで返ってきます。

prompt_id には、ジョブ投入時に返されるIDを渡します。

パレイド
簡単にローカルで試せる音楽生成AI: ComfyUIでACE-Stepを使う
ComfyUIのテンプレートを使い、ACE-Stepでインストゥルメンタル/歌入り音楽を生成して保存するまでを、迷わずできる形でまとめます。

ACE-Stepの場合、音楽ファイルは audio タイプの出力として記録されます。ここで取得できる情報には、ファイル名、保存サブフォルダ、出力タイプが含まれます。

この段階では「どのファイルが生成されたか」を特定するだけで、次に実データを取得します。

/viewエンドポイントでダウンロードする

特定したファイルは /view エンドポイントを使ってダウンロードします。

公式ドキュメントでは画像取得の例が示されていますが、音声ファイルも同様に取得できます。

以下は、historyから最初の音楽ファイルを1つダウンロードする処理を抜粋したPythonコード例です。事前に /prompt による生成ジョブが完了している前提になります。

import requests

COMFY_BASE = "http://127.0.0.1:8188"
COMFY_HISTORY = f"{COMFY_BASE}/history"
COMFY_VIEW = f"{COMFY_BASE}/view"

def download_first_audio(prompt_id: str, out_path: str):
    r = requests.get(f"{COMFY_HISTORY}/{prompt_id}", timeout=30)
    r.raise_for_status()
    hist = r.json()
    entry = hist.get(prompt_id, {})
    outputs = entry.get("outputs")

    for out in outputs.values():
        if not isinstance(out, dict):
            continue
        if "audio" in out and out["audio"]:
            item = out["audio"][0]
            filename = item.get("filename")
            if not filename:
                continue
            params = {
                "filename": filename,
                "type": item.get("type", "output")
            }
            if item.get("subfolder"):
                params["subfolder"] = item["subfolder"]

            vr = requests.get(COMFY_VIEW, params=params, timeout=60)
            vr.raise_for_status()
            with open(out_path, "wb") as f:
                f.write(vr.content)
            return out_path

    raise RuntimeError("audio file not found in history")

このように、ComfyUIのAPIでは「履歴で確認してから取得する」という二段階構成が基本です。

出力ファイル削除に関する注意点

現在のローカルComfyUIには、API経由で output フォルダ内の生成ファイルを削除するための標準エンドポイントは用意されていません

これは公式ドキュメントやルート一覧にも明示的に記載されておらず、削除操作は想定外とされています。GithubのIssueでも同様の指摘があり、将来的な対応が検討されています。

そのため、ローカル環境で不要なファイルを整理したい場合は、OSレベルでのファイル操作や、定期的なクリーンアップスクリプトで対応します。

このためAPI経由でダウンロードするよりも、ComfyUIの出力フォルダにアクセスしてファイルを直接操作する方が効率的な場合もあり、OSのファイル操作で処理を行う方法も構成によっては現実的なオプションとなります。

なおComfyUI Cloudなどのクラウド提供環境では、ユーザーデータ削除用のAPIが別途用意されており、ローカル版とは仕様が異なります。
https://docs.comfy.org/development/cloud/api-reference

まとめ

ComfyUI APIで生成した音楽ファイルは、/history/{prompt_id} で出力情報を確認し、/view を使ってダウンロードするのが基本手順です。

生成と取得を分離した設計を理解しておくことで、Pythonなど外部ツールからでも安全に自動処理を組めます。

次回は、これらの取得処理をバッチ化し、複数ジョブをまとめて扱う実践的な構成を解説します。

パレイド
ComfyUI APIでACE-Step音楽生成を自動化する全体像まとめ
ComfyUIとACE-StepをPythonからAPI操作する一連の流れを整理し、生成・進捗確認・ダウンロードまでを迷わず実装できる形でまとめます。
パレイド
ChatGPTでバイブコーディング: 音楽生成AIの「ガチャ」用GUIを構築
前回まで、ACE-StepとComfyUI APIを利用して、AIによる音楽生成の自動化を試してきました。 これで夜間のバッチ処理で大量に生成することができます…
パレイド
ACE-Stepによる音楽生成AIの「ガチャ」自動化に挑む
ACE-StepとComfyUI APIを使った音楽生成を自動化し、生成結果を数値評価して「ガチャ」を回す仕組みを解説します。
[NEXT] TECH · 其の4250
Stable Audio 3 Medium を RTX 4070 + ComfyUI で動かす|380 秒生成と VRAM 崖の現在地
[NEXT] TECH · 其の4203
Anima Base v1.0 と Turbo LoRA を比べる — M5 Air で 7-8 倍、ただし同 seed でも別の画が出る