音频变声实质上是通过调整 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 源码。