語音技術(shù)
接口描述
實時語音識別接口采用websocket協(xié)議的連接方式,邊上傳音頻邊獲取識別結(jié)果??梢詫⒁纛l流實時識別為文字,也可以上傳音頻文件進行識別;返回結(jié)果包含每句話的開始和結(jié)束時間,適用于長句語音輸入、音視頻字幕、直播質(zhì)檢、會議記錄等場景。
WebSocket簡介
WebSocket 是基于TCP的全雙工協(xié)議,即建立連接后通訊雙方都可以不斷發(fā)送數(shù)據(jù)。
WebSocket 協(xié)議由rfc6455定義, 下面介紹常見WebSocket 庫的調(diào)用流程及參數(shù)
一般需要各編程語言的WebSocket庫來實現(xiàn)接入。WebSocket庫需支持rfc6455描述的協(xié)議, 即支持Sec-WebSocket-Version: 13
主要流程
連接 連接成功后發(fā)送數(shù)據(jù)2.1 發(fā)送開始參數(shù)幀
2.2 實時發(fā)送音頻數(shù)據(jù)幀
2.3 庫接收識別結(jié)果
2.4 發(fā)送結(jié)束幀 關(guān)閉連接

發(fā)送數(shù)據(jù)幀:Sending Data Frame, 類似包的概念,指一次發(fā)送的內(nèi)容 。從客戶端到服務(wù)端。
文本幀:Opcode 0x1 (Text), 實時語音識別api發(fā)送的第一個開始參數(shù)幀和最后一個結(jié)束幀,文本的格式是json 二進制幀:Opcode0x2 (Binary), 實時語音識別api 發(fā)送的中間的音頻數(shù)據(jù)幀接收數(shù)據(jù)幀: Receiving Data Frame, 類似包的概念,指一次發(fā)送的內(nèi)容 。從服務(wù)端到客戶端。
文本幀:Opcode 0x1 (Text), 識別結(jié)果或者報錯,文本的格式是json 二進制幀:實時語音識別api 不會收到 關(guān)閉連接:Closing Handshake。 百度服務(wù)端識別結(jié)束后會自行關(guān)閉連接,部分WebSocket庫需要得知這個事件后手動關(guān)閉客戶端連接。通常WebSocket庫用需要用戶自己定義下面的3個回調(diào)函數(shù)實現(xiàn)自己的業(yè)務(wù)邏輯。
連接成功后的回調(diào)函數(shù): {#通常需要開啟一個新線程,以避免阻塞無法接收數(shù)據(jù)2.1 發(fā)送開始參數(shù)幀2.2 實時發(fā)送音頻數(shù)據(jù)幀2.4 發(fā)送結(jié)束幀 } 接收數(shù)據(jù)的回調(diào)函數(shù) {2.3 庫接收識別結(jié)果,自行解析json獲得識別結(jié)果 } 服務(wù)端關(guān)閉連接的回調(diào)函數(shù) {3. 關(guān)閉客戶端連接, 部分庫可以自動關(guān)閉客戶端連接。 }
在線調(diào)試&示例代碼
Demo 目前提供如下demo及演示功能,點擊進入下載頁面
編程語言 操作系統(tǒng)及版本 使用文件流演示接口基本識別功能 耗時計算 模擬實時音頻流 斷網(wǎng)補發(fā)數(shù)據(jù) Java 任意,支持Java 8或以上 √ √ √ Android Android Api Level 15 或以上 √ √ √ Python 任意,支持Python3 √ C++ Linux ,支持C++ 11 以上 √請求說明
連接
連接地址(WebSocket URI):wss://vop.baidu.com/realtime_asr?sn=XXXX-XXXX-XXXX-XXX 參數(shù) sn由用戶自定義用于排查日志,建議使用隨機字符串如UUID生成。 sn的格式為英文數(shù)字及“-” ,長度128個字符內(nèi),即[a-zA-Z0-9-]{1, 128}
如果連接成功,一般WebSocket庫會發(fā)起回調(diào)。
發(fā)送開始參數(shù)幀
注意幀的類型(Opcode)是Text, 使用json序列化
示例:
{ "type": "START", "data": { "appid": 105xxx17, "appkey": "UA4oPSxxxxkGOuFbb6", "dev_pid": 15372, # 識別模型,比如普通話還是英語,是否要加標(biāo)點等 "lm_id": xxxx, # 自訓(xùn)練平臺才有這個參數(shù) "cuid": "cuid-1", # 隨便填不影響使用。機器的mac或者其它唯一id,頁面上計算UV用。 # 下面是固定參數(shù) "format": "pcm", "sample": 16000 } }
具體參數(shù)說明
參數(shù)名稱 類型 是否必填 說明 type String 必填,固定值 START,開始幀的類型 data Array 必填 具體見下表data參數(shù)說明
參數(shù)名稱 類型 是否必填 說明 appid int 必填 控制臺網(wǎng)頁上應(yīng)用的鑒權(quán)信息 AppID appkey string 必填 控制臺網(wǎng)頁上應(yīng)用的鑒權(quán)信息 API Key dev_pid int 必填 識別模型,推薦15372,見下一個表格 lm_id int 可選 填入自訓(xùn)練平臺訓(xùn)練上線的模型id,需要和訓(xùn)練的基礎(chǔ)模型dev-pid對齊。參考平臺模型調(diào)用部分的提示。 cuid string 必填 統(tǒng)計UV使用,發(fā)起請求設(shè)備的唯一id,如服務(wù)器的mac地址。隨意填寫不影響識別結(jié)果。長度128個字符內(nèi),即[a-zA-Z0-9-_]{1, 128} format string 必填,固定值 pcm , 固定格式 sample int 必填,固定值 16000, 固定采樣率開放平臺模型(無在線語義功能)
PID 模型 是否有標(biāo)點及后處理 推薦場景 1537 中文普通話 弱標(biāo)點(逗號,句號) 手機近場輸入 15372 中文普通話 加強標(biāo)點(逗號、句號、問號、感嘆號) 手機近場輸入 1737 英語 無標(biāo)點 手機近場輸入 17372 英語 加強標(biāo)點(逗號、句號、問號) 手機近場輸入語音自訓(xùn)練平臺模型訓(xùn)練
實時語音識別接口支持在語音自訓(xùn)練平臺上訓(xùn)練中文普通話模型
訓(xùn)練后的模型注意必須填寫上線模型的模型參數(shù),可在自訓(xùn)練平臺的模型調(diào)用模塊進行查看。
示例 獲取專屬模型參數(shù)pid:1537或15372 modelid:1235, 則調(diào)用websocket API時必須填寫參數(shù) dev_pid=1537或15372(PID功能見下表);同時lm_id 設(shè)置為1235。
PID 模型 是否有標(biāo)點 備注 1537 中文普通話 無標(biāo)點 15372 中文普通話 加強標(biāo)點(逗號、句號、問號、感嘆號)發(fā)送音頻數(shù)據(jù)幀
這里需要注意,服務(wù)端5s沒有收到音頻數(shù)據(jù)會斷開并報錯,發(fā)送間隔控制在5s以內(nèi)
注意幀的類型(Opcode)是Binary
內(nèi)容是二進制的音頻內(nèi)容。 除最后一個音頻數(shù)據(jù)幀, 每個幀的音頻數(shù)據(jù)長度為20-200ms。 建議最佳160ms一個幀,有限制的也建議80ms。
160ms = 160 (16000 2 /1000) = 5120 bytes
計算方式: 16000采樣率: 1s音頻 16000采樣點 16bits: 一個采樣點 16bits = 2 bytes 1s : = 1000ms 即 160ms * 16000 * 2bytes / 1000ms = 5120bytes
實時語音識別api 建議實時發(fā)送音頻,即每個160ms的幀之后,下一個音頻數(shù)據(jù)幀需要間隔160ms。即:文件,此處需要sleep(160ms) 如果傳輸過程中網(wǎng)絡(luò)異常, 需要補斷網(wǎng)時的識別結(jié)果,發(fā)送的音頻數(shù)據(jù)幀之間可以沒有間隔。具體見下文“斷網(wǎng)補發(fā)數(shù)據(jù)”一節(jié)
發(fā)送結(jié)束幀
注意幀的類型(Opcode)是Text, 使用json序列化
示例:
具體參數(shù)說明
參數(shù)名稱 類型 是否必填 說明 type String 必填,固定值 , 結(jié)束幀的類型發(fā)送取消幀
取消與結(jié)束不同,結(jié)束表示音頻正常結(jié)束,取消表示不再需要識別結(jié)果,服務(wù)端會迅速關(guān)閉連接 示例:
具體參數(shù)說明
參數(shù)名稱 類型 是否必填 說明 type String 必填,固定值 CANCEL 立即取消本次識別發(fā)送心跳幀
注意幀的類型(Opcode)是Text, 使用json序列化 正常情況下不需要發(fā)這個幀,僅在網(wǎng)絡(luò)異常的時候,需要補傳使用,具體見“斷網(wǎng)補發(fā)數(shù)據(jù)”
示例:
具體參數(shù)說明
參數(shù)名稱 類型 是否必填 說明 type String 必填,固定值 HEARTBEAT, 心跳幀的類型返回說明
接收數(shù)據(jù)幀
注意需要接收的幀類型(Opcode)是Text, 本接口不會返回Binary類型的幀。 text的內(nèi)容, 使用json序列化
臨時及最終識別結(jié)果
一段音頻由多句話組成,實時識別api會依次返回每句話的臨時識別結(jié)果和最終識別結(jié)果
一句話的臨時識別結(jié)果示例:
{"err_no":0,"err_msg":"OK","type": "MID_TEXT","result": "北京天氣怎","log_id": 45677785,"sn": "399427ce-e999-11e9-94c8-fa163e4e6064_ws_2" }
一句話的最終識別結(jié)果:
{"err_no":0,"err_msg":"OK","type":"FIN_TEXT","result":"北京天氣怎么樣","start_time":53220,"end_time":73340,"err_no":0,"err_msg":"OK","log_id":45677785,"sn":"399427ce-e999-11e9-94c8-fa163e4e6064_ws_2" }
心跳幀(收到后,請忽略)
示例:
與發(fā)送的心跳幀不同,這個是接收服務(wù)端下發(fā)的,5s一次,收到后可以忽略。
服務(wù)端報錯 如-3005錯誤碼,是針對的是一個句子的,其它句子依舊可以識別,請求是否結(jié)束以服務(wù)端是否關(guān)閉連接為準(zhǔn)。 具體錯誤碼含義見文末“錯誤碼“一節(jié)
{"err_msg": "asr authentication failed","err_no": -3004,"log_id": 106549729,"result": "","sn": "0d25b5e1-ffa6-11e9-8968-f496349f3917","type": "FIN_TEXT" }
一句話的開始時間及結(jié)束時間:識別過程中,百度服務(wù)端在每句話的最終識別結(jié)果中帶有這句話的開始和結(jié)束時間。最終識別結(jié)果是指"type":"FIN_TEXT",即一句話的最后識別結(jié)果,包括這句話的報錯結(jié)果。
通常一個音頻會得到如下的時間信息:
# s1 e1 指第一句話的開始和結(jié)束時間start_time,end_time [靜音][s1:e1][靜音][s2:e2]....[靜音][s10:e10][靜音] 一句話不能超過60s,否則會被強制切割
參數(shù)說明
參數(shù)名稱 名稱 類型 說明 err_no 錯誤碼 int 0 表示正確, 其它錯誤碼見文末 err_msg 錯誤信息 string err_no!=0時,具體的報錯解釋。 type 結(jié)果類型 string 見下面3行示臨時識別結(jié)果 ~ ~ MID_TEXT 一句話以及臨時識別結(jié)果 ~ ~ FIN_TEXT 一句話的最終識別結(jié)果或者報錯, 是否報錯由err_no判斷 ~ ~ HEARTBEAT 僅斷網(wǎng)補發(fā)音頻數(shù)據(jù)需要,見下文“斷網(wǎng)補發(fā)數(shù)據(jù)”一節(jié) result 識別結(jié)果 string 音頻的識別結(jié)果 start_time 一句話的開始時間 int,毫秒 一句話的開始時間,臨時識別結(jié)果MID_TEXT 無此字段 end_time 一句話的結(jié)束時間 int,毫秒 一句話的結(jié)束時間,臨時識別結(jié)果MID_TEXT 無此字段 logid 日志id long 日志id,用這個id可以百度服務(wù)端定位請求,排查問題 sn 請求sn string 用這個sn可以百度服務(wù)端定位請求,排查問題。ws URI里的參數(shù)及識別句子的組合斷網(wǎng)補發(fā)數(shù)據(jù)
請先看“發(fā)送音頻數(shù)據(jù)幀” 和 “接收數(shù)據(jù)幀” 這2節(jié)。
斷網(wǎng)補發(fā)數(shù)據(jù)的目的是將一個語音流,在網(wǎng)絡(luò)不佳的情況下,通過自己的代碼邏輯拼接,使得多次請求的結(jié)果看上去像一次。
簡單來說就是哪里斷開,從哪里開始重新發(fā)一次請求,“哪里”=最后一次接收的“end_time”。服務(wù)端對每個請求獨立,需要自行拼接補發(fā)數(shù)據(jù)的請求時間。
如果一個音頻的10個句子時間如下:
# s1 e1 指第一句話的開始和結(jié)束時間start_time,end_time [靜音][s1:e1][靜音][s2:e2]...[s7:e7]...[靜音][s10:e10][靜音]
如果發(fā)送過程中,比如在第七句e7之后,網(wǎng)絡(luò)抖動或者遇見其它錯誤。但是為了不影響最終的用戶體驗,期望連續(xù)的10個句子的識別結(jié)果。
此時,可以發(fā)起一個新的請求,從e7開始發(fā)數(shù)據(jù),在,語音數(shù)據(jù)幀之間不需要sleep。
如果超過5s沒有發(fā)送音頻數(shù)據(jù)給服務(wù)端,服務(wù)端會下發(fā)報錯并結(jié)束連接,建議至少2s 發(fā)送一次。
完整流程如下
開始一次請求,正常發(fā)送音頻數(shù)據(jù),并緩存音頻數(shù)據(jù), 接收到數(shù)據(jù)幀, 保存end_time 如果此時斷網(wǎng),讀取最后一次的end_time如7000ms 開始一次新請求, 從緩存的音頻數(shù)據(jù)中找到7000ms(224000bytes)以后的數(shù)據(jù),發(fā)送給服務(wù)端。每個幀160ms的音頻數(shù)據(jù),補數(shù)據(jù)時,每個幀之間不需要間隔sleep。 一直追上實時音頻數(shù)據(jù),開始實時發(fā)送 新請求的start_time和end_time可以加上7000ms,然后展示給用戶 如果補發(fā)數(shù)據(jù)過大,新請求過快結(jié)束,在新請求結(jié)束時,需要補type=HEARTBEAT心跳幀,建議2-3s發(fā)一次,避免5s服務(wù)端讀超時。 如果再次斷網(wǎng)流程依舊相關(guān)知識
語音識別抑郁癥的關(guān)鍵技術(shù)研究
智能語音識別技術(shù):賦能人工智能應(yīng)用新篇章
電銷機器人=AI人工智能+語音識別技術(shù)+語音知識庫+話術(shù)邏輯+智能學(xué)習(xí)
語音識別技術(shù)在手機心理健康軟件中的應(yīng)用
言語治療技術(shù)
語音識別
什么是智能語音服務(wù)(智能語音服務(wù)介紹)
ai語音識別聲音防沉迷
【基本建成】言語治療技術(shù)
言語聽覺康復(fù)技術(shù)專業(yè)介紹
網(wǎng)址: 語音技術(shù) http://m.u1s5d6.cn/newsview681642.html
推薦資訊
- 1發(fā)朋友圈對老公徹底失望的心情 12775
- 2BMI體重指數(shù)計算公式是什么 11235
- 3補腎吃什么 補腎最佳食物推薦 11199
- 4性生活姿勢有哪些 盤點夫妻性 10428
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828