語音轉文字
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 | ✓ | — | 高品質;單次呼叫 ≤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 提供。可用性取決於為你的 workspace 啟用的通道 —— 呼叫 /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 參數必須是 ISO-639-1 代碼,例如 en 或 zh — 像 yue-CN 這類地區代碼會被拒絕;Chirp/Seed ASR/Qwen 則接受地區代碼,或省略 language 以自動偵測。(4) 若音訊超過某模型的單一請求上限,請將其切成多段 — 或對長錄音改用 seed-asr-bigmodel(透過 URL,約 20 分鐘/請求)。(5) 靜音/無語音的音訊會回傳 200 並附帶空字串 {"text":""},而非錯誤。
支援的音訊格式
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)接受兩種互斥的輸入:一個可抓取的 input_audio.url(建議使用 — 你自己的限時簽章物件儲存 URL;音訊絕不會經過我們的儲存空間),或直接上傳 file/位元組(我們會暫存於私有 bucket,並在轉錄完成後立即刪除)。限制:不支援串流(stream=true 會回傳 400);file 上傳上限為 25 MB(較大的錄音請改用 URL);單一請求的處理上限約為 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) file 上傳與 URL 互斥,請擇一使用。(4) 沒有可辨識語音的音訊(靜音)會回傳 200 並附帶空字串 {"text":""},而非錯誤。
範例 — 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——模型在該 workspace 的通道中不具備轉寫能力。400 byok_strict_no_key——workspace 處於嚴格 BYOK 模式 (byok_fallback_to_pool=false) 且沒有為解析出的供應商設定 vault key。400 content_policy_violation——該prompt欄位觸發了護欄規則(例如 BYOK key 洩漏)。402 quota_exceeded——預估成本超出 workspace 剩餘配額。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 物件。