首頁 資訊 語音技術

語音技術

來源:泰然健康網 時間:2024年12月20日 20:52

接口描述

實時語音識別接口采用websocket協(xié)議的連接方式,邊上傳音頻邊獲取識別結果??梢詫⒁纛l流實時識別為文字,也可以上傳音頻文件進行識別;返回結果包含每句話的開始和結束時間,適用于長句語音輸入、音視頻字幕、直播質檢、會議記錄等場景。

WebSocket簡介

WebSocket 是基于TCP的全雙工協(xié)議,即建立連接后通訊雙方都可以不斷發(fā)送數據。

WebSocket 協(xié)議由rfc6455定義, 下面介紹常見WebSocket 庫的調用流程及參數

一般需要各編程語言的WebSocket庫來實現接入。WebSocket庫需支持rfc6455描述的協(xié)議, 即支持Sec-WebSocket-Version: 13

主要流程

連接 連接成功后發(fā)送數據
2.1 發(fā)送開始參數幀
2.2 實時發(fā)送音頻數據幀
2.3 庫接收識別結果
2.4 發(fā)送結束幀 關閉連接 1.png 名詞解釋: 連接: 這里指TCP連接及握手(Opening Handshake) , 一般WebSocket庫已經封裝,用戶不必關心

發(fā)送數據幀:Sending Data Frame, 類似包的概念,指一次發(fā)送的內容 。從客戶端到服務端。

文本幀:Opcode 0x1 (Text), 實時語音識別api發(fā)送的第一個開始參數幀和最后一個結束幀,文本的格式是json 二進制幀:Opcode0x2 (Binary), 實時語音識別api 發(fā)送的中間的音頻數據幀

接收數據幀: Receiving Data Frame, 類似包的概念,指一次發(fā)送的內容 。從服務端到客戶端。

文本幀:Opcode 0x1 (Text), 識別結果或者報錯,文本的格式是json 二進制幀:實時語音識別api 不會收到 關閉連接:Closing Handshake。 百度服務端識別結束后會自行關閉連接,部分WebSocket庫需要得知這個事件后手動關閉客戶端連接。

通常WebSocket庫用需要用戶自己定義下面的3個回調函數實現自己的業(yè)務邏輯。

連接成功后的回調函數: {#通常需要開啟一個新線程,以避免阻塞無法接收數據2.1 發(fā)送開始參數幀2.2 實時發(fā)送音頻數據幀2.4 發(fā)送結束幀 } 接收數據的回調函數 {2.3 庫接收識別結果,自行解析json獲得識別結果 } 服務端關閉連接的回調函數 {3. 關閉客戶端連接, 部分庫可以自動關閉客戶端連接。 }

在線調試&示例代碼

Demo 目前提供如下demo及演示功能,點擊進入下載頁面

編程語言 操作系統(tǒng)及版本 使用文件流演示接口基本識別功能 耗時計算 模擬實時音頻流 斷網補發(fā)數據 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 參數 sn由用戶自定義用于排查日志,建議使用隨機字符串如UUID生成。 sn的格式為英文數字及“-” ,長度128個字符內,即[a-zA-Z0-9-]{1, 128}

如果連接成功,一般WebSocket庫會發(fā)起回調。

發(fā)送開始參數幀

注意幀的類型(Opcode)是Text, 使用json序列化

示例:

{ "type": "START", "data": { "appid": 105xxx17, "appkey": "UA4oPSxxxxkGOuFbb6", "dev_pid": 15372, # 識別模型,比如普通話還是英語,是否要加標點等 "lm_id": xxxx, # 自訓練平臺才有這個參數 "cuid": "cuid-1", # 隨便填不影響使用。機器的mac或者其它唯一id,頁面上計算UV用。 # 下面是固定參數 "format": "pcm", "sample": 16000 } }

具體參數說明

參數名稱 類型 是否必填 說明 type String 必填,固定值 START,開始幀的類型 data Array 必填 具體見下表

data參數說明

參數名稱 類型 是否必填 說明 appid int 必填 控制臺網頁上應用的鑒權信息 AppID appkey string 必填 控制臺網頁上應用的鑒權信息 API Key dev_pid int 必填 識別模型,推薦15372,見下一個表格 lm_id int 可選 填入自訓練平臺訓練上線的模型id,需要和訓練的基礎模型dev-pid對齊。參考平臺模型調用部分的提示。 cuid string 必填 統(tǒng)計UV使用,發(fā)起請求設備的唯一id,如服務器的mac地址。隨意填寫不影響識別結果。長度128個字符內,即[a-zA-Z0-9-_]{1, 128} format string 必填,固定值 pcm , 固定格式 sample int 必填,固定值 16000, 固定采樣率

開放平臺模型(無在線語義功能)

PID 模型 是否有標點及后處理 推薦場景 1537 中文普通話 弱標點(逗號,句號) 手機近場輸入 15372 中文普通話 加強標點(逗號、句號、問號、感嘆號) 手機近場輸入 1737 英語 無標點 手機近場輸入 17372 英語 加強標點(逗號、句號、問號) 手機近場輸入

語音自訓練平臺模型訓練

實時語音識別接口支持在語音自訓練平臺上訓練中文普通話模型 image.png

訓練后的模型注意必須填寫上線模型的模型參數,可在自訓練平臺的模型調用模塊進行查看。

示例 獲取專屬模型參數pid:1537或15372 modelid:1235, 則調用websocket API時必須填寫參數 dev_pid=1537或15372(PID功能見下表);同時lm_id 設置為1235。

PID 模型 是否有標點 備注 1537 中文普通話 無標點 15372 中文普通話 加強標點(逗號、句號、問號、感嘆號)

發(fā)送音頻數據幀

這里需要注意,服務端5s沒有收到音頻數據會斷開并報錯,發(fā)送間隔控制在5s以內

注意幀的類型(Opcode)是Binary

內容是二進制的音頻內容。 除最后一個音頻數據幀, 每個幀的音頻數據長度為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的幀之后,下一個音頻數據幀需要間隔160ms。即:文件,此處需要sleep(160ms) 如果傳輸過程中網絡異常, 需要補斷網時的識別結果,發(fā)送的音頻數據幀之間可以沒有間隔。具體見下文“斷網補發(fā)數據”一節(jié)

發(fā)送結束幀

注意幀的類型(Opcode)是Text, 使用json序列化

示例:

具體參數說明

參數名稱 類型 是否必填 說明 type String 必填,固定值 , 結束幀的類型

發(fā)送取消幀

取消與結束不同,結束表示音頻正常結束,取消表示不再需要識別結果,服務端會迅速關閉連接 示例:

具體參數說明

參數名稱 類型 是否必填 說明 type String 必填,固定值 CANCEL 立即取消本次識別

發(fā)送心跳幀

注意幀的類型(Opcode)是Text, 使用json序列化 正常情況下不需要發(fā)這個幀,僅在網絡異常的時候,需要補傳使用,具體見“斷網補發(fā)數據”

示例:

具體參數說明

參數名稱 類型 是否必填 說明 type String 必填,固定值 HEARTBEAT, 心跳幀的類型

返回說明

接收數據幀

注意需要接收的幀類型(Opcode)是Text, 本接口不會返回Binary類型的幀。 text的內容, 使用json序列化

臨時及最終識別結果

一段音頻由多句話組成,實時識別api會依次返回每句話的臨時識別結果和最終識別結果

一句話的臨時識別結果示例:

{"err_no":0,"err_msg":"OK","type": "MID_TEXT","result": "北京天氣怎","log_id": 45677785,"sn": "399427ce-e999-11e9-94c8-fa163e4e6064_ws_2" }

一句話的最終識別結果:

{"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ā)送的心跳幀不同,這個是接收服務端下發(fā)的,5s一次,收到后可以忽略。

服務端報錯 如-3005錯誤碼,是針對的是一個句子的,其它句子依舊可以識別,請求是否結束以服務端是否關閉連接為準。 具體錯誤碼含義見文末“錯誤碼“一節(jié)

{"err_msg": "asr authentication failed","err_no": -3004,"log_id": 106549729,"result": "","sn": "0d25b5e1-ffa6-11e9-8968-f496349f3917","type": "FIN_TEXT" }

一句話的開始時間及結束時間:識別過程中,百度服務端在每句話的最終識別結果中帶有這句話的開始和結束時間。最終識別結果是指"type":"FIN_TEXT",即一句話的最后識別結果,包括這句話的報錯結果。

通常一個音頻會得到如下的時間信息:

# s1 e1 指第一句話的開始和結束時間start_time,end_time [靜音][s1:e1][靜音][s2:e2]....[靜音][s10:e10][靜音] 一句話不能超過60s,否則會被強制切割

參數說明

參數名稱 名稱 類型 說明 err_no 錯誤碼 int 0 表示正確, 其它錯誤碼見文末 err_msg 錯誤信息 string err_no!=0時,具體的報錯解釋。 type 結果類型 string 見下面3行示臨時識別結果 ~ ~ MID_TEXT 一句話以及臨時識別結果 ~ ~ FIN_TEXT 一句話的最終識別結果或者報錯, 是否報錯由err_no判斷 ~ ~ HEARTBEAT 僅斷網補發(fā)音頻數據需要,見下文“斷網補發(fā)數據”一節(jié) result 識別結果 string 音頻的識別結果 start_time 一句話的開始時間 int,毫秒 一句話的開始時間,臨時識別結果MID_TEXT 無此字段 end_time 一句話的結束時間 int,毫秒 一句話的結束時間,臨時識別結果MID_TEXT 無此字段 logid 日志id long 日志id,用這個id可以百度服務端定位請求,排查問題 sn 請求sn string 用這個sn可以百度服務端定位請求,排查問題。ws URI里的參數及識別句子的組合

斷網補發(fā)數據

請先看“發(fā)送音頻數據幀” 和 “接收數據幀” 這2節(jié)。

斷網補發(fā)數據的目的是將一個語音流,在網絡不佳的情況下,通過自己的代碼邏輯拼接,使得多次請求的結果看上去像一次。

簡單來說就是哪里斷開,從哪里開始重新發(fā)一次請求,“哪里”=最后一次接收的“end_time”。服務端對每個請求獨立,需要自行拼接補發(fā)數據的請求時間。

如果一個音頻的10個句子時間如下:

# s1 e1 指第一句話的開始和結束時間start_time,end_time [靜音][s1:e1][靜音][s2:e2]...[s7:e7]...[靜音][s10:e10][靜音]

如果發(fā)送過程中,比如在第七句e7之后,網絡抖動或者遇見其它錯誤。但是為了不影響最終的用戶體驗,期望連續(xù)的10個句子的識別結果。

此時,可以發(fā)起一個新的請求,從e7開始發(fā)數據,在,語音數據幀之間不需要sleep。

如果超過5s沒有發(fā)送音頻數據給服務端,服務端會下發(fā)報錯并結束連接,建議至少2s 發(fā)送一次。

完整流程如下

開始一次請求,正常發(fā)送音頻數據,并緩存音頻數據, 接收到數據幀, 保存end_time 如果此時斷網,讀取最后一次的end_time如7000ms 開始一次新請求, 從緩存的音頻數據中找到7000ms(224000bytes)以后的數據,發(fā)送給服務端。每個幀160ms的音頻數據,補數據時,每個幀之間不需要間隔sleep。 一直追上實時音頻數據,開始實時發(fā)送 新請求的start_time和end_time可以加上7000ms,然后展示給用戶 如果補發(fā)數據過大,新請求過快結束,在新請求結束時,需要補type=HEARTBEAT心跳幀,建議2-3s發(fā)一次,避免5s服務端讀超時。 如果再次斷網流程依舊

相關知識

語音識別抑郁癥的關鍵技術研究
智能語音識別技術:賦能人工智能應用新篇章
電銷機器人=AI人工智能+語音識別技術+語音知識庫+話術邏輯+智能學習
語音識別技術在手機心理健康軟件中的應用
言語治療技術
語音識別
什么是智能語音服務(智能語音服務介紹)
ai語音識別聲音防沉迷
【基本建成】言語治療技術
言語聽覺康復技術專業(yè)介紹

網址: 語音技術 http://m.u1s5d6.cn/newsview681642.html

推薦資訊