美文网首页音视频直播技术iOS学习算法
变声总结(声音概念、采集、变声、SoundTouch 和 FMO

变声总结(声音概念、采集、变声、SoundTouch 和 FMO

作者: Ruiray95 | 来源:发表于2018-07-01 10:46 被阅读1485次

一、声音相关概念

声音是由物体震动产生的,我们可以把从感知的角度分为三种属性:

  • 响度(Loudness),即音量,与振幅有关。
  • 音调(Pitch),即高音和低音,与声音的频率有关系。
  • 音色:使用不同的材质来制作,所表现出来的音色效果是不一样的。

响度和音调只要联想到正弦波非常容易理解,然而音色是什么?

音色 = 基频 + 泛音(多个) 

一个物体发生的同时,会发出很多不同频率的波(谐波)。这许多不同频率的波由于相位差很小(也就是相隔时间很短),人是无法单独分辨的,所以这些波会混合起来一起给人一个整体的感受,而这个感受就叫做音色。

想想就很容易理解了,人的喉咙是立体的,发声时喉咙内每一部分都会产生振动,不同部位产生的振动频率就存在差异。其中频率的相对量最大的决定了声音的音调,其它的频率即泛音。当然人说话时还有鼻子和嘴来协助,另外即便是乐器或其它任何发声物体也往往是整体产生共鸣的结果。

看到一个这样的比喻:如果一个声音中从1到20K赫兹频率的波都有,并且都是1:1的关系,即相对强度都相同。这样一个声音就称为白噪音,听起来就和收音机收不信号时的音色一样。如果我有2万只音箱,每一个音箱分别对应放从1到20k赫兹不同频率的声波。那么我通过开关不同的音箱,调节每个音箱的音量,从理论上讲我就可以得到任何我想要的音色。不论是韩红的声音还是孙楠的声音,小提琴的声音。

声音采集

将模拟信号数字化,分为取样和量化两部分,即通常的 PCM(Pulse-code modulation) 脉冲编码调制技术。

  • 采样速率(Sampling Rate)

    人耳所能辨识的声音范围是 20-20KHZ,根据奈奎斯特抽样定理(要从抽样信号中无失真地恢复原信号,抽样频率应大于 2 倍信号最高频率),所以人们一般都选用 44.1KHZ(CD)、48KHZ 或者96KHZ 来做为采样速率。

  • 采样深度(Bit Depth)

    量化(Quantization) 是将连续值近似为某个范围内有限多个离散值的处理过程,这个范围的宽度离散值的数量表达,会直接影响到音频采样的准确性。一般 8位(256),和 16位(65536)来表示。

  • PCM 文件大小

    存储量 = (采样频率 · 采样位数 · 声道 · 时间)/8 (单位:字节数)
    
    • 采样频率:在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz。
    • 采样位数:在计算机中采样位数一般有8位和16位之分,8位不是说把纵坐标分成8份,而是分成2的8次方即256份; 同理16位是把纵坐标分成2的16次方65536份。
    • 声道数:单声道的声音只能使用一个喇叭发声,立体声的pcm可以使两个喇叭都发声,更能感受到空间效果。
  • 声道和立体声

    • Monaural (单声道)
    • Stereophonic(立体声)
    • 4.1 Surround Sound(4.1环绕立体声)
    • 5.1 Surround Sound(5.1环绕立体声)
  • 音频的几种文件格式

    • 不压缩的格式(UnCompressed Audio Format):PCM数据,wav, aiff
    • 无损压缩格式(Lossless Compressed Audio Format):FLAC, APE, WV, m4a
    • 有损压缩格式(Lossy Compressed Audio Format):mp3, aac

常见的 wav 格式的音频数据其实是 pcm 文件 + 46字节的头信息,头信息记录了 PCM 文件的采样率、采样深度、声道数等信息,可方便播放进行解码。

二、变声原理

变声即是对 PCM 数据进行的处理,如果是其它格式(如:MP3)也需要先解压成 PCM 格式再进行处理。

常用的变声,如女生、男生、小黄人都是对音调(即频率)进行的处理。当音调高时就是女声,低时即男声,常常听到的女声比男声高八度还是有点道理的。

另外还有一些对声音的高级处理,如:混响(Reverb)、回声(Echo)、EQ、锯齿(Flange)等。下面重点说一下混响:

Reverb(或残响)是Reverberation的简写,当一个声音发出后,当它碰到障碍物后会反射,碰到下一个障碍物会再反射,不停反射直至它的能量消失为止。这个持续在空间中反覆反射动作形成的声音集成,就是残响。不是每个频率衰减的速度都一样。同样的声音在同个空间不同位置,到达人耳所经过的反射次数、时间都是不同的,混音时使用 reverb 器材或插件可重新塑造声音的立体空间感,让声音有远近等不同距离的层次。

混音常用的Reverb效果器大概分为两大类。一类是靠电脑程式运算出来的演算式残响(Algorithmic Reverb);另一类是取样式残响(Convolution Reverb)。演算式残响就是利用程式运算,模拟空间的各种反应参数,是人工制造出来的残响。取样式残响是在真实空间中做声音脉冲反应的取样(impulse response),加到欲使用的声音上。

这里区分下 Reverb 和 Echo 的区别:

通常Echo是指声音发出后,要较长时间才会收到反射音的状态,就像我们对着远方的山大喊;「喂~」我们不会马上听到反射回来的声音,通常是喊完后隔了一小段时间才会听到明显反射回来的「喂~喂~~喂~~~」,这种称之为Echo,Echo算是reverb的一种,但 reverb 是个更大的概念。
当回声与原始声音直接的间隔较大时,如 >200ms,我们耳朵能分辨出两个声音的就是 Echo。如果两个声音直接的间隔比较小,通常我们无法分辨出来,与原始声音产生了共鸣的叫 Reverb。

三、第三方处理库

调研中发现的对声音处理的库主要有两个:

  • SoundTouch 是一个开源的音频处理库,用于改变音频流或音频文件的节奏、音调和播放速率。

  • FMOD 声音系统是为游戏开发准备的音频引擎,商业用途需要购买许可证。除了 SoundTouch 只能对声音进行变调处理功能外,还包括了前面提高和没提到的高级功能(Reverb、Echo、EQ、Flange、3D...)。

SoundTouch 与 FMOD 对比

  • SoundTouch

    • 优点:开源!因此具有很高的可塑性,可以自由定制完全适用于自己应用。可以处理音调、速率和节拍功能。

    • 缺点:功能单一,满足不了需求。

    如果只需要处理音调,变男声女声童声等功能使用 SoundTouch 是最佳选择。如果还需要对声音做其它处理,时间充足情况下也可以考虑修改源码,加入相应的算法来达到所需的功能。

  • FMOD

    • 优点:声音处理功能强大,可以方便的对声音进行处理。

    • 缺点:非开源,商用不免费,定制化差。

    虽然目前暂时选择用 FMOD,但是不能快速导出处理后的音频文件依然是硬伤,无法很好的满足产品需求。

FMOD 常见变声和参数说明

  • 萝莉

    提高 8 个音调

  • 大叔

    降低音调到 0.8

  • 惊悚(效果待优化)

    设置颤音效果(Tremolo)

    system->createDSPByType(FMOD_DSP_TYPE_TREMOLO, &dsp);
    dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW, 0.5);
    dsp->setParameterFloat(FMOD_DSP_TREMOLO_FREQUENCY, 20);
    
  • 搞怪(效果待优化)

    提高语速,x2

  • 空灵(效果待优化)

    设置 Echo

  • 山谷

    设置 Echo

    system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dsp);
    dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY, 500);
    dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK, 22);
    dsp->setParameterFloat(FMOD_DSP_ECHO_WETLEVEL, -15);
    
  • 礼堂

    设置混响,目前用的 Sfx 的混响模式,参数比较多,在 fmod_common.h 文件的 FMOD_REVERB_PROPERTIES 结构下面列举了值:

    FMOD_PRESET_AUDITORIUM { 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f }

  • 教室

    设置混响,Sfx 混响算法

    { 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f }

  • 现场演出

    设置混响,Sfx 混响算法

    FMOD_PRESET_CONCERTHALL { 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f }

  • 机器人(效果待优化)

    设置锯齿(Flange)效果

  • 小黄人(效果待优化)

    提高 8 个音调,加快语速 120%

  • 明亮

    调整 EQ,将 500-2000Hz 的 Q 值调高

四、生活中声音有意思的事(个人理解,科学度待考证)

研究了这么久的声音,回到生活中,解开了一些有趣的小点,原来为什么是这样。

  • 视频的倍速播放范围在 0.5-2 之间

    快速播放时其实是对音频数据的再次采样,并且在数据丢失的同时音调也会发生变化,根据前面采样时提到的奈奎斯特抽样定理,抽样频率应大于 2 倍信号最高频率,否则信号失真而无法完整获取信息,因此因此音频播放过快时而无法得到完整信息。

  • 电话的采样率是 8000Hz(次/每秒)

    人的发声范围为 85HZ~1100HZ,而电话采用 8000Hz 的采样率足以满足语音需求。(发音时还有谐波产生的频率肯定是大于这个范围的,但那个只会影响到音色,对交流没啥影响)

  • 女声比男声高八度

    其实女声比男声只高 4-6 度,并没有所说的 8 度。音乐上男女合唱设计为 8 度是为了能在一个调上(do re mi fa sol la si do)达到和谐的演奏效果。

  • 为嘛需要录音棚

    录音棚除了专业的录音设备,同时可减少噪音录入,混响录音棚的设计更是加强了录音的立体效果。

  • 声纹识别

    所谓声纹(Voiceprint),是用电声学仪器显示的携带言语信息的声波频谱。人在讲话时使用的发声器官--舌、牙齿、喉头、肺、鼻腔在尺寸和形态方面每个人的差异很大,所以任何两个人的声纹图谱都有差异。

五、还有待研究或实现的点

  • 如何准确的变出机器人、小黄人等音效?

    虽然设置了与相关视频中一样的参数,但是仍然无法达到理想的变身效果。可能是因为每个人的音调本身不一样导致,针对个人还需要进行微调等。

    下面是找到的一些变声视频:

  • 如何变某个人的声音,像柯南变声器一样?

    考虑过将自己的声音变成任何人的声音,最开始有一个天真的想法:“先将自己声音的基频提取出来,并分析提取目标声音的音调和泛音等,将自己的基音调至目标音调,并添加目标泛音模型,最后得到目标声音”。不过目前调研这一块比较绝望,还有待今后继续对声音的研究。

    下面是分析提取基频的一些资料:

六、参考资料

相关文章

  • 变声总结(声音概念、采集、变声、SoundTouch 和 FMO

    一、声音相关概念 声音是由物体震动产生的,我们可以把从感知的角度分为三种属性: 响度(Loudness),即音量,...

  • Android利用Fmod仿QQ变声音效

    看到QQ一些变声音效,这些声音效果可以采用SoundTouch,Fmod去处理。这篇文章我们用Fmod去实现变声音...

  • Android利用Fmod仿QQ变声音效

    看到QQ一些变声音效,这些声音效果可以采用SoundTouch,Fmod去处理。这篇文章我们用Fmod去实现变声音...

  • soundtouch 变声使用和算法

    soundtouch 简介 soundtouch 源码下载地址 编译完成之后$soundstretch --hel...

  • ios 直播变声功能

    最近有做iOS直播变声的需求,于是去网上搜索了可用的第三方变声库,最终选定了SoundTouch,SoundTou...

  • iOS直播变声

    最近有做iOS直播变声的需求,于是去网上搜索了可用的第三方变声库,最终选定了SoundTouch,SoundTou...

  • NDK—QQ变声环境搭建

    说起QQ变声效果大家并不陌生,这是用的啥技术呢?其实它使用到了fmod的东西,现在我们就来研究一下变声技术 fmo...

  • 记录两个关于处理音频的库

    1、SoundTouch库,可以实现对原有声音处理后达到变声的效果。该库的官网地址:http://www.suri...

  • 好声音30分享:

    干货,如何改变声音年龄和配音变声技巧 这期课程涉及如何用声音“增龄”或是“减龄” 以及一些配音中变声的小技巧 是很...

  • 直播变声器,盘点一下网红是怎么变声的?

    一,移动变声声卡 变声声卡是一种最简单的变声方式了,变声声卡是通过声卡接收人声,通过硬件对声音进行处理,将声音改变...

网友评论

  • keepKK:写的不错,总结到位
  • Little_Moon:请教一下,不知道你现在是如何导出加载fmod效果后的声音文件的呢
    Ruiray95:@Little_Moon 现在没有采用 fmod 处理音频。有一个 FMOD_OUTPUTTYPE_WAVWRITER 的参数可以设置导出文件,但是导出时长和音频时长是一样的问题还没有解决。主要处理代码如下,你可以参考一下:

    extern "C"
    JNIEXPORT void JNICALL Java_com_ionesmile_soundstudio_utils_MyFmodProcessor_process(
    JNIEnv *env, jclass jcls,
    jint type, jstring inputPath, jstring outputPath) {

    MyStreamBuf g_MyStreamBuf;
    std::cout.rdbuf(&g_MyStreamBuf);
    std::cout << "SoundRaTAG process() type = " << type <<
    " input = " << inputPath << std::endl;

    FMOD_RESULT result;
    //初始化
    System *system;
    Sound *sound;
    bool playing = true;
    Channel *channel;
    System_Create(&system);
    result = system->setOutput(FMOD_OUTPUTTYPE_WAVWRITER);

    std::cout << "SoundRaTAG testEcho() setOutput() result = " << result << std::endl;

    const char *input_path_cstr = env->GetStringUTFChars(inputPath, NULL);
    const char *output_path_cstr = env->GetStringUTFChars(outputPath, NULL);

    std::cout << "SoundRaTAG testEcho() init outputPath = " << output_path_cstr << std::endl;

    result = system->init(32, FMOD_INIT_NORMAL, (void *) output_path_cstr);

    std::cout << "SoundRaTAG testEcho() system.init() result = " << result << std::endl;

    try {
    system->createSound(input_path_cstr, FMOD_DEFAULT, NULL, &sound);

    system->playSound(sound, 0, false, &channel);

    DSP * dsp = parseTypeToDSP(type, system);
    if (dsp != nullptr) {
    channel->addDSP(0, dsp);
    } else {
    LOGE("DSP is NULL. type = %s ", type);
    }

    } catch (...) {
    std::cout << "参数设置异常" << std::endl;
    goto end;
    }

    while (playing) {
    channel->isPlaying(&playing);
    //单位是微妙
    usleep(1000);
    }
    goto end;

    end:
    env->ReleaseStringUTFChars(inputPath, input_path_cstr);
    env->ReleaseStringUTFChars(outputPath, output_path_cstr);
    sound->release();
    system->close();
    system->release();
    }

本文标题:变声总结(声音概念、采集、变声、SoundTouch 和 FMO

本文链接:https://www.haomeiwen.com/subject/inscuftx.html