前言:既然说是为变声这个功能而做,就我自己所了解的,原生中应该只有ffmpag,或者soundtouch可以实习,而这两种都涉及到NDK开发,这就有点难受了,当时公司是用的腾讯推广的变声器,后来因为老总发话,要求自己开发,当时看的是挺懵逼的,弱小的我,只能一点一点的研究。下面言归正传:
既然说了是为了变声这个功能模块,就先说一下音频基础:
声音属性
响度(Loudness):音量,与声波的振幅有关
音调(Pitch):音调与声音的频率有关——声音频率越大时,音调就越高,否则就越低
音色(Quality):由物体结构特性所决定
A/D转换(Analog-to-Digital Converter)
样本sample:声波
→ 采样sampling
→ 量化quantization:将连续值离散化
→ 编码coding:可由软件或硬件芯片完成
→ (压缩compress):mp3等格式
→ 二进制1010…10
PCM(Pulse-code modulation,脉冲编码调制),是将模拟信号数字化的一种经典方式,计算机、DVD以及数字电话等系统中的标准格式采用的就是PCM。它的基本原理就是以上流程产生PCM流。另外,可以调整PCM的以下属性来达到不同的采样需求:
采样率(Sampling Rate):多久采样一次。人耳所能辨识的声音范围是20-20KHZ,所以一般都选用44.1kHz、48kHz或者96kHz做为采样率。
采样深度(Bit Depth):量化的离散值的位数,越高越精准,如32Bit
Nyquist奈奎斯特采样定理
要完整重构原始模拟信号,则采样率必须是原始频率的两倍以上。
数字音频格式
未压缩:PCM数据是未压缩的数据,在计算机的存储格式一般是.wav(Windows)和.aiff(Mac)
压缩:
无损压缩:一定程度上减少体积,如.flac、.m4a
有损压缩:接受范围内有效减少体积,如.mp3、.aac
声道channel
mono,Monaural,单声道:只有1个音源录制的声音
stereo,Stereophonic,立体声
Surround Sound 4.1,4.1环绕立体声:左前+右前+左后+右后+低音炮
Surround Sound 5.1,5.1环绕立体声,如杜比数字技术:左前+中置+右前+左后环绕+右后环绕+低音炮
简单介绍完音频基础后,相比应该是有了一些概念了,下面说一下SoundTouch
SoundTouch是一个用C++编写的开源的音频处理库,可以改变音频文件或实时音频流的节拍(Tempo)、音调(Pitch)、回放率(Playback Rates),还支持估算音轨的稳定节拍率(BPM rate)。ST的3个效果互相独立,也可以一起使用。这些效果通过采样率转换、时间拉伸结合实现。
Tempo节拍 :通过拉伸时间,改变声音的播放速率而不影响音调。
Playback Rate回放率 : 以不同的转率播放唱片(DJ打碟?),通过采样率转换实现。
Pitch音调 :在保持节拍不变的前提下改变声音的音调,结合采样率转换+时间拉伸实现。如:增高音调的处理过程是:将原音频拉伸时长,再通过采样率转换,同时减少时长与增高音调变为原时长。
处理对象
ST处理的对象是PCM(Pulse Code Modulation,脉冲编码调制),.wav文件中主要是这种格式,因此ST的示例都是处理wav音频。mp3等格式经过了压缩,需转换为PCM后再用ST处理。
主要特性
易于实现:ST为所有支持gcc编译器或者visual Studio的处理器或操作系统进行了编译,支持Windows、Mac OS、Linux、Android、Apple iOS等。
完全开源:ST库与示例工程完全开源可下载
容易使用:编程接口使用单一的C++类
支持16位整型或32位浮点型的单声道、立体声、多通道的音频格式
可实现实时音频流处理:
输入/输出延迟约为100ms
实时处理44.1kHz/16bit的立体声,需要133Mhz英特尔奔腾处理器或更好
在Android 中使用:
1.下载源码
下载:soundtouch-1.9.2.zip ,包含ST的C++源码、Android-lib示例工程。
链接 :http://www.surina.net/soundtouch/sourcecode.html
2. 编译so这里可以根据需求来,根据需要去添加自己对应的so文件。如图:
3. 配置NDK
(1)在项目根目录下的gradle.properties中添加
android.useDeprecatedNdk=true
如果没有gradle.properties,从其他项目拷贝过来或者自己新建一个都可以。
(2)在local.properties中添加ndk路径(是你的ndk安装路径)
ndk.dir=ndk.dir=D:\java\androidstudio\sdk\ndk-bundle
(3)在app的build.pradle中添加:
externalNativeBuild {
ndkBuild {
path file("src\\main\\jni\\Android.mk")
}
}
同时修改
minSdkVersion 14
targetSdkVersion 27
这样就可以了