音声とモデル一覧
GET /v1/chat/catalog は公開モデル、音声、現在の料金を返します。テキストは POST /v1/chat/completions、音声は下記のエンドポイントを使います。
モデルと料金
モデル一覧を読み込み中…
音声認識
POST /v1/chat/transcribe に { "audio": "data:audio/webm;base64,..." } を送信します。通常の base64 も利用可能で、デコード後の上限は 10 MB です。text と language が返ります。
音声合成
モデル一覧を読み込み中…
モデルを展開すると有効な音声の名前、ID、言語を確認できます。無効な音声は一覧から除外され、新規合成に使用できません。モデルを無効にすると、その配下の全音声も除外されます。再有効化しても音声ごとの設定は保持されます。既定の音声またはモデルが無効なら、別の有効な音声が選ばれます。更新ボタンで最新状態を取得できます。
POST /v1/chat/speech は { "text": "Hello", "voice": "speech-light:af_bella" } を受け付けます。テキストは最大 2,000 文字です。voice を省略すると既定の音声を使います。一覧の voices[].id を指定してください。modelId は音声モデルと料金に対応します。音声とチャットのモデルは独立しています。
レスポンスは audio(data:audio/mpeg;base64,...)、voice、billing: { model, credits, characters, price, unit: "1000_characters" } を含みます。Speech Pro を含め全音声が MP3 です。audio を音声要素の src に指定するか、カンマ以降の base64 をデコードして .mp3 として保存できます。Python サンプルも利用できます。
ストリーミング音声
同じエンドポイントに "stream": true を指定します。Speech Standard、Speech Light、Speech Pro、Speech Expressive が対応し、一覧の speechModels[].streaming で確認できます。省略または false の場合は通常の JSON です。
{ "text": "Hello. How was your day?", "voice": "speech-pro:Ashley", "stream": true }応答は Content-Type: audio/mpeg の連続した MP3 バイナリです。JSON、base64、SSE ではありません。プロキシは届いた音声を逐次転送し、Speech Pro は逐次 MP3 へ変換します。モデル自体の生成速度を保証するものではありません。テキストは 1 リクエストで送信され、自動的に文分割されません。
curl と FFmpeg を使うと受信中から再生できます。
curl --fail --no-buffer https://api.coldstart.win/v1/chat/speech \
-H "Authorization: Bearer $COLDSTART_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello. How was your day?","voice":"speech-pro:Ashley","stream":true}' \
| ffplay -nodisp -autoexit -f mp3 -i pipe:0通話クライアントでは受信データを継続的な MP3 デコーダーへ渡してください。ブラウザーでは response.body.getReader() を使用します。blob()、arrayBuffer()、json() は全体の受信完了を待ちます。ネットワークのチャンクは任意のバイト範囲で、独立した MP3 ファイルではありません。割り込みや切断時には fetch と reader を中断してください。再生開始にはブラウザーが求めるユーザー操作が必要です。
ヘッダーには X-Speech-Voice(URL エンコード済み公開 ID)、X-Speech-Credits、X-Speech-Characters、X-Speech-Usage-Id が含まれます。クレジット値は最初の引き落とし額で、成功時は非ストリーミングと同じ料金です。サーバー処理完了前の失敗や切断は返金され、失敗として記録されます。完了後のキャンセルでは成功済みの料金は取り消されません。
音声開始前は通常の HTTP ステータスと JSON エラーです。開始後の失敗は接続を切断します。不完全な音声を破棄し、利用履歴で最終料金を確認してください。HTTP 200 や最初のチャンクだけでは完了を保証できません。追加のプロキシではこのルートのバッファリングと圧縮を無効にします。API は X-Accel-Buffering: no と Cache-Control: no-store, no-transform を返します。
テキストがコンテンツポリシーで明示的に拒否された場合、両モードとも音声開始前に 400 content_policy_violation を返して返金します。同じテキストを自動再送せず、ポリシーに適合するよう修正してください。ストリーミングでもコンテンツ制限は適用されます。
音声リクエストは独立しています。必要な公開音声 ID を明示してください。通常は音声 data URI と課金情報の JSON、ストリーミングでは音声バイトを返します。
音声料金は正規化後の課金文字数 × 単価 ÷ 1,000 を小数点以下 8 桁へ切り上げます。Speech Light、Pro、Expressive は UTF-16 コード単位(😀 は 2)、Standard は Unicode コードポイントです。規則は speechModels[].characterCounting と billing.character_counting(utf16_code_units または unicode_codepoints)、数量は billing.characters に示されます。書式やト書きは合成・計数前に除去されます。失敗または空の音声は返金されます。合成は毎回課金されますが、返された音声の再生は無料です。コンソールは現在のページセッション中、メッセージと音声ごとに音声をキャッシュします。