文件

ASR 即時語音轉文字

Service: wss://asr.api.yating.tw/ws/v1/

透過串流語音轉文字服務,您可傳送音訊片段到雲端服務,並獲得精確的語音識別結果。您也可以使用客製化語言模型來強化辨識結果。

您可以在這個 Demo 測試網站輸入金鑰進行測試:https://taiwanailabs-yating.github.io/asr-streaming-js-demo/

為了簡化你的系統串接流程,我們建議你直接使用 ASR python SDK

如果你偏好直接串接 websocket,你須先取得一次性密碼(one-time token)才能透過 WebSocket 連接到語音轉文字。

簡單來說,共有兩步驟:

  • 使用您的 API 密鑰獲取一次性密碼。 有關詳細信息,請參閱 「取得一次性密碼」。
  • 使用一次性密碼建立 WebSocket 連接。

取得一次性密碼

這密碼只能使用一次且有效時間為 60 秒,你需要在這時間內建立起 Websocket 連線。另外,你需要輸入您想要辨識的語言到 pipeline 這個欄位中。

Request

URL: https://asr.api.yating.tw/v1/token
Method: POST

Header

Name Type Info
*key String
*Content-Type String
{
  "key": "請放入你在開發者平台申請的金鑰",
  "Content-Type": "application/json"
}

Body

Name Type Info
*pipeline String 把語言代碼放在這裡。 請參閱語言代碼。
options s3CusModelKey: 你可以把建立好的客製化語言模型 ID 放進來。
{
   "pipeline":"asr-zh-en-std",
   "options":{
      "s3CusModelKey":"custom_language_model_id"
   }
}

Response

Name Type Info
auth_token String

Example

{
  "success": true,
  "auth_token": "4e87d0db167271245234e6a80522a33e81c3eb90"
}
Status Description
Success Http Status Code:
201
Failed Http Status Code:
401 (key does not exist or the key is not available for the service)
5xx (please contact our CS team to solve this issue)

建立WebSocket連接

如果你還不知道 websocket,可以參閱: https://tools.ietf.org/html/rfc6455

  • URL: wss://asr.api.yating.tw/ws/v1/
  • Query: token=[API Token]
  • Example: wss://asr.api.yating.tw/ws/v1/?token=請放入有效Token

傳送音頻數據

分塊傳輸編碼是一種流式(streaming)數據傳輸機制。 數據流被分成不重疊的 「分塊傳輸編碼中的塊」。 每一塊彼此都可以獨立地發送和接收。 以二進制幀的格式發送一個塊。 塊大小應為 2000 字節,大約 1/16 秒。

使用二進制幀發送音頻數據

  • 音頻數據格式:16kHz, 單聲道, 每個樣本 16 bits, PCM 格式
  • 每秒採樣率:16000 x 1 x 16/8 = 32000 字節 ~= 32 KB
  • 每個塊大小:2000 字節,1/16 秒

客戶端到服務器 WebSocket 傳輸示例:
[PCM 16bit binary audio chunk]
[PCM 16bit binary audio chunk]
...
[EOF: empty audio chunk] # (optional) client could send a chunk with 0 length to end a sentence.


接收及回覆

語音轉文字服務會檢測人類話語聲音,偵測到就會分成多個片段並進行辨識。會記錄識別的進程,下面的列表顯示了所有可能的值:

Key Explain
status ok: 代表 ws 建立成功,可以開始傳送聲音資料,
如果提早傳音檔,會造成 ws 斷線
error: 代表asr 的 pipeline 中有出現錯誤,ws 會在三秒後斷線
detail: 則會記錄錯誤原因
asr_state first_chunk_received: 收到第一個 chunk 時回傳,不論那個 chunk 內容是什麼
utterance_begin: 偵測到語音開始時回傳
utterance_end: 偵測到句子結束時回傳
asr_sentence 從句子開始到目前累積的辨識結果,asr_final不為Ture時表示還有可能會改變
asr_confidence 音訊品質參考 (此數據僅為參考,非準確率;當背景吵雜、音訊不穩的雜音噪音、語速過快過慢影響斷句等因素皆會影響此信心程度)
asr_final 若 True 則代表偵測到句子結束,此時 asr_sentence 的結果就是最終結果
asr_begin_time 相對於連線建立時間,句子開始時間
asr_end_time 相對於連線建立時間,句子結束時間
asr_word_time_stamp 會記錄每一個 word 的起始與結束時間
asr_eof 目前已經ASR buffer 沒有任何Frame 待處理則回傳

範例:

時間 狀態
T

從雲端送到客戶端的資訊

"status":"ok"
時間 狀態
T+1 收到第一塊音訊後

從雲端送到客戶端的資訊

"pipe":{
   "asr_state":"first_chunk_received"
}
時間 狀態
T+2 偵測到人聲,開始進行辨識

從雲端送到客戶端的資訊

"pipe":{
   "asr_state":"utterance_begin"
}
時間 狀態
T+4 在句字完整辨識完成前,文字內容可能會變動

從雲端送到客戶端的資訊

"pipe":{
   "asr_sentence":"金"
}
時間 狀態
T+5

從雲端送到客戶端的資訊

"pipe":{
   "asr_sentence":"今天天"
}
時間 狀態
T+6

從雲端送到客戶端的資訊

"pipe":{
   "asr_sentence":"今天天"
}
時間 狀態
T+7

從雲端送到客戶端的資訊

"pipe":{
   "asr_sentence":"今天天氣"
}
時間 狀態
T+N when final == true, the sentence is fixed and will not change

從雲端送到客戶端的資訊

"pipe":{
   "asr_sentence":"今天天氣很好",
   "asr_final":true,
   "asr_begin_time":4.38600015640259,
   "asr_end_time":24.5459995269775,
   "asr_word_time_stamp":[
      {
         "word":"今天",
         "begin_time":4.38600015640259,
         "end_time":5.55634234543425
      },
      {
         "word":"天氣",
         "begin_time":5.86554,
         "end_time":6.2434
      },
      {
         "word":"很",
         "begin_time":6.7543,
         "end_time":8.2453234
      },
      {
         "word":"好",
         "begin_time":8.4567654,
         "end_time":9.01324324
      }
   ]
}
時間 狀態
T+N+1

從雲端送到客戶端的資訊

"pipe":{
   "asr_state":"utterance_end"
}

語言模型代碼

語言代碼 說明 語言
asr-zh-en-std 講者雖然國語與英與混雜,但主要語言還是以國語為主。 國語與英文
asr-zh-tw-std 講者雖然國語與台語混雜,但主要語言還是以國語為主。 國語與台語
asr-en-std 英語 英語
asr-jp-std 日本語 日本語

範例