微信小程序?qū)崿F(xiàn)語音識別轉(zhuǎn)文字功能及遇到的坑
最近為小程序增加語音識別轉(zhuǎn)文字的功能,坑路不斷,特此記錄。
微信開發(fā)者工具
開發(fā)者工具上的錄音文件與移動端格式不同,暫時只可在工具上進(jìn)行播放調(diào)試,無法直接播放或者在客戶端上播放
debug的時候發(fā)現(xiàn),工具上錄音的路徑是http://tmp/xxx.mp3
,客戶端上錄音是wxfile://xxx.mp3
。 忽悠呢,不是格式不同,是映射路徑不同。
其實做個兼容也不難,每次提示一行文字,很丑。
采樣率與編碼碼率限制
每種采樣率有對應(yīng)的編碼碼率范圍有效值,設(shè)置不合法的采樣率或編碼碼率會導(dǎo)致錄音失敗。詳細(xì)看這個
https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html
一開始沒有留意,導(dǎo)致錄音不成功。
試過幾次后,采用這樣的配置,感覺錄音識別率和體積之間比較好平衡:
sampleRate: 16000, //采樣率 numberOfChannels: 1, //錄音通道數(shù) encodeBitRate: 96000, //編碼碼率
單通道基本是必選的。因為asr只支持單通道。frameSize也是可以的,但是要考慮截斷對識別的影響。暫時沒有用上。
錄音優(yōu)化
因為可能誤按,于是對小于500ms的錄音直接忽略。
另外,松開錄音按鍵后,再延遲一點時間才真正stop錄音。
錄音文件格式
微信錄音文件支持mp3和aac。這2種格式文件都比較小,aac文件體積更小。這對上傳來說是件好事情,速度更快。
但是對語音識別轉(zhuǎn)文字就不友好了。因為百度、阿里云ASR、訊飛的語音轉(zhuǎn)文字接口都不支持aac和mp3,通常要求是pcm或者wav格式。
如果微信錄音能提供wav格式,那么就不用服務(wù)器做格式轉(zhuǎn)換了,但是wav格式體積是mp3、aac的5到10倍,至少短期是沒戲了,這也是很多人吐槽的地方。
服務(wù)器轉(zhuǎn)換錄音文件格式
可以用java第三方庫轉(zhuǎn)換,也可以用Process調(diào)用ffmpeg轉(zhuǎn)換。要注意的是,根據(jù)識別API的要求來做轉(zhuǎn)換。比如阿里云asr的要求是:
支持音頻編碼格式:pcm(無壓縮的pcm文件或wav文件)、opus,16bit采樣位數(shù)的單聲道(mono);
支持音頻采樣率:8000Hz、16000Hz;
java ProcessBuilder要使用數(shù)組傳參
轉(zhuǎn)換音視頻,習(xí)慣用ffmpeg。安裝完ffmpeg之后,用java新建進(jìn)程調(diào)用。
Process = new ProcessBuilder("ffmpeg -i in.mp3 out.wav").start();
一直提示CreateProcess error
。 后來看文檔才發(fā)現(xiàn),要以數(shù)組的形式傳入?yún)?shù)。
Process = new ProcessBuilder("ffmpeg", "-y", "-i", "in.mp3", "out.wav").start();
這樣就啟動成功了。
關(guān)于java啟動進(jìn)程,不是本文重點,以后再寫篇文章總結(jié)。
阿里云asr sdk使用問題
這個問題困擾了一天時間,回想起來真是吐血。
問題表現(xiàn)是微信錄制的語音很多都識別不了。
最初是直接把錄音mp3文件轉(zhuǎn)換為pcm文件,本地能播放,但是用阿里云asr sdk卻識別不了。 一開始以為是文件編碼問題。特意查了asr支持的文件格式,用ffprobe檢查,potplayer看屬性,都沒有看出問題。
甚至把啟動ffmpeg進(jìn)程轉(zhuǎn)換也改了,用了java的庫去做,還是不行。
后來為了方便測試問題,用asr的restful接口測試錄音文件,都能識別! 似乎是sdk的問題。于是打開官方文檔例子對比。發(fā)現(xiàn)用的是sdk 2.x,老鐵啊你復(fù)制粘貼過來的代碼竟然少了!欲哭無淚。
// TODO 重要提示:這里是用讀取本地文件的形式模擬實時獲取語音流并發(fā)送的,因為read很快,所以這里需要sleep // TODO 如果是真正的實時獲取語音,則無需sleep, 如果是8k采樣率語音,第二個參數(shù)改為8000 int deltaSleep = getSleepDelta(len, sampleRate); Thread.sleep(deltaSleep);
也少了對sampleRate的設(shè)置。
阿里云asr token過期
因為用的是免費版asr,沒有給福報廠充值,因此token一天失效,導(dǎo)致聯(lián)調(diào)的時候突然報錯。
最后實在受不了,寫了個定時任務(wù)每小時更新token。
這,就是beggar VIP😎
wx.uploadFile返回值
封裝了一個接口parseResponse,統(tǒng)一解析查詢結(jié)果(文本、語音)。發(fā)現(xiàn)奇怪的問題:
用文本查詢的,可以正常解析結(jié)果用語音查詢的,明明已經(jīng)返回了結(jié)果,卻解析不了!
只能console.log()
打印出來對比
第一行是wx.request()
發(fā)起文本查詢。
第二行是wx.uploadFile()
上傳語音文件后直接語音轉(zhuǎn)文字,并且查詢。
wx.request
返回值是json對象。
wx.uploadFile
返回值是“字符串”!
wx.uploadFile
返回值是“字符串”!
wx.uploadFile
返回值是“字符串”!
重要的事情要說3遍。盡管Content-Type: "application/json; charset=utf8"
,但是微信根本不做轉(zhuǎn)換!非??拥?/p>
解決:對wx.uploadFile
返回值進(jìn)行JSON.parse(res.data)
,得到j(luò)son對象。
更換appid和secret
因為正式小程序項目賬號一直拖著沒有申請,所以這段時間用的是我個人的appid和secret進(jìn)行開發(fā)。
等正式賬號準(zhǔn)備好了,更新了小程序項目的appid,并且發(fā)出內(nèi)部體驗包。
此時已經(jīng)深夜1點半,頭腦有點發(fā)懵。只更新了小程序appid,竟然忘了更新服務(wù)器的appid和secret。。。
于是乎反復(fù)報錯登錄失敗。
過了一會才反映過來,更新服務(wù)器的appi的secret,但是還是用戶。才想起忘了還有storage緩存沒有清除😂,里面放著自定義的session。這下真機(jī)體驗沒問題了。
但是微信開發(fā)者工具又是登錄失敗。反復(fù)摸索后發(fā)現(xiàn):更換小程序appid后,清除所有數(shù)據(jù),關(guān)閉開發(fā)者工具,重新打開,這就正常了。應(yīng)該是微信開發(fā)者工具的bug。
https://ycwu314.github.io/p/miniapp-speech-to-text-experience/
總結(jié)
以上所述是小編給大家介紹的微信小程序?qū)崿F(xiàn)語音識別轉(zhuǎn)文字功能及遇到的坑,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
javascript實現(xiàn)倒計時N秒后網(wǎng)頁自動跳轉(zhuǎn)代碼
這篇文章主要介紹了javascript實現(xiàn)倒計時N秒后網(wǎng)頁自動跳轉(zhuǎn)代碼,非常的實用,這里推薦給大家。2014-12-12echarts報錯:Error?in?mounted?hook的解決方法
最近又遇到了寫echarts的時候常遇到的一個錯誤,這篇文章主要給大家介紹了關(guān)于echarts報錯:Error?in?mounted?hook:?“TypeError:?Cannot?read?properties?of?undefined?(reading?‘init‘)“的解決方法,需要的朋友可以參考下2022-07-07three.js 實現(xiàn)露珠滴落動畫效果的示例代碼
這篇文章主要介紹了three.js 實現(xiàn)露珠滴落動畫效果的示例代碼,非常不錯,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03