文件

即時語音轉文字

Service: wss://asr.api.yating.tw/ws/v1/
透過串流語音轉文字服務,您可傳送音訊片段到雲端服務,並獲得精確的語音識別結果。您也可以使用客製化語言模型來強化辨識結果。
為了簡化你的系統串接流程,我們建議你直接使用 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.

接收及回覆

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

範例