# ACE-Step OpenRouter API ドキュメント > OpenAI Chat Completions 互換の AI 音楽生成 API **ベース URL:** `http://{host}:{port}`(デフォルト `http://127.0.0.1:8002`) --- ## 目次 - [認証](#認証) - [エンドポイント一覧](#エンドポイント一覧) - [POST /v1/chat/completions - 音楽生成](#1-音楽生成) - [GET /v1/models - モデル一覧](#2-モデル一覧) - [GET /health - ヘルスチェック](#3-ヘルスチェック) - [入力モード](#入力モード) - [オーディオ入力](#オーディオ入力) - [ストリーミングレスポンス](#ストリーミングレスポンス) - [リクエスト例](#リクエスト例) - [エラーコード](#エラーコード) --- ## 認証 サーバーに API キーが設定されている場合(環境変数 `OPENROUTER_API_KEY` または起動パラメータ `--api-key`)、すべてのリクエストに以下のヘッダーが必要です: ``` Authorization: Bearer ``` API キーが未設定の場合、認証は不要です。 --- ## エンドポイント一覧 ### 1. 音楽生成 **POST** `/v1/chat/completions` チャットメッセージから音楽を生成し、オーディオデータと LM が生成したメタ情報を返します。 #### リクエストパラメータ | フィールド | 型 | 必須 | デフォルト | 説明 | |---|---|---|---|---| | `model` | string | いいえ | 自動 | モデル ID(`/v1/models` から取得) | | `messages` | array | **はい** | - | チャットメッセージリスト。[入力モード](#入力モード)を参照 | | `stream` | boolean | いいえ | `false` | ストリーミングレスポンスを有効にする。[ストリーミングレスポンス](#ストリーミングレスポンス)を参照 | | `audio_config` | object | いいえ | `null` | オーディオ生成設定。下記参照 | | `temperature` | float | いいえ | `0.85` | LM サンプリング温度 | | `top_p` | float | いいえ | `0.9` | LM nucleus sampling パラメータ | | `seed` | int \| string | いいえ | `null` | ランダムシード。`batch_size > 1` の場合、カンマ区切りで複数指定可能(例: `"42,123,456"`) | | `lyrics` | string | いいえ | `""` | 歌詞を直接指定(messages から解析された歌詞より優先)。設定時、messages テキストは prompt として扱われる | | `sample_mode` | boolean | いいえ | `false` | LLM sample モードを有効化。messages テキストが sample_query として LLM に渡され、prompt/lyrics が自動生成される | | `thinking` | boolean | いいえ | `false` | LLM の thinking モード(深い推論)を有効にする | | `use_format` | boolean | いいえ | `false` | ユーザーが prompt/lyrics を提供した場合、LLM でフォーマット・強化する | | `use_cot_caption` | boolean | いいえ | `true` | CoT で音楽説明文を書き換え・強化する | | `use_cot_language` | boolean | いいえ | `true` | CoT でボーカル言語を自動検出する | | `guidance_scale` | float | いいえ | `7.0` | Classifier-free guidance scale | | `batch_size` | int | いいえ | `1` | 生成するオーディオの数 | | `task_type` | string | いいえ | `"text2music"` | タスクタイプ。[オーディオ入力](#オーディオ入力)を参照 | | `repainting_start` | float | いいえ | `0.0` | repaint 領域の開始位置(秒) | | `repainting_end` | float | いいえ | `null` | repaint 領域の終了位置(秒) | | `audio_cover_strength` | float | いいえ | `1.0` | カバー強度(0.0〜1.0) | #### audio_config オブジェクト | フィールド | 型 | デフォルト | 説明 | |---|---|---|---| | `duration` | float | `null` | オーディオの長さ(秒)。省略時は LM が自動決定 | | `bpm` | integer | `null` | テンポ(BPM)。省略時は LM が自動決定 | | `vocal_language` | string | `"en"` | ボーカル言語コード(例: `"zh"`, `"en"`, `"ja"`) | | `instrumental` | boolean | `null` | インストゥルメンタル(ボーカルなし)かどうか。省略時は歌詞に基づき自動判定 | | `format` | string | `"mp3"` | 出力オーディオフォーマット | | `key_scale` | string | `null` | 調号(例: `"C major"`) | | `time_signature` | string | `null` | 拍子(例: `"4/4"`) | > **messages テキストの意味はモードにより異なります:** > - `lyrics` を設定 → messages テキスト = prompt(音楽の説明) > - `sample_mode: true` を設定 → messages テキスト = sample_query(LLM にすべて生成させる) > - どちらも未設定 → 自動検出:タグがあればタグモード、歌詞らしければ歌詞モード、それ以外は sample モード #### messages フォーマット プレーンテキストとマルチモーダル(テキスト+オーディオ)の2つの形式をサポート: **プレーンテキスト:** ```json { "messages": [ {"role": "user", "content": "入力内容"} ] } ``` **マルチモーダル(オーディオ入力あり):** ```json { "messages": [ { "role": "user", "content": [ {"type": "text", "text": "この曲をカバーして"}, { "type": "input_audio", "input_audio": { "data": "", "format": "mp3" } } ] } ] } ``` --- #### 非ストリーミングレスポンス (`stream: false`) ```json { "id": "chatcmpl-a1b2c3d4e5f6g7h8", "object": "chat.completion", "created": 1706688000, "model": "acemusic/acestep-v15-turbo", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "## Metadata\n**Caption:** Upbeat pop song...\n**BPM:** 120\n**Duration:** 30s\n**Key:** C major\n\n## Lyrics\n[Verse 1]\nHello world...", "audio": [ { "type": "audio_url", "audio_url": { "url": "data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAA..." } } ] }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 10, "completion_tokens": 100, "total_tokens": 110 } } ``` **レスポンスフィールド説明:** | フィールド | 説�� | |---|---| | `choices[0].message.content` | LM が生成したテキスト情報。Metadata(Caption/BPM/Duration/Key/Time Signature/Language)と Lyrics を含む。LM が関与していない場合は `"Music generated successfully."` を返す | | `choices[0].message.audio` | オーディオデータ配列。各項目に `type`(`"audio_url"`)と `audio_url.url`(Base64 Data URL、形式: `data:audio/mpeg;base64,...`)を含む | | `choices[0].finish_reason` | `"stop"` は正常完了を示す | **オーディオのデコード方法:** `audio_url.url` の値は Data URL 形式です: `data:audio/mpeg;base64,` カンマ以降の base64 データ部分を抽出してデコードすると MP3 ファイルが得られます: ```python import base64 url = response["choices"][0]["message"]["audio"][0]["audio_url"]["url"] # "data:audio/mpeg;base64," プレフィックスを除去 b64_data = url.split(",", 1)[1] audio_bytes = base64.b64decode(b64_data) with open("output.mp3", "wb") as f: f.write(audio_bytes) ``` ```javascript const url = response.choices[0].message.audio[0].audio_url.url; const b64Data = url.split(",")[1]; const audioBytes = atob(b64Data); // Data URL を直接