音声テキスト変換
POST /v1/audio/transcriptions
音声をテキストに転写します。OpenAI Audio Transcriptions API と互換性があります——同じエンドポイントが OpenAI Whisper / GPT-4o-transcribe モデルと Google Gemini モデルの両方に対応し、gateway はモデル ID に基づいて適切な上流へルーティングします。次のいずれかを受け付けます multipart/form-data アップロード(OpenAI SDK 互換)、または application/json base64 エンコードされた音声を含むボディ。
リクエストボディ
| パラメータ | 型 | 説明 |
|---|---|---|
model* | string | 文字起こしモデル ID(例:whisper-1、gpt-4o-transcribe、chirp-3、seed-asr-bigmodel、fun-asr、qwen3-asr-flash)。下記の「サポートされるモデル」を参照してください。 |
file* | file | multipart のみ — 文字起こしする音声ファイル。input_audio(JSON)を指定する場合を除き必須。 |
input_audio* | object | JSON のみ — { "data": "<base64>", "format": "mp3" }、またはオフラインモデル(seed-asr-bigmodel)の場合は { "url": "<fetchable URL>" }。application/json リクエストでは file の代わりに使用してください。 |
response_format | string | 出力形式:json(デフォルト。{text, usage} を返す)、text(生の文字起こし文字列)、verbose_json(タイムスタンプ付きセグメント)、diarized_json(話者ラベル付きセグメント — 話者分離)。使用可能な値はモデルに依存します。下記の「レスポンス形式」を参照してください。 |
language | string | オプションの ISO-639-1 ヒント(例:"en")。精度向上とレイテンシ短縮に役立ちます。 |
prompt | string | オプションのテキスト。文字起こしのスタイルや固有名詞のスペルを誘導します。 |
temperature | number | サンプリング温度 0–1。デフォルト:0。 |
stream | boolean | true の場合、部分的な文字起こしの SSE イベントを返します(gpt-4o-transcribe と Gemini で対応)。デフォルト:false。 |
provider | object | Provider パススルー設定。以下の「Provider パススルー」を参照。 |
サポートされるモデル
どのモデルを選べばいいか迷ったら?必要な条件で選びましょう
| 必要なもの | 有効化する方法 | 推奨モデル |
|---|---|---|
| 中国語 / 広東語、低コスト | — | seed-asr-bigmodel fun-asr |
| 英語、高品質 | — | gpt-4o-transcribe chirp-3 |
| 話者分離——誰が何を話したか | response_format=diarized_json | seed-asr-bigmodel chirp-3 gpt-4o-transcribe-diarize |
| 単語レベルのタイムスタンプ | response_format=verbose_json | whisper-1 |
| リアルタイム字幕(話しながら) | stream=true | gpt-4o-transcribe |
| 長時間の録音 / 会議 | pass a public URL in input_audio.url | seed-asr-bigmodel fun-asr |
| モデル | プロバイダー · 課金 | 入力 | 話者分離 | ストリーム | 最適な用途 |
|---|---|---|---|---|---|
whisper-1 | OpenAI · $0.006/min | file | — | — | 単語レベルのタイムスタンプ(verbose_json)。言語は ISO-639-1 必須 |
gpt-4o-transcribe | OpenAI · token | file | — | ✓ | 英語、高精度。ストリーミング対応 |
gpt-4o-mini-transcribe | OpenAI · token | file | — | ✓ | 低コストな多言語対応。ストリーミング対応 |
gpt-4o-transcribe-diarize | OpenAI · token | file | ✓ | — | 英語の話者分離。known_speaker_names は任意 |
chirp-3 | Google · $0.016/min | file | ✓ | — | 高品質。1 回の呼び出しは ≤60 s |
chirp-2 | Google · $0.016/min | file | — | — | 多言語 USM。話者分離には chirp-3 を使用 |
seed-asr-bigmodel | BytePlus · $0.002/min | URL / file | ✓ | — | 中国語、長時間録音。最も安価 |
fun-asr | Alibaba · $0.0021/min | URL / file | ✓ | — | 中国語 · 広東語 · 方言。長時間録音 |
fun-asr-mtl | Alibaba · $0.0021/min | URL / file | ✓ | — | 多言語 + 話者分離 |
fun-asr-flash | Alibaba · $0.0021/min | file | — | — | 高速な多言語対応。≤10 MB、同期 |
qwen3-asr-flash | Alibaba · $0.0021/min | file | — | — | 多言語対応。≤5 min/呼び出し、正確な課金 |
Diarization = response_format=diarized_json を設定すると segments[].speaker が得られます。デフォルトのアップロード上限は 25 MB(音声フォーマットを参照)。
Google モデルは Gemini API 経由、または BYOK Vertex サービスアカウントキーを使用して Google Cloud Vertex AI 経由で提供できます。利用可否はワークスペースで有効化されたチャネルによります — /v1/models を呼び出して、使用可能なものを確認してください。
よくある落とし穴。 (1) ストリーミング(stream=true)は gpt-4o-transcribe / gpt-4o-mini-transcribe でのみ機能します — それ以外のすべてのモデルは 400 を返します。(2) input_audio.url(URL 入力)は seed-asr-bigmodel でのみサポートされます。その他のすべてのモデルは file または base64 アップロードが必要です。(3) OpenAI モデル(whisper-1, gpt-4o-*)の language パラメータは en や zh のような ISO-639-1 コードでなければなりません — yue-CN のようなロケールコードは拒否されます。Chirp / Seed ASR / Qwen はロケールコードを受け付けます。または language を省略すると自動検出されます。(4) 音声がモデルのリクエストごとの上限を超える場合は、チャンクに分割してください — あるいは長時間の録音には seed-asr-bigmodel(URL 経由)を使用してください(約20分/リクエスト)。(5) 無音 / 発話なしの音声はエラーではなく、空文字列 {"text":""} とともに 200 を返します。
サポートされる音声フォーマット
mp3wavoggflacm4a
multipart アップロードの場合、フォーマットはファイル名の拡張子から推測されます。base64(JSON)リクエストの場合は input_audio.format を明示的に設定してください。最大アップロードサイズ: 25 MB。
レスポンス形式
この response_format 受け付けられる値はモデルによります。 json はすべてのモデルのデフォルトです(返すのは { text, usage }); text 生の文字起こし文字列を返します。
whisper-1—json,text,verbose_jsongpt-4o-transcribe,gpt-4o-mini-transcribe—json,textchirp-3,chirp-2,seed-asr-bigmodel,qwen3-asr-flash,fun-asr-flash—json,textgpt-4o-transcribe-diarize,chirp-3,seed-asr-bigmodel,fun-asr,fun-asr-mtl— alsodiarized_json(話者ラベル付きセグメント。詳細は後述)
verbose_json (セグメントのタイムスタンプ)は whisper-1 のみ;
話者ダイアライゼーション
response_format=diarized_json を設定すると、話者ラベル付きのセグメントが得られます。レスポンスには segments 配列が追加され、各エントリに speaker ラベルと start/end のタイムスタンプ(秒)が含まれます。gpt-4o-transcribe-diarize(OpenAI)、chirp-3(Google)、seed-asr-bigmodel(BytePlus——中国語と長時間録音に最もコスト効率が良い)、および fun-asr / fun-asr-mtl(Alibaba——オフラインの録音ファイル、URL またはファイルを受け付け)で対応。その他のモデルは diarized_json を無視してプレーンテキストを返します。chirp-2 は拒否します(chirp-3 を使用してください)。
話者ラベルはプロバイダー固有です(例:chirp-3 と seed-asr では "0"/"1"、gpt-4o-transcribe-diarize では "A"/"B")。異なる話者を区別しますが、安定した実世界の識別情報ではありません。gpt-4o-transcribe-diarize では known_speaker_names を渡してラベリングを誘導できます。
# Chinese meeting, cheapest diarization (BytePlus seed-asr):
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-asr-bigmodel",
"input_audio": { "url": "https://your-bucket/signed/meeting.wav", "language": "zh" },
"response_format": "diarized_json"
}'
# English / highest quality (Google chirp-3, <=60 s per request):
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=chirp-3 \
-F file=@call.wav \
-F response_format=diarized_json レスポンス例
{
"task": "transcribe",
"text": "喂 你好 我这边是客服 有什么可以帮您",
"duration": 6.2,
"segments": [
{ "id": 0, "start": 0.10, "end": 0.90, "speaker": "0", "text": "喂 你好" },
{ "id": 1, "start": 1.20, "end": 6.20, "speaker": "1", "text": "我这边是客服 有什么可以帮您" }
]
} リクエスト例(multipart)
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=gpt-4o-transcribe \
-F file=@meeting.mp3 \
-F response_format=json \
-F language=en リクエスト例(base64 JSON)
POST /v1/audio/transcriptions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"model": "gpt-4o-transcribe",
"input_audio": {
"data": "UklGRiQAAABXQVZFZm10I...",
"format": "wav"
},
"response_format": "json",
"language": "en"
} 例 — オフライン ASR (seed-asr-bigmodel)
seed-asr-bigmodel(BytePlus の海外向けオフライン ASR)は、相互排他的な2種類の入力を受け付けます。取得可能な input_audio.url(推奨 — ご自身の有効期限付き署名済みオブジェクトストレージ URL。音声が当社のストレージに保存されることはありません)、または直接の file/バイトアップロード(プライベートバケットに一時保管し、文字起こし完了後すぐに削除します)。制限事項: ストリーミング非対応(stream=true は 400 を返します)。ファイルアップロードは最大 25 MB(それより大きい録音には URL を使用してください)。1リクエストあたりの処理は約20分が上限のため、非常に長い音声は分割してください。音声の長さに基づいて課金されます($0.002/min)。
# ① Quick test — replace ONLY YOUR_API_KEY and run it (uses our hosted sample audio).
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-asr-bigmodel",
"input_audio": {
"url": "https://synthorai-asr-sample-360831509259.s3.us-west-1.amazonaws.com/seed-asr-sample.wav",
"language": "zh"
}
}'
# → {"text":"..."}
# ② Your own audio file (<=25 MB) — replace key + file path.
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F model=seed-asr-bigmodel \
-F language=zh \
-F file=@/path/to/your-audio.wav
# ③ Your own signed URL (recommended for large files / privacy) — replace key + URL.
curl https://synthorai.io/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"seed-asr-bigmodel","input_audio":{"url":"https://your-bucket/signed/meeting.wav","language":"zh"}}' 注意 / 落とし穴: (1) language は任意です — 一般的な値は zh(標準中国語)、yue-CN(広東語)、en-US です。省略すると自動検出されます。(2) input_audio.url を使用する場合、その URL は文字起こしサービスから公開アクセスで取得可能でなければなりません — プライベート/内部/認証必須の URL は失敗します。有効期限付きの署名済み(事前署名済み)オブジェクトストレージ URL が推奨される方法です。(3) ファイルアップロードと URL は相互排他的です。いずれか一方を選択してください。(4) 認識可能な発話がない音声(無音)はエラーではなく、空文字列 {"text":""} とともに 200 を返します。
例 — OpenAI Python SDK
このエンドポイントは OpenAI 互換のため、公式 OpenAI SDK は以下をオーバーライドするだけで直接動作します base_url. whisper-1、gpt-4o-transcribe、および任意の Gemini 文字起こしモデルでも同じように動作します — 変更するのは model.
from openai import OpenAI
client = OpenAI(
base_url="https://synthorai.io/v1",
api_key="YOUR_API_KEY",
)
with open("meeting.mp3", "rb") as f:
result = client.audio.transcriptions.create(
model="gpt-4o-transcribe",
file=f,
language="en",
# prompt="Synthorai, BYOK, transcribe", # optional vocabulary hint
response_format="json",
)
print(result.text)
# Token-level usage on gpt-4o-*:
if getattr(result, "usage", None):
print(result.usage) 例 — OpenAI Node.js SDK
import OpenAI from "openai";
import fs from "node:fs";
const client = new OpenAI({
baseURL: "https://synthorai.io/v1",
apiKey: process.env.SYNTHORAI_API_KEY,
});
const result = await client.audio.transcriptions.create({
model: "gpt-4o-transcribe",
file: fs.createReadStream("meeting.mp3"),
language: "en",
response_format: "json",
});
console.log(result.text); ストリーミング(SSE)
設定: stream=true 対象: gpt-4o-transcribe, gpt-4o-mini-transcribe、または任意の Gemini 文字起こしモデルを使用すると、音声のデコード中に増分イベントを受信できます。レスポンスの Content-Type は text/event-stream とイベントは以下で終了します data: [DONE]。whisper-1 はストリーミングに対応していません(設定すると 400 を返します stream=true).
gpt-4o-transcribe で表示されるイベントタイプ:
data: {"type":"transcript.text.delta","delta":"Hello "}
data: {"type":"transcript.text.delta","delta":"world."}
data: {"type":"transcript.text.done","text":"Hello world."}
data: {"type":"usage","usage":{"type":"tokens","input_tokens":689,"output_tokens":287,"total_tokens":976,"input_token_details":{"audio_tokens":689,"text_tokens":0,"cached_tokens":0}}}
data: [DONE] Gemini streaming は同じ SSE イベント名を使用し、ゲートウェイは同じ正規化された usage オブジェクトを発行します。以下に記載されています レスポンス例— OpenAI と Gemini で同一 — のため、クライアントコードは provider 間で移植可能です。最終の usage イベントは常に完全な input_token_details 内訳を含み、正確な音声レート課金に使用されます。
エラー
すべてのエラーは OpenAI のエンベロープ形式に従います: { error: { message, type, code, param? } }. よくあるケース:
400 model_not_found——このワークスペースのチャネルでは、モデルが転写機能を持っていません。400 byok_strict_no_key——ワークスペースが厳格な BYOK モードであり (byok_fallback_to_pool=false) であり、解決されたプロバイダー用の vault key がありません。400 content_policy_violation——このpromptフィールドがガードレールルールに抵触しました(例:BYOK key の漏洩)。402 quota_exceeded——推定コストがワークスペースの残りクォータを超えています。BYOK は対象外です。408——リクエストボディがサーバーの読み取りタイムアウト内にアップロードを完了しませんでした。遅い接続で大きな音声を送る際によく発生します。再試行するか、より小さなファイルを送信してください。413——音声が 25 MB の上限を超えています。502 upstream_error——上流のネットワーク障害、またはモデルプロバイダーからの 2xx 以外のレスポンス。
レスポンス例
{
"text": "Thanks for joining today's call. Let's get started.",
"usage": {
"type": "tokens",
"input_tokens": 689,
"output_tokens": 287,
"total_tokens": 976,
"input_token_details": {
"audio_tokens": 689,
"text_tokens": 0,
"cached_tokens": 0
}
}
} 統一された使用量オブジェクト。 token 課金されるすべてのモデル(gpt-4o-*、Gemini、Vertex)は、この完全に同一の形状を返します——すべてのフィールドが常に存在し、プロバイダーがサブカウントを報告しない場合はゼロで埋められます——そのため同じクライアントコードでプロバイダーをまたいで使用量を読み取れます。転写の入力はすべて音声であるため、Gemini/Vertex は次を報告します input_token_details.audio_tokens == input_tokens (テキスト分割なし)。OpenAI はネイティブの音声/テキスト分割を報告します。 cached_tokens は、プロバイダー側のキャッシュから提供される入力の部分です。
whisper-1 は唯一の例外です:token ではなく音声の長さで課金されるため、レスポンスに token 使用量オブジェクトを含みません。 response_format=text の場合、レスポンスボディは JSON オブジェクトではなく生の転写文字列になります。