Logo

這裡提供完整的開發指南與最佳實踐,幫助您快速上手。

教學

語音辨識

從本機音訊到 Base64 編碼、JSON 一次回完整辨識結果、時間戳與字幕格式、SSE 逐段輸出,整理一段完整的語音辨識流程。

本教學以 POST /api/v1/audio/transcriptions 為主軸。語音辨識端點吃 Base64 編碼後的音訊位元組,回傳純文字與可選的時間戳資料;同樣支援 SSE 模式做即時逐段輸出。

步驟 1:準備音訊資料

把音訊讀進記憶體後做 Base64 編碼。請務必移除 data:audio/...;base64, 前綴,端點只接受純 Base64 字串。伺服器會依音訊實際內容自動偵測格式,因此副檔名不影響辨識,但音訊內容必須真的屬於支援格式之一。

  • 支援格式:MP3、WAV、M4A、FLAC、OGG、WEBM。
  • JSON(Base64)路徑限 raw 音訊 ≤ 1 MB,超過會回 413 audio_too_long。
  • 音訊超過 1 MB 時,請改以 multipart/form-data 上傳原始檔案(≤ 15 MB):`params` JSON 欄位(本教學的參數去掉 audio_data)必須先於 `audio` 檔案欄位送出。完整欄位與錯誤碼見 API 參考的 ASR 端點。
  • 格式偵測失敗回 422 unsupported_audio_format;解碼失敗回 422 asr_audio_decode_error。

把本機音訊轉成單行 Base64。base64 -w 0 確保無換行。

bash
# Encode a local audio file (no line wrapping)
AUDIO_B64=$(base64 -w 0 ./meeting.mp3)
echo "$AUDIO_B64" | head -c 80
# Output (truncated): SUQzBAAAAAACSlBNTAAA...

步驟 2:發送 JSON 模式請求

預設 stream=false 會等辨識完成後一次回傳完整結果。language 可指定語言代碼或填 "auto" 由模型偵測;punctuation 預設為 true,會自動補齊辨識文字的標點。

JSON 模式 curl:以 jq 帶入 Base64 字串,避免 shell 對特殊字元誤處理。

bash
curl -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "zh-TW",
    timestamp_format: "json",
    diarization: true
  }')"

成功回應範例(HTTP 200)。timestamp_format="json" 時 segments 有值;切到 srt / webvtt 則改填 timestamps 字串。

json
{
  "text": "今天的會議改到下午三點。",
  "detected_language": "zh-TW",
  "segments": [
    {
      "id": 0,
      "start": 0.0,
      "end": 2.4,
      "text": "今天的會議改到下午三點。",
      "speaker": "A"
    }
  ],
  "timestamps": null,
  "usage": {
    "quota_percent": {
      "used": 35
    }
  },
  "forced_replacement_count": 0,
  "vocabulary_used": false
}

附加功能參數

以下參數皆為選填,可與 JSON 或 SSE 任一模式自由組合;未提供時套用預設值。前七列與文字翻譯端點共通,後三列為語音辨識專屬。

前七列為兩端點共通參數,後三列為語音辨識專屬。
參數型別預設說明
modelstring"tranc-std-v1"辨識模型代碼。目前可用清單可由 GET /audio/models 取得。
domainstring"general"內容領域提示,例如 "medical"、"legal"、"finance",協助術語辨識。
context{ speech: string }[][]場景背景或先前對話補充,依時間先後排列。
harm_content_filterbooleanfalse啟用有害內容過濾。被攔截時回 400 asr_content_policy_violation。
punctuationbooleantrue自動補齊辨識文字的標點。預設為 true,與文字翻譯端點的 false 相反。
number_format"spoken" | "arabic""spoken"數字轉寫方式:spoken 為口語化寫法,arabic 為阿拉伯數字(1234)。
date_format"natural" | "yyyy-MM-dd" | "yyyy/MM/dd" | "MM/dd/yyyy" | "dd-MM-yyyy""natural"日期呈現方式:natural 依語言慣例自然呈現,其餘為固定模板。
timestamp_format"json" | "srt" | "webvtt"未提供時不輸出時間戳語音辨識專屬。"json" 給結構化 segments;"srt" / "webvtt" 直接拿到字幕字串。
diarizationbooleanfalse語音辨識專屬。true 時 segments 內帶 speaker 字母標識("A" / "B" / "C"…),用於多人會議。
processing_mode"fast" | "balanced""balanced"語音辨識專屬。fast 速度較快,balanced 精度較高。長音訊或精度要求高時維持 balanced。

punctuation 的預設值兩端相反

語音辨識的 punctuation 預設為 true(會自動補標點),文字翻譯則預設 false。若您需要拿到未加標點的原始辨識結果,必須明確送出 punctuation: false。

搭配字庫

語音辨識端點接受兩種字庫,與文字翻譯端點相同:vocabulary 是軟性引導,命中的詞彙會作為偏好用詞提供給模型,適合人名、產品名與專業術語;forced_replacement 則是後處理替換,辨識完成後再針對輸出做字串取代。兩者都以 UUID 透過 vocabulary_dictionary_id / forced_replacement_dictionary_id 帶入。

JSON 模式可同時掛上兩種字庫;注意 language 必須是明確語言代碼,不能是 auto。

bash
curl -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "zh-TW",
    vocabulary_dictionary_id: "f3c1e9a2-9c2b-4f7a-9d3a-7e2b8a1c4d5e",
    forced_replacement_dictionary_id: "1d2e3f4a-5b6c-7d8e-9f0a-1b2c3d4e5f6a"
  }')"

回應中的 vocabulary_used 與 forced_replacement_count 可用來確認字庫是否真的生效——這兩個欄位是語音辨識獨有,文字翻譯只有後者。

json
{
  "text": "請把這份合約交給法務組長確認。",
  "detected_language": "zh-TW",
  "segments": null,
  "timestamps": null,
  "usage": {
    "quota_percent": {
      "used": 35
    }
  },
  "forced_replacement_count": 2,
  "vocabulary_used": true
}

vocabulary 字庫不可搭配 language: "auto"

詞彙引導需要先知道音訊語言才能套用對應的詞條,因此同時送出 language: "auto" 與 vocabulary_dictionary_id 會回 400 validation_error。使用 vocabulary 字庫時請明確指定 language。這條限制是語音辨識獨有的,文字翻譯端點沒有。另外與文字翻譯相同:stream: true 時不可帶 forced_replacement_dictionary_id。

字庫的建立與細節

建立、批次建立、CRUD 與兩種字庫類型的選用建議,請見「字庫操作教學」與「字庫概念」兩章。

SSE 模式:逐段輸出

需要即時字幕或逐段顯示時設 stream=true,回應改為 text/event-stream。事件順序為 head(detected_language)→ chunk*(文字片段,0 至多筆)→ tail(可帶 segments)→ meta(usage / vocabulary_used / forced_replacement_count)。任何時點失敗都會以 error 事件取代後續事件並結束串流。

SSE 模式 curl 範例。-N 關閉 curl 緩衝以即時看到事件。

bash
curl -N -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "auto",
    stream: true
  }')"

SSE 與 forced_replacement 不可同時使用

後處理替換需要先取得完整辨識結果才能執行,與逐段串流的本質衝突。同時送出 stream=true 與 forced_replacement_dictionary_id 會回 400 validation_error。在 SSE 模式下 meta 的 forced_replacement_count 恆為 0。串流情境若需要替換,請改回 JSON 模式或自行於前端做替換。

與翻譯 SSE 的差異

語音辨識的 head 事件帶 detected_language(翻譯為 source_lang);tail 事件可附 segments;meta 事件除 usage 外再帶 vocabulary_used 與 forced_replacement_count;錯誤代碼一律以 asr_ 為前綴(例:asr_failed、asr_timeout、asr_content_policy_violation)。