qq_voicer_change变音处理方案
QQ 的变音功能背后的音频,还挺有意思的。如果你做 Android 开发,是对 NDK 那块感兴趣,不妨试试这个叫qq_voicer_change
的方案。用 NDK 配合 C++直接搞底层,性能真的不错。像变音、变调这些效果,核心思路其实就是操作 PCM 原始音频数据,再加上一点频域算法,效果就出来了。
NDK 的配置其实不难,关键是你得在build.gradle
里加上externalNativeBuild
,设置一下cppFlags
,像这样:
android {
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
音频的 C++代码放在src/main/cpp
里,核心方法是applyVoiceEffect
。Java 层调用原生方法,用System.loadLibrary("native-lib")
加载动态库就行了。C++里可以直接对jbyteArray
做,完记得释放:
JNIEXPORT void JNICALL
Java_com_example_NativeAudioProcessor_applyVoiceEffect(JNIEnv *env, jobject, jbyteArray audioData, jint length) {
jbyte *data = env->GetByteArrayElements(audioData, nullptr);
// 音频数据,比如变调
// ...
env->ReleaseByteArrayElements(audioData, data, 0);
}
要实现实时,可以用AudioRecord
采集音频,用AudioTrack
回放,这部分放在独立线程里比较稳。哦对了,如果你想搞点性能优化,OpenMP也可以加上,多核 CPU 跑得飞快:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
find_library(omp_lib libgomp)
target_link_libraries(native-lib ${omp_lib})
别忘了权限,录音要android.permission.RECORD_AUDIO
,还有读写存储权限也要加。
,这个项目适合想深入 NDK 玩点音频效果的你。如果你对变音感兴趣,或者正好在做相关项目,可以参考一下下面这些资料:
如果你想做一个像 QQ 那样的变音工具,qq_voicer_change
这个思路蛮靠谱的,性能高,玩法也多,动手试试吧。
下载地址
用户评论