乐趣区

关于算法:详解低延时高音质回声消除与降噪篇

在实时音频互动场景中,除了咱们上一篇讲到的编解码会影响音质与体验,在端上,降噪、回声打消、自动增益模块同样起着重要作用。在本篇内容中咱们将次要围绕回声打消和降噪模块,讲讲实时互动场景下的技术挑战,以及咱们的解决思路与实际。

回声打消的三大算法模块优化

在语音通信零碎中,回声打消(Echo Cancellation)始终扮演着外围算法的角色。一般来说,回声打消的成果受诸多因素的影响,包含:

  • 声学环境,包含反射,混响等;
  • 通话设施自身声学设计,包含音腔设计以及器件的非线性失真等;
  • 零碎性能,处理器的计算能力以及操作系统线程调度的能力。

声网回声打消算法在设计之初,就将算法性能、鲁棒性和普适性作为最终的优化指标,这一点对于一个优良的音视频 SDK 来说至关重要。

首先,回声是怎么产生的?简略来讲,就是你的声音从对方的扬声器收回,这个声音又被他的麦克风给收录了进去,这个被麦克风收录的声音又传回到你这一端,你就听到了回声。为了打消回声,咱们就要设计一个算法将这个声音信号从麦克风信号中去除掉。

那么声学回声打消模块(AEC, Acoustic Echo Cancellation)是如何打消回声的呢?具体的步骤见如下简图所示:

  • 第一步须要找到参考信号 / 扬声器信号(蓝色折线)跟麦克风信号(红色折线)之间的提早,也就是图中的 delay=T。
  • 第二步依据参考信号预计出麦克风信号中的线性回声成分,并将其从麦克风信号中减去,失去残差信号(彩色折线)。
  • 第三步通过非线性的解决将残差信号中的残余回声给彻底克制掉。

与以上的三个步骤绝对应,回声打消也由三个大的算法模块组成:

  • 提早预计(Delay Estimation)
  • 线性自适应滤波器(Linear Adaptive Filter)
  • 非线性解决(Nonlinear Processing)

其中「提早预计」决定了 AEC 的上限,「线性自适应滤波器」决定了 AEC 的下限,「非线性解决」决定了最终的通话体验,特地是回声克制跟双讲之间的均衡。

注:双讲是指在交互场景中,互动单方或多方同时讲话,其中一方的声音会受到克制,从而呈现断断续续的状况。这是因为回声打消算法“矫枉过正”,打消了局部不该去除的音频信号。

接下来,咱们先围绕这三个算法模块,别离讲讲其中的技术挑战与优化思路。

一、提早预计

受具体零碎实现的影响,当把参考信号与麦克风信号别离送入 AEC 模块进行解决之时,它们所存入的数据 buffer 之间存在一个工夫上的提早,即咱们在上图中看到的“delay=T”。假如这个产生回声的设施是一部手机,那么声音从它的扬声器收回后,一部分会通过设施外部传导到麦克风,也可能会通过外部环境传回到麦克风中。所以这个提早就蕴含了设施采集播放 buffer 的长度,声音在空气中传输的工夫,也蕴含了播放线程与采集线程开始工作的时间差。 正是因为影响提早的因素很多,因而这个提早的值在不同零碎,不同设施,不同 SDK 底层实现上都各不相同。 它在通话过程中兴许是一个定值,也有可能会中途变动(所谓的 overrun 和 underrun)。这也是为什么一个 AEC 算法在设施 A 上可能起作用,但换到另一个设施上可能成果会变差。提早预计的精确性是 AEC 可能工作的先决条件,过大的预计偏差会导致 AEC 的性能急剧下降,甚至无奈工作,而无奈疾速跟踪时延变动是呈现偶现回声的重要因素。

加强提早预计算法鲁棒性

传统算法通常通过计算参考信号跟麦克风信号之间的相关性来决定提早。相关性的计算能够放在频域上,典型的就是 Binary Spectrum 的办法,通过计算单频点上的信号能量是否超过肯定门限值,理论将参考信号跟麦克风信号映射成了两维的 0 / 1 数组,而后通过一直挪动数组偏移来找到提早。最新的 WebRTC AEC3 算法通过并行的多个 NLMS 线性滤波器来寻找提早,这个办法在检测速度及鲁棒性方面都获得了不错的成果,然而计算量十分大。当在时域上计算两个信号的相互关时,一个显著的问题是语音信号蕴含大量的谐波成分并且具备时变个性,它的相干信号经常呈现出多峰值的特色,有的峰值并不代表真正的提早,并且算法容易受到噪声烦扰。

声网提早预计算法通过升高信号之间的相关性(de-correlate),可能无效克制 local maxima 的值以大大加强算法的鲁棒性。如下图所示,右边是原始信号之间的相互关,左边是声网 SDK 解决后的相互关,可见信号的预处理大大加强了提早预计的鲁棒性:

算法自适应,升高计算量

通常提早预计算法为了升高计算量的须要,会事后假如回声信号呈现在某个较低的频段内,这样就能够将信号做完下采样之后再送入提早预计模块,升高算法的计算复杂度。然而面对市面上数以万计的设施及各种路由,以上的假如往往并不成立。下图是 VivoX20 在耳机模式下麦克风信号的频谱图,可见回声都集中在 4kHz 以上的频段内,传统的算法针对这些 case 都会导致回声打消模块的生效。声网提早预计算法会在全频段内搜寻回声呈现的区域,并自适应地抉择该区域计算提早,确保算法在任何设施,路由下都有准确的提早预计输入。


图:VivoX20 接入耳机后的麦克风信号

动静更新音频算法库,晋升设施覆盖率

为了确保算法的继续迭代改良,声网保护了一个音频算法的数据库。咱们应用大量不同测试设施,在不同声学环境下采集到了各种参考信号和麦克风信号的组合,而它们之间的提早全副通过离线解决的形式进行标定。除了实在采集的数据,数据库中也蕴含了大量仿真的数据,包含不同的谈话人,不同的混响强度,不同的底噪程度,以及不同的非线性失真类型。为了掂量提早预计算法的性能,参考信号与麦克风信号之间的提早能够随机的变动,用以察看算法对突发提早变动的响应。

所以判断一个提早预计算法的优劣,还须要考查:

1. 适应尽量多的设施、声学环境,且在尽量短的工夫内依据设施、声学环境的因素匹配适合的算法;

2. 在突发随机的提早变动后,能及时动静调整算法策略。

以下是声网 SDK 与友商之间的提早预计性能比照,总共应用了数据库中 8640 组测试数据。从图中数据能够看出,声网 SDK 能够在更短的工夫内找到大多数测试数据的初始时延。在 96% 的测试数据中,声网 SDK 能在 1s 之内找到它们正确的提早,而友商这一比例为 89%。

第二个测试的是在通话过程中呈现随机的提早抖动,测试提早预计算法要在尽量短的工夫内找到准确的提早值。如图中所示,声网 SDK 在 71% 的测试数据中能在 3s 之内从新找到变动后的准确提早值,而友商这个比例为 44%。

二、线性自适应滤波器

对于线性滤波器,已有大量的文献介绍其原理及实际。当利用于回声打消的利用场景,次要思考的指标蕴含收敛速度(convergence rate),稳态失调(steady-state misalignment)及跟踪性能(tracking capability)。这些指标之间往往也有抵触,譬如较大的步长能够改善收敛速度,然而会导致较大的失调。这个就是自适应滤波器中的没有收费的午餐定理 (No Free Lunch Theorem)。

对于自适应滤波器的类型,除了最为罕用的 NLMS 滤波器(Model Independent),还能够应用 RLS 滤波器(Least Squares Model)或 Kalman 滤波器(State-Space Model)。除了各自实践推导中的各种假如,近似,优化,这些滤波器的性能最终都归结到如何计算最佳的步长因子(在卡尔曼滤波器外面步长因子合并到 Kalman Gain 的计算外面)。在滤波器尚未收敛或是环境传输函数渐变的情景下,步长因子须要足够大以跟踪环境变动,当滤波器收敛及环境传递函数变动迟缓的时间段,步长因子应尽量减小以达到尽可能小的稳态失调。对于步长因子的计算,须要思考自适应滤波器后残余回声跟残差信号间的能量比值,建模为零碎的 leakage coefficients。这个变量经常等价于求滤波器系数跟实在传递函数之间的差(Kalman 滤波器外面称为状态空间状态向量误差),这也是整个预计算法中的难点。除此之外,双讲阶段的滤波器发散问题也是一个须要思考的点,一般来说这个问题能够通过调整滤波器构造,应用 two echo path models 来解决。

声网自适应滤波器算法并不应用繁多的滤波器类型,而是兼顾了不同滤波器之间的长处,同时搭配自适应算法计算最优的步长因子。此外,算法通过线性滤波器系数实时预计环境的传递函数,主动修改滤波器长度,以笼罩通信设施连贯 HDMI 外设等高混响,强回声的场景。如下是一个例子,在声网办公室的一个中型会议室中(面积约 20m2,三面玻璃墙),应用 Macbook Pro 通过 HDMI 连贯小米电视,图中是线性滤波器时域信号的变化趋势,算法能主动计算并匹配理论环境传递函数的长度(在第 1400 帧左右自动检测出了强混响环境),以优化线性滤波器的性能。

同样的,咱们也应用数据库中大量测试数据进行声网 SDK 与友商之间的性能比照,比照的指标包含稳态失调(滤波器收敛之后对回声的克制水平)以及收敛速度(滤波器达到收敛状态须要的时长)。第一张图代表自适应滤波器的稳态失调,声网 SDK 在 47% 的测试数据中能达到超过 20dB 的回声克制,而友商的比例为 39%。

下图显示的是自适应滤波器的收敛速度,声网 SDK 在 51% 的测试样本中能在通话前 3s 之内收敛到稳态,而友商的比例为 13%。

三、非线性解决

非线性解决旨在克制线性滤波器所没有预测出的回声成分,通常通过计算参考信号,麦克风信号,线性回声以及残差信号间的相关性,或是将相关性间接映射到克制增益上,或是通过相关性预计出残留回声的功率谱,进一步通过维纳滤波器等传统降噪的算法克制残留回声。

作为回声打消算法的最初一个模块,除了克制残留回声之外,非线性处理单元也肩负着监控整个零碎是否失常工作的重任,譬如线性滤波器是否因为提早抖动而无奈失常工作?在声网 SDK 回声打消之前是否存在硬件回声打消未能解决的残余回声?

上面是一个简略的例子,通过自适应滤波器预计出的回声能量等外部参数,可能更快的发现提早变动的景象,并且提醒 NLP 采取相应的动作:

随着声网 SDK 笼罩的场景越来越广,针对音乐信号的传输成为了一个重要的场景。声网 SDK 针对音乐信号的回声打消体验做了大量的优化,一个典型场景是舒服噪声的预计算法改良。传统算法应用基于 Minimum Statistics 的算法原理对信号中的底噪进行预计,当把这个算法利用于音乐信号时,因为音乐信号比之语音信号更为安稳,因而会过高的预计噪声功率,反映到回声打消中会导致解决后有回声时段与无回声时段间的底噪(背景噪声)不安稳,体验极差。声网 SDK 通过信号分类以及模块交融的形式,彻底解决了 CNG 预计导致的底噪起伏景象。

除此之外,声网 SDK 还针对所有可能碰到的极其状况,包含非因果零碎,设施频率偏移,采集信号溢出,声卡蕴含零碎信号处理等等,都进行了大量的优化,确保算法可能工作在所有的通信场景中。

音质优先的降噪策略

降噪对信号音质的影响大于回声打消模块,这一点源自于在降噪算法的设计之初,咱们先验的假如底噪都是安稳信号(至多是短时安稳的),而依据这个假如,音乐跟底噪的区分度显著弱于语音跟底噪的区分度。

声网 SDK 在降噪模块的前端预置了信号分类模块,可能准确的检测出信号的类型,并依据信号的类型调整降噪算法的类型及参数,常见的信号类型包含个别语音、清唱、音乐信号等。下图所示是两个降噪算法解决的信号片段,其中第一个是语音与音乐的混合信号,前 15 秒为含噪的语音信号,之后是 40s 是音乐信号,再之后是 10s 的含噪语音,语谱图从上到下别离是原始信号、友商处理结果、声网 SDK 处理结果。结果显示在语音段信号降噪性能差不多的前提下,竞品解决过信号中的音乐局部受到了重大的伤害,而声网 SDK 的解决并没有升高音乐的音质。

在第二个例子中,应用的音频是歌手的清唱,清唱中歌手重复收回“啊”的声音。在下图的语谱图中,从上到下别离是原始信号、友商的处理结果、声网 SDK 处理结果。结果显示,友商的降噪解决重大的伤害了原语音的频谱成分,而声网 SDK 残缺的保留了原语音的谐波成分,保障了歌手清唱时候的音质体验。

结语

自 1967 年贝尔实验室的 M. M. Sondhi 开创性的提出以自适应滤波器的办法来打消回声为开始,有数的钻研和实际都投入到了这个语音通信的最根本问题上。要完满的解决回声问题,除了要有弱小的算法作为根底,也须要在工程优化畛域做很多优化。声网会继续一直的改良回声打消在各个不同利用场景下的体验。

在本系列的下一篇内容中,咱们将随着音频信号,从设施端进入事实的网络环境,一边实地环行上海,一边聊聊音频互动场景下的延时、抖动,以及丢包反抗背地的优化策略。(以一张图来简略剧透,敬请期待)

退出移动版