最近為小程序增加語音識別轉文字的功能,坑路不斷,特此記錄。
微信開發者工具
開發者工具上的錄音文件與移動端格式不同,暫時只可在工具上進行播放調試,無法直接播放或者在客戶端上播放
debug的時候發現,工具上錄音的路徑是http://tmp/xxx.mp3,客戶端上錄音是wxfile://xxx.mp3。 忽悠呢,不是格式不同,是映射路徑不同。
其實做個兼容也不難,每次提示一行文字,很丑。
采樣率與編碼碼率限制
每種采樣率有對應的編碼碼率范圍有效值,設置不合法的采樣率或編碼碼率會導致錄音失敗。詳細看這個
https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html
一開始沒有留意,導致錄音不成功。
試過幾次后,采用這樣的配置,感覺錄音識別率和體積之間比較好平衡:
sampleRate: 16000, //采樣率numberOfChannels: 1, //錄音通道數encodeBitRate: 96000, //編碼碼率
單通道基本是必選的。因為asr只支持單通道。frameSize也是可以的,但是要考慮截斷對識別的影響。暫時沒有用上。
錄音優化
因為可能誤按,于是對小于500ms的錄音直接忽略。
另外,松開錄音按鍵后,再延遲一點時間才真正stop錄音。
錄音文件格式
微信錄音文件支持mp3和aac。這2種格式文件都比較小,aac文件體積更小。這對上傳來說是件好事情,速度更快。
但是對語音識別轉文字就不友好了。因為百度、阿里云ASR、訊飛的語音轉文字接口都不支持aac和mp3,通常要求是pcm或者wav格式。
如果微信錄音能提供wav格式,那么就不用服務器做格式轉換了,但是wav格式體積是mp3、aac的5到10倍,至少短期是沒戲了,這也是很多人吐槽的地方。
服務器轉換錄音文件格式
可以用java第三方庫轉換,也可以用Process調用ffmpeg轉換。要注意的是,根據識別API的要求來做轉換。比如阿里云asr的要求是:
支持音頻編碼格式:pcm(無壓縮的pcm文件或wav文件)、opus,16bit采樣位數的單聲道(mono);
支持音頻采樣率:8000Hz、16000Hz;
java ProcessBuilder要使用數組傳參
轉換音視頻,習慣用ffmpeg。安裝完ffmpeg之后,用java新建進程調用。
Process = new ProcessBuilder("ffmpeg -i in.mp3 out.wav").start();一直提示CreateProcess error。 后來看文檔才發現,要以數組的形式傳入參數。
Process = new ProcessBuilder("ffmpeg", "-y", "-i", "in.mp3", "out.wav").start();這樣就啟動成功了。
關于java啟動進程,不是本文重點,以后再寫篇文章總結。
阿里云asr sdk使用問題
新聞熱點
疑難解答