音视频|【音频】削波失真(爆音)问题定位与解决

【音视频|【音频】削波失真(爆音)问题定位与解决】
【音频】削波失真(爆音)问题定位与解决

  • Why:为什么要解决削波失真问题?
  • What:什么是削波失真,如何定位
    • 用户反馈的现象
    • 音频异常环节定位
      • 音频异常是发生在音频处理的哪个环节?
      • 不同的音频采集方式都会出现爆音问题么?
      • 如何区分正常音频与异常音频?
  • How:如何处理削波失真问题
    • 如何避免削波失真现象?
      • 削波失真造成的原因
    • 音频有哪些具体的特征?异常的音频能否与某些具体的特征数据关联起来?
    • 分贝是什么?RMS振幅是什么?
      • 分贝是什么?
      • RMS振幅是什么?为什么采用均方根?
    • 直播端在拿到音频裸流后如何计算出音频的关键特征数据,从而进行对应的处理?
  • 音频分析工具
  • 参考资料

Why:为什么要解决削波失真问题? 对于直播产品来讲,用户最核心的体验就是流畅的接受直播的画面信息与音频信息。也就是作为用户,要能够让用户自己舒适的看到主播的画面以及听到主播讲述的东西。而对于爆音来讲就是直接影响到用户体验的,因此需要在整个直播环节及时定位爆音问题并作出响应。本篇文章梳理了整个爆音问题的定位以及提出对应的解决方案!
What:什么是削波失真,如何定位 用户反馈的现象
  1. 直播过程主播说话音量过高,用户会反馈有爆音现象
  2. 在RTC相关业务功能触发后(RTC会调整系统麦克风音量),反馈有爆音现象
音频异常环节定位 音频异常是发生在音频处理的哪个环节?
首先梳理整个语音处理流程以及直播客户端在整个直播过程中对语音信号进行了哪些加工。
  1. 在《语音信号处理》中摘取了部分语音处理的流程,总体结构框图如下:
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片

  2. 对于直播客户端来讲,参与的为上图中的紫色流程,详细的音频处理如下:
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片

  3. 用户反馈的爆音问题是已经完成混音编码推流的音频,因此需要确认是混音、降噪、麦克风音频采集哪个具体环节导致的音频异常,首先获取降噪混音前的麦克风裸流数据。
  4. 根据现象是主播音量过高或者RTC相关业务触发将系统麦克风音量调至80左右后会有爆音问题;因此在直播间,保持sony麦克风输入电平,衰减电平保持不变的情况下;分别将麦克风采集音量调至55(当前直播间的默认配置),以及100分别对麦克风采集到的裸流进行分析。以下是对应的音频波形。(采样频率为44.1k,位深16,双声道)
    (1)RtAudio PCM 音量55
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片
    (2)RtAudio PCM 音量100
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片

不同的音频采集方式都会出现爆音问题么?
通过播放采集到的裸流可以听出来麦克风音量设置为55音频正常、音量设置为100采集到的音频爆音;可以确认这个音频异常的问题与降噪以及后续的混音处理环节是无关的。那么这个问题有没有可能是直播客户端原有的音频采集导致的问题,因此后续分别使用Windows系统自带录音、Windows DirectSound以及WASAPI分别在麦克风音量设置为100进行音频采集,皆有爆音现象,
(1)下图为windows录音采集到的音频波形。(Windows 录音 PCM 音量100)
音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

(2)又分别使用Windows DirectSound与 WASAPI分别在麦克风音量设置为100进行音频采集,皆有爆音现象,下图为对应波形。
音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

(DirectSound PCM 音量100)
音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

(WASAPI PCM 音量100)
如何区分正常音频与异常音频?
经过上述梳理可以得到以下结论:
  1. 音频异常在预处理以及数字化的过程中已经损坏,与降噪混音等环节无关。
  2. Windows Dsound以及WASAPI;原有的RtAudio音频自采,RTC音频采集,Windows录音皆有爆音问题。
  3. 所有爆音的音频波形都有波形被削的特征。
How:如何处理削波失真问题 根据以上的原因分析已经确认了音频异常发生在语音信号的预处理以及数字化的过程中;并且可以识别出所有的爆音波形都有一个共同的特征,削波失真现象。因此爆音问题解决思路也很清晰.
如何避免削波失真现象? 削波失真造成的原因
这里引用百度百科的解释:削波失真的产生是由于每个电路和音响单元都有一定的动态,这是由于电子电路本质决定的,若信号电平过强,超过电路允许范围(阈值),信号就不能顺利通过,而其波形被削掉一部分。削波信号进入扬声器后,其电流通过扬声器音圈,由于削波信号中的直流成分不能使音圈运动,其电能无法转换成机械能,从而产生大量热能,致使音圈发热,若该削波失真非常严重,其直流电流则较大,有可能损坏扬声器高音单元,使其单元音圈开胶、开裂或振断等严重损坏现象,使其声音变形,使高音单元损坏,有时甚至彻底烧毁。
简单总结就是输入的语音信号过强导致的音频损坏。因此需要减弱输入的语音信号,经过梳理一共有一下两种方式:
  1. sony无线麦克风支持动态设置射频输出电平以及音频输入的衰减电平;可以减小输入电平或增加衰减电平来解决问题
  2. 降低系统麦克风的采集音量以及增益
音频有哪些具体的特征?异常的音频能否与某些具体的特征数据关联起来? 在【音频异常环节定位】中熟悉了正常音频与异常音频的波形,得出异常的音频波形皆有削波失真的现象;接下来会展开看看其它除了波形以外的的能够反映音频信息的数据。
音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

区域一:该音频的振幅统计的详细信息:峰值幅度、采样值、RMS振幅等
区域二:音频左右声道的波形
区域三:音频的输入电平
首次看到这三个区域会有以下几个疑问?
  1. 一般我们将人类可以忍受的声音是0分贝到70分贝,为什么这里的分贝值是负的?
  2. RMS振幅是什么?为什么要采用均方根?
分贝是什么?RMS振幅是什么? 分贝是什么?
  1. 分贝的定义:通常表示两个声音信号或电力信号在功率或强度方面的相对差别的单位,相当于两个水平的比率的常用对数的十倍;
    下面进行一个简单的分贝计算推导:
    声音的响度 = 能量/(时间面积) 由于能量比时间为功率,所以可得
    声音的响度 = 功率/面积 (瓦/㎡) 人类听力的响度范围为(.000000000001 瓦 /㎡——1 瓦 / ㎡);鉴于.000792710162 瓦 / ㎡与.000006288415 瓦 / ㎡的比较比较繁琐,所以引入了对数计算即:
    log (.000792710162) = -3.1 log (.000006288415) = -5.2
    这个差值2.1即是贝尔,分贝
    10以后:
    10log (.000792710162) = -31 10log (.000006288415) = -52
    再做差为21,这个21就是分贝,即10 * log (.000792710162 / .000006288415) = 21 dB
  2. 有关分贝的名词有很多,例如dBSPL、dBu、dBV、dBm、dBVU、dBFS;通常我们讲到的”分贝“,即是dBSPL(Sound Pressure Levels)
    引入新的公式声响响(I)和声压§的关系: I = P2/ρ。
    根据(1)中得出的公式dB = 10 * log (x / y) ,当x与y用声响作为测量单位的时候,将P2/ρ带入公式可得:
    dBSPL = 10log[ (Px^ / ρ) / (Py^ / ρ) ] = 20log(Px/Py) 。
    普通人能听到的声压范围为.00002帕斯卡——20帕斯卡,可以得出普通人能够忍受的分贝范围为:
    20 * log (.00002 Pa / .00002 Pa)——20 * log (20 Pa / .00002 Pa) ,即0dBSPL——120dBSPL;
    总结:根据1和2我们可以得出两个公式
    dB = 10 * log (x / y) ---- 以声响作度量单位时计算分贝的公式,单位应该是 W / m2 dB = 20 * log (x / y) ---- 以声压作度量单位时计算分贝的公式,单位应该是 Pa
  3. dBFS(全分贝刻度),是一种为数字音频设备创立的分贝值表示方法。参照数是最大的一个,也就是说0dBFS是数字设备能够到达的最高响度水平。所以在音频分析工具中,峰值表的最高刻度都是0。
    数字音频,以16bit的位深为例,采样信号的最大值为65536,所以计算dBFS的公式为:
    dBFS = 20 * log (采样信号 / 65536)
    求得16bit位深的dBFS的区间为20 * log (1 / 65536)——20 * log (65536 / 65536),即-96 dBFS——0 dBFS
    因此也就解释了音频分析工具中的输入电平最大值为0,其余皆为负值的现象。
RMS振幅是什么?为什么采用均方根?
振幅即音量,RMS振幅表示音量的均方根。均方根值在物理上也称作为效值,它的计算方法是先平方、再平均、然后开方。RMS的意义是什么?
首先RMS是用来说明样本的离散程度。比如两组样本:
第一组有以下三个样本:3,4,5第二组有一下三个样本:2,4,6
虽然平均值都是4,但是第一组的三个数值相对更靠近平均值,也就是离散程度小。对应到我们要区分的音频特征:振幅上来讲:我们要能够区分一下两种波形的区别:
音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

音视频|【音频】削波失真(爆音)问题定位与解决
文章图片

也就是连续几个采样点的音频振幅要足够接近数字音频的最大值,并且离散程度要小。避免由于某个点过高计算平均值所带来的误差。
直播端在拿到音频裸流后如何计算出音频的关键特征数据,从而进行对应的处理? 经过以上的分析了解了RMS振幅,下面就通过计算【问题定位】中的PCM数据的RMS振幅来校验我们是否能够通过RMS振幅来识别出爆音现象。
音频1:系统音量设置为55的PCM裸流。
音频2:系统音量设置为100的PCM裸流。
经过多次测试,我们将音频数据的每512字节设置为1帧,即每一帧计算出一个RMS振幅,观察数据变化。
  1. 音频1的RMS振幅曲线:
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片
  2. 音频2的RMS振幅曲线:
    音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片

    可以看出,异常音频的RMS振幅会有连续多个点在峰值位置,因此可以确定动态调整的策略:连续多个音频帧的RMS振幅在异常区间内,即有爆音现象,需要调低系统麦克风采集音量与增益。
    完成代碼编写后,随即在半身直播间进行测试。在不修改sony麦克风的输入电平与衰减电平的前提下,先将麦克风音量设置为100,随机观察音频的RMS振幅曲线与音频波形的变化。测试结果如下:
  3. RMS振幅的变化:音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片
  4. 音频波形的变化:音视频|【音频】削波失真(爆音)问题定位与解决
    文章图片
音频分析工具 【1】 Audacity
【2】Adobe Audition 2020
参考资料 【1】《语音信号处理》第一章、第二章、第三章
【2】《Android音视频开发》第一章
【3】 什么是分贝?如何计算声音分贝?
【4】分贝是什么?
【5】音量与响度
【6】计算分贝值
【7】音频振幅
【8】均方根值一般在什么情况下取,有何意义?

    推荐阅读