变声功能大家都接触过,比如qq中发送一段变声消息,网络视频中演员经过处理的声音。其实这个功能实现起来并不复杂,因为声音处理的算法有大神已经帮我们写好,拿来用就行。
代码是用c写的,我们来稍微处理一下
一、生成so库文件
1.首先我们使用Android Studio生成一个新项目,勾选Include C++ support
![](https://img.haomeiwen.com/i6893976/c5bf31bf284a0372.png)
2.将smbPitchShift.cpp放在app/src/main/cpp目录下
![](https://img.haomeiwen.com/i6893976/79b2cb8e7802580b.png)
3..新建VoiceProcessor类,编写native方法,生成JNI函数
![](https://img.haomeiwen.com/i6893976/e045b3ad0f8e5598.png)
4.将JNI函数拷贝至smbPitchShift.cpp中
![](https://img.haomeiwen.com/i6893976/8a4732a949cabd14.png)
5.调用smbPitchShift函数处理声音数据
![](https://img.haomeiwen.com/i6893976/8766a91845b1179f.png)
6.修改CMakeLists.txt构建脚本文件
![](https://img.haomeiwen.com/i6893976/36538fa4af255f3b.png)
7.删除MainActivity中多余代码,运行项目得到so库文件
![](https://img.haomeiwen.com/i6893976/3869cb620bac0d1d.png)
![](https://img.haomeiwen.com/i6893976/c6eb67410cb054c6.png)
二、在项目调用so库中处理声音函数
1.声音录制和播放
由于播放时需要对声音进行处理,所以声音的录制和播放我们用AudioRecord和AudioTrack来做,具体如何实现文章最后我会放出demo地址
2.将so库文件拷贝至src/main/jniLibs目录下
![](https://img.haomeiwen.com/i6893976/2cfa941869783828.png)
3.新建VoiceProcessor类,路径和生成so文件时一致
![](https://img.haomeiwen.com/i6893976/f51644a74e7c2d55.png)
4.加载库,编写调用方法
![](https://img.haomeiwen.com/i6893976/c0771b657d4b1e8e.png)
5.OK,最后在需要对声音进行处理的地方进行调用
![](https://img.haomeiwen.com/i6893976/569dbd2818d3b5fc.png)
三、效果
pitchShift值在0-2之间,改变pitchShift值声音发生改变,达到qq录音变声中萝莉,搞怪,惊悚等效果,pitchShift值为1时声音不变。
![](https://img.haomeiwen.com/i6893976/b4cd25f8f7ef31ad.png)
![](https://img.haomeiwen.com/i6893976/1743fc7e5dd36d04.png)
Github:MyVoice
网友评论