首頁 資訊 語音技術

語音技術

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

接口描述

實時語音識別接口采用websocket協(xié)議的連接方式,邊上傳音頻邊獲取識別結果??梢詫⒁纛l流實時識別為文字,也可以上傳音頻文件進行識別;返回結果包含每句話的開始和結束時間,適用于長句語音輸入、音視頻字幕、直播質(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 庫接收識別結果
2.4 發(fā)送結束幀 關閉連接 1.png 名詞解釋: 連接: 這里指TCP連接及握手(Opening Handshake) , 一般WebSocket庫已經(jīng)封裝,用戶不必關心

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

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

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

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

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

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

在線調(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, # 識別模型,比如普通話還是英語,是否要加標點等 "lm_id": xxxx, # 自訓練平臺才有這個參數(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)頁上應用的鑒權信息 AppID appkey string 必填 控制臺網(wǎng)頁上應用的鑒權信息 API Key dev_pid int 必填 識別模型,推薦15372,見下一個表格 lm_id int 可選 填入自訓練平臺訓練上線的模型id,需要和訓練的基礎模型dev-pid對齊。參考平臺模型調(diào)用部分的提示。 cuid string 必填 統(tǒng)計UV使用,發(fā)起請求設備的唯一id,如服務器的mac地址。隨意填寫不影響識別結果。長度128個字符內(nèi),即[a-zA-Z0-9-_]{1, 128} format string 必填,固定值 pcm , 固定格式 sample int 必填,固定值 16000, 固定采樣率

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

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

語音自訓練平臺模型訓練

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

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

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

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

發(fā)送音頻數(shù)據(jù)幀

這里需要注意,服務端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)絡異常, 需要補斷網(wǎng)時的識別結果,發(fā)送的音頻數(shù)據(jù)幀之間可以沒有間隔。具體見下文“斷網(wǎng)補發(fā)數(shù)據(jù)”一節(jié)

發(fā)送結束幀

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

示例:

具體參數(shù)說明

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

發(fā)送取消幀

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

具體參數(shù)說明

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

發(fā)送心跳幀

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

示例:

具體參數(shù)說明

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

返回說明

接收數(shù)據(jù)幀

注意需要接收的幀類型(Opcode)是Text, 本接口不會返回Binary類型的幀。 text的內(nèi)容, 使用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,否則會被強制切割

參數(shù)說明

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

斷網(wǎng)補發(fā)數(shù)據(jù)

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

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

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

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

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

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

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

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

完整流程如下

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

相關知識

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

網(wǎng)址: 語音技術 http://www.u1s5d6.cn/newsview681642.html

推薦資訊