首頁 資訊 語音技術(shù)

語音技術(shù)

來源:泰然健康網(wǎng) 時間:2024年12月20日 20:52

接口描述

實時語音識別接口采用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)閉連接 1.png 名詞解釋: 連接: 這里指TCP連接及握手(Opening Handshake) , 一般WebSocket庫已經(jīng)封裝,用戶不必關(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)練中文普通話模型 image.png

訓(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

推薦資訊