Android 端音訊變聲方案
音訊變聲實質上是通過調整 PCM 資料的音調、節拍等屬性,實現聽感上的變化。如果是 mp3、aac 等壓縮音訊,則需提前解碼成 PCM 資料,Android 端可以通過 MediaExtractor 及 MediaCodec 解碼得到 PCM,但調整音調、節拍僅靠 Android api 就無能為力了,只能整合第三方庫來實現,常見的音訊處理庫有Fmod 、SoundTouch 。
Fmod
Fmod 是一個跨平臺的音訊處理引擎,官網提供了各個平臺的接入文件 ,可以實現變調、變速變聲效果以及混響、顫音等高階效果。開發呼叫簡單,sdk 對外提供了播放器介面,傳入音訊檔案即可直接變聲播放。但不支援儲存處理後的音訊到檔案,商業用途需要購買許可證。
如果你不需要儲存處理後的音訊到檔案,那就使用 Fmod 吧,你會發現音訊變聲是如此簡單,而且還支援混響、顫音等高階變聲效果!
如果需要儲存處理後的音訊到檔案,那麼......我就請你再認真的思考一下,你的需求真的必須要儲存處理後的音訊嗎?假設一個聊天 app 要實現語音訊息變聲,那這段語音只會在你的應用中播放,那就都可以通過 Fmod 播放器變聲播放啊,要知道 Fmod 可是一個跨平臺的音訊引擎,不論是 Android、IOS 還是 Web 端,只要知道變聲引數就可以變聲播放了,不需要儲存處理後的音訊到檔案。
能否躍過不支援儲存處理後的音訊到檔案這一缺點,關鍵是要確定使用者能否直接接觸到處理後的音訊檔案,若能接觸到,就無法使用 Fmod 了。
關於整合使用 Fmod 庫十分簡單,網上也有很多,就不再展開了。
SoundTouch
SoundTouch 是一個開源免費的音訊處理庫,可以改變音調、節拍和播放速率。開發呼叫時需自行將音訊檔案解碼成 PCM 資料,傳入 SoundTouch 處理後,SoundTouch 會輸出處理後的 PCM 資料。基於這種使用方式,我們可以對其自由定製以適用於自己的應用。
比如你要實現一個 mp3 的變聲播放,可以先用 MediaCodec 將 mp3 解碼成 PCM,通過 SoundTouch 處理得到變聲後的 PCM,再結合 AudioTrack 實現播放;如果你要將一個 mp3 變聲後儲存下來,那就在得到變聲後的 PCM 後,結合 MediaCodec 將其編碼儲存下來。
相比 Fmod,SoundTouch 的整合會複雜點,不是隨便參考一篇教程就可以跑通的了,這裡提供一份親測可行的SoundTouch 原始碼 。