跳到內容

語音轉文字

RouteAPI 提供兩個 OpenAI 語音轉文字端點:轉錄依音訊原語言回傳文字,翻譯則一律回傳英文。兩者都以 multipart/form-data 送出,結果在同一個回應中返回——沒有非同步任務或輪詢步驟——並且與模型呼叫 API 的其他介面使用同一個 API Key 認證。

端點用途回應
POST /v1/audio/transcriptions音訊轉文字,使用來源語言JSON 或文字,取決於 response_format
POST /v1/audio/translations音訊轉英文文字JSON 或文字,取決於 response_format

如果你的用戶端 Base URL 設定時沒有帶上 /v1,POST /audio/transcriptions 和 POST /audio/translations 同樣可用;閘道會在內部改寫為 /v1 路徑。

以原始語言轉錄音訊檔案。請以 multipart/form-data 送出。

POST /v1/audio/transcriptions
https://api.routeapi.ai/v1/audio/transcriptions
欄位類型必填說明
filefile是音訊檔案。只會轉發第一個 file 部分
modelstring是轉錄模型 ID,例如 whisper-1、gpt-4o-transcribe 或 gpt-4o-mini-transcribe
response_formatstring否要求的輸出格式,例如 json、text、srt、vtt 或 verbose_json。RouteAPI 會將 json 記錄為預設值,但不會把預設值寫入轉發的表單——省略這個欄位時,由上游套用自己的預設值,上游主體會原樣返回
languagestring否ISO-639-1 語言提示,轉發給上游
promptstring否上下文/術語提示,轉發給上游
temperaturenumber否取樣溫度,轉發給上游
timestamp_granularities[]array否時間戳細節層級;會原樣轉發,且在上游只有搭配 verbose_json 才有意義

其他表單欄位也會一併轉發。 閘道會從你的表單重建 multipart 主體:它自己寫入 model、複製第一個檔案部分,並把其餘所有文字欄位原樣複製。RouteAPI 只驗證 model;chunking_strategy 這類欄位是否被採用,由上游模型決定。

Terminal window
curl https://api.routeapi.ai/v1/audio/transcriptions \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-F "file=@./meeting.mp3" \
-F "model=whisper-1" \
-F "response_format=json" \
-F "language=en"
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
with open("meeting.mp3", "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
response_format="json",
)
print(transcript.text)

上游回應主體會原樣返回,只會正規化 Content-Type 與 Content-Length。當 response_format 設為 json——OpenAI 相容上游的預設值——你會得到:

{
"text": "This is the transcribed content of the uploaded audio."
}

使用 verbose_json 時,通常還會得到 task、language、duration 與 segments;使用 text、srt 或 vtt 時,主體是純文字而非 JSON。特定模型實際支援其中哪些,由供應商定義——RouteAPI 不會重塑主體。

multipart 結構與轉錄相同,但輸出一律是英文文字,不論輸入語言。適用相同的欄位(file、model、response_format、prompt、temperature)。來源語言由模型偵測,因此翻譯介面沒有 language 參數——閘道會轉發額外的表單欄位,但不接受這些欄位的上游可能會拒絕請求。

POST /v1/audio/translations
https://api.routeapi.ai/v1/audio/translations
Terminal window
curl https://api.routeapi.ai/v1/audio/translations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-F "file=@./interview-de.mp3" \
-F "model=whisper-1"
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
with open("interview-de.mp3", "rb") as audio_file:
result = client.audio.translations.create(
model="whisper-1",
file=audio_file,
)
print(result.text)

語音轉文字呼叫與其他所有模型呼叫 API 請求一樣,透過相同的錢包與額度機制計費:先預扣一筆預估金額,上游回應後結算,失敗的呼叫會退還。價格來自模型的設定——音訊價格如何顯示在模型詳情頁,參見模型定價。

  • 如果上游回應包含 usage 物件且 total_tokens 非零,就按該用量計費(prompt_tokens/completion_tokens 缺席時,改用 input_tokens/output_tokens)。
  • 如果上游未回報用量,閘道會回退到時長估算:每分鐘上傳音訊 1000 個 token,且沒有輸出 token。在按 token 計價的模型上,同一個估算也會驅動預扣(下限為閘道對任何請求的最低預扣金額)。
  • 如果回報的用量帶有音訊 token 明細,這些 token 按音訊費率計價;否則按一般輸入 token、以模型倍率計價。時長回退沒有音訊明細,這也是為什麼每分鐘 1000 個 token 會與每分鐘費率對得上。
  • 套用回退時,轉錄成本取決於音訊長度,而不是返回多少文字。當上游確實回報用量時,以回報的明細為準。

音訊請求使用標準的 { "error": { ... } } 主體,訊息中會帶一個 request ID,你可以在控制台日誌中搜尋。完整清單參見常見錯誤。

狀態碼錯誤碼原因
400invalid_requestmodel 缺少或為空(Missing required field: model)
403insufficient_user_quota / pre_consume_token_quota_failed帳戶餘額或 Key 額度不足以涵蓋預估費用
403—模型不在該 Key 的模型白名單中(This token has no access to model ...)
429—請求速率超過限制
503model_not_found模型沒有可用渠道(No valid upstream service)
500count_token_failed無法量測上傳音訊的時長(不支援的副檔名或容器)
500convert_request_failed請求無法為該渠道轉換——例如沒有 file 部分的轉錄,或適配器未實作音訊的渠道
4xx / 5xx上游錯誤碼供應商拒絕了請求;狀態碼與訊息會原樣傳遞
{
"error": {
"message": "Missing required field: model (request id: 20261023153000123456789AbCdEfGh)",
"type": "error",
"code": "invalid_request"
}
}

有兩種失敗模式值得事先準備,因為它們很容易被誤認為供應商問題:

  • 缺少 file 的轉錄或翻譯不會被閘道的驗證層攔下;它會在之後以 convert_request_failed 出現。請確認欄位名稱正好是 file,且用戶端確實附加了部分。
  • 不支援的音訊容器會在 token 估算階段失敗,發生在任何上游呼叫之前,因此會回報為 count_token_failed,而不是上游錯誤。

請求失敗時,預扣的費用會退還。

  • 文字轉語音 —— 將文字合成為語音。
  • 模型 —— 呼叫音訊端點前,先確認模型 ID 對你的 Key 可見。
  • 模型定價 —— 音訊輸入與輸出價格如何顯示。
  • 常見錯誤 —— 狀態碼、錯誤主體與排查順序。