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