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 | 日本語 | 日本語 |