語音接入
考慮到pc與ios、android三端的混服情況,所有錄音的格式均存儲為mp3格式,也是unity推薦的音頻文件方式
前提:目前比較成熟的語音模塊由科大訊飛平台提供的,目前我們需要的功能是把語音轉化成文字,因此我們只需要下載相應的語音識別模塊就可以了。
1)進入科大訊飛官網下載相應平台的sdk,目前我們只需要免費的語音識別就可以了,要創建相應的應用才能下載,里面的demo提供邊錄音邊翻譯的功能。
2)pc端的沒有提供邊錄邊能,要想在pc版進行錄音可引入第三方庫進行錄音或者使用unity提供的microphone進行錄音也可以的
1 pc端錄音以及識別
1.1 錄音:
方法一:unity本身有microphone錄制功能,存儲在AudioClip,這是原生態數據比較大,我們需要保存成相應的wav文件,再轉成mp3發給服務器.
要根據服務器的協議發送大小,隨時更改錄制的參數, 主要錄制功能代碼 Microphone.Start(),一般移動端都適合錄制10s,sample_rate(采樣率) = 8000
的設置即可. mp3錄制的參數的bitRate盡量設置為 16位(影響mp3文件大小的主要參數),不懂這些參數可參考以下鏈接,代碼里面會有設置。
AudioClip存為wav參考鏈接:
http://www.lxway.com/812992244.htm
wav轉成mp3參考鏈接:
https://github.com/Corey-M/NAudio.Lame
http://www.codeproject.com/Articles/5901/C-MP3-Compressor
http://stackoverflow.com/questions/19058530/change-format-from-wav-to-mp3-in-memory-stream-in-naudio
方法二:利用NAudio 錄制,是利用.net里面的錄音功能,同時壓縮mp3也需要利用這里的庫文件進行解析wav格式等等。
1.2 注意的問題:
1.2.1 NAudio 主要錄制的功能waveIn,錄制的時候往往需要獲取聲音的大小,以便錄音者調整音量大小. waveIn有個事件回調,根據刷新頻率傳回相應的文件數據,此時只需要只能通過相應的數據來獲取音量大小,可在一下源碼進行獲取觀看。
http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=10182
1.2.1 NAudio waveOut是可用來播放mp3,但是沒有源碼播放、暫停、停止均不會設置回來狀態。
2、 android錄音以及存儲、語音識別
2.1 目前沒有和pc,ios混服 因此采用科大訊飛進行邊錄邊翻譯功能,暫時采用的存儲方式是.amr,如果需要混服我們需要把它壓縮成mp3格式,科大訊飛支持錄制兩種方式wav
和pcm,我們只需要在unity利用和pc端一樣的壓縮原理把它壓縮成mp3即可.
步驟: 需要到科大訊飛開發者網站 創建應用下載相應的sdk,源碼主要是在IatDemo里面
原理: 訊飛支持把語音數據分段發送進行識別,主要是邊錄邊把數據進行發送識別,錄音是采用android本身的錄音。主要類是IatDemo
問題:訊飛提供的SpeechRecognizer主要是普遍反映錄的聲音較小,改變手機的音量會導致游戲的聲音同時改變,解決辦法:在錄音提高系統音量,錄完再回復原來音量
2.2 pcm或者wav轉成mp3
同樣是使用lame mp3庫,主要采用 java與 C之間的交互生成相應的so文件(主要是調用lame mp3庫方法),錄音成pcm采用該so文件進行壓縮即可,這個方法把安全容易造成某些機型閃退,不建議采用,盡量采用和pc端一樣的壓縮方式.
3 ios的原理和android差不多,只不過他有.a庫,我們盡量不在XCode工程里面做壓縮,ios、pc、android盡量采用統一方式在Unity層進行壓縮即可。