编者按: 随着在线会议的普及,用户已经不再满足于能听到,而是要有更为极致的听感体验,如何能够在复杂多变的应用场景中依旧保证声音清晰流畅是对会议系统的极大挑战。LiveVideoStackCon2022上海站大会邀请到了全时 音视频研发部经理 顾骋老师,为大家详细介绍了语音前处理技术在会议场景中的应用与挑战。
文/顾骋
整理/LiveVideoStack
大家好,我是顾骋,来自全时,本次分享的主题是语音前处理技术在会议场景中的应用与挑战。
内容主要包括三个方面:第一部分介绍影响会议声音质量的因素及应对方法;第二部分介绍语音前处理技术在会议中的应用;第三部分介绍语音前处理与深度学习技术的结合及效果。
以下是我们在视频会议当中可能经常会遇到的两个场景和问题:
1. 开会时出现杂音,影响参会人员体验
2. 同事讲话时,有他人的键盘声传入影响会议进行
那么,导致产生这些问题的原因是什么呢?
1、如何保障会议中的声音质量
影响声音质量的因素有很多,其中最常见的就是网络。因为声音在网络传输的过程中会有所损失,如数据丢失、包的乱序,或延时较大导致声音过了很久才可被听到。针对这个问题,首先我们需要对相关网络部署进行保障,其次在传输层做一些流控,如在编码时编写冗余信息来对抗丢包问题或是在解码时根据帧与帧的相关性来预测丢失的语音帧。
第二个因素是环境因素,不同于网络因素,环境因素较难察觉。举个例子,同事A在会议室中用座机开会时,同事B进入会议室,打开电脑进入会议,两台设备都开着外放,会导致刺耳尖锐的啸叫声。或是在墙面吸音效果较差的房间进行会议时,由于混响较大,较难听清对方声音。此外,随时随地开会的场景很丰富,在路边开会时,喇叭声传入会议中使得会场混乱,影响他人体验等等。
第三个是硬件因素。如使用iPhone的场景下回声问题出现的概率较小,这是因为它的麦克风扬声器耦合性较好,而部分安卓机由于耦合不良,导致麦克风采集到的扬声器放出的声音非常大,有的声学设计包含许多非线性因素。我们在安卓机上会专门进行适配调整。用头戴麦的会议效果很理想,因为它本身是近场拾音,不会采集到周围杂音,同时不外放的话也就不会出现回声。但如果用笔记本电脑开外放,或连接外置音箱、外置麦克风时,就会出现很多问题。
第四个是软件因素。同一台设备中的同一个软件,在同样的网络环境中,有时好,有时坏。软件的播放或采集通过不同线程驱动,当CPU占用高时,录放设备的同步就会出现问题。此时回音消除模块的近端信号与远端信号之间的时延会发生抖动,导致回声泄露。另外,有很多电脑厂商对声卡做了一些音频处理,如硬件的回声消除或噪声抑制。然而有些厂商设计的产品未必理想,导致消除不彻底致使语音失真,在后期使用软件进行算法处理时往往难以去除这部分噪声或回声。
2、语音前处理在会议中的应用
如图所示为音频引擎的大致流程图。下半部分(蓝线)是uplink链路,麦克风采集信号后通过高通滤波去除工频干扰噪声。大部分采集到的声音是48khz或44.1khz,频率很高,但对于正常语音处理来说频率在16khz以下即可,所以我们会先对语音做分频带处理,回音消除、噪声抑制的工作主要在低频带进行,并将计算出来的增益值映射到高频带,然后再恢复成全带信号,最后经过Agc模块。
Agc可以解决由于说话人离麦克风的距离远近变化导致的声音忽大忽小,以及补偿回音消除、噪声抑制处理过程中对语音造成的损伤。最终前处理后的音频数据会被编码发送到网络端。
上半部分(红线)是downlink链路,从网络接收的包经过NetEq处理后解码,取出低频段作为回声消除模块的参考信号,同时支持多通道混音(除语音之外可能会接收到音乐信号,或是部分场景中使用客户端模式混音),最后从扬声器中播放。
噪声抑制和回声消除是三个引擎中最重要的两个版块。
如图所示为经典的噪声抑制功能图,传统噪声抑制算法首先通过vad检测判断当前是语音还是噪声,然后利用vad检测结果来估算噪声幅度谱,最后从含噪语音幅度谱中减去噪声幅度谱就是纯净语音的幅度谱,相位信息则是利用了含噪语音的相位谱。
噪声抑制分为两步,一步是估计噪声,另一步是计算增益因子。
估噪声最常用的是MCRA。首先计算粗略噪声,利用最小值跟踪法获得噪声的初步估计。即使在语音活动期间也不是所有频点都含有语音,很多频点都会有噪声,因此对于单个频点而言它的幅度谱最终会趋近于噪声的级别。我们可以通过最小值估计来估算初始噪声级别,再通过时间递归法对初始噪声进行平滑处理,如果当前是语音,就用上一帧的数据更新它,如果当前是噪音,就用当前帧的数据更新它。
对于噪声抑制来说,我们可以用简单的谱减法。从含噪的幅度谱中去除噪声幅度谱后即可获得纯净幅度谱,这无疑是最简单的方法,但缺点很明显,这种方法容易过多去除“噪声谱”,可能会减多,也可能会减少导致音乐噪声的出现。
目前应用较广泛的方法是维纳滤波,首先利用估算的纯净幅度谱和理想幅度谱的均方误差,取其最小值,也就是导数为0的地方,估算出先验信噪比后即可算出维纳滤波系数。当然也有很多其他方法,如基于统计意义的方法等,且由于人耳对语音的感知是非线性的,我们可以将幅度谱转换到对数谱,得到的结果会更理想。
声音从扬声器里播放出来之前,会通过直达声直接传给麦克风,同时经过房间的连续反射最终被麦克风采集,相当于扬声器中传出的声音再次传入麦克风,导致对端说话时能听到自身回音。针对回声,一般做法是通过自适应滤波器估算房间冲击响应,再和远端信号进行卷积,得出估算的回音信号。实际应用中会更复杂,因为扬声器和麦克风之间有很多非线性耦合,房间也存在一些混响,而且可能除了远端说话时也有近端在说话,一直处于双讲状态,导致回声消除比较困难。
对于上文提到的回声估计,我们用到较多的是NLMS自适应滤波器,原因是其有利于工程实现,我们基本是通过NLMS方式在频域分块处理。
回声消除主要包括以下几点:
1、时延估计
远端信号首先需要和近端信号对齐。因为在房间内,扬声器播出的声音会被麦克风采集,造成时延差,此外,声卡的输入和输出存在缓存buffer,再加上采集播放线程不同步等问题,不可避免地会引入时延。时延较小时,由于线性滤波器本身有一定长度,能够抵消时延,所以问题不大,但当时延较大时就需要采用时延估计算法,比如用最简单的互相关法。
2、线性回声消除
采用自适应滤波器能够估算出回声在房间内的传播路径,得到线性回声估计。其中归一化最小均方误差(NLMS)应用最为广泛,我们往往通过控制迭代步长来使其尽快收敛,达到稳定状态。
3、双讲检测
那么如何加快收敛速度呢?这就需要双讲检测算法(dtd),因为在仅有远端说话时应尽快更新滤波器,但如果同时有近端说话时,应尽量冻结滤波器以防发散。其实双讲检测操作起来比较困难,因为在有噪声干扰时检测很难准确。在很多场景我们选择通过控制迭代步长起到类似双讲检测作用,同时为了提高收敛速度,我们给滤波器组的每个块分配不同权重,比如更近的块权重更大,从而收敛更多。
4、残留回声抑制
在实际场景中,线性回声包括非常大的非线性成分,简单地通过线性滤波器无法完全消除,所以需要通过RES估算残留回声并抑制。在控制过程中会发现,抑制力度过小时,回声消除的不干净,但如果力度过大则会损伤语音,这也是实际应用中最具有挑战性的。
3、拥抱深度学习追求极致音质
如同上文所提到的,我们基于传统数字信号处理方式进行语音前处理,如消除回声,消除噪声。
传统的降噪基本基于先验的假设条件如假设是一个加性噪声,它和语音不相关,还得是平稳的。对于平稳噪声的处理没有太大问题,但对于某些场景如鼠标键盘敲击声,处理起来的效果会不太理想。如果用传统方法提取鼠标键盘声的特征进行抑制,难点在于也许能够在个别场景下通过观察频谱分布提取有效特征,但由于噪声类型变化太多,导致在其他场景下,特征提取不准,此外人工调参工作量也是十分巨大。
这就体现出深度学习的优势,它提供了非常强大的非线性拟合能力,即使是百万级的参数量,只要有足够好的数据,通过训练后即可达到较好效果。
一般我们会先选定模型,设置训练目标如计算一个mask,这个mask相当于传统算法中的gain值,最初比较简单的是理想二值掩膜,判断频点是语音或噪音,这往往会引入一些噪声。后来我们通过理想比值掩膜计算比值而不是简单的做一个二分类。
后续引入了很多相位信息,发现相位对音质有较大影响。最后我们选择了cIRM,它同时考虑了幅度和相位,达到更好的效果。当然在实际使用中还是需要结合具体场景进行选择。
训练网络需要有非常强大的泛化能力,否则在某些场景下的效果会不太理想,于是我们需要对样本进行增广,对于目前已有的训练数据集进行一些处理或根据需要应用的场景使用私有的训练数据。同时还需找到较合适的特征。如果通过映射方式直接输入时域波形,那么最后直接输出的就是已经完成降噪的时域波形,但这会提升训练难度。所以我们一般会适当提取一些特征,比如将其转换到一个频域或通过分带的方式切割为多个带。更多或更合适的特征提取能够有效降低模型的大小。
之所以这样做,是因为实际的应用场景基本都是实时的。可能大家看到许多挑战赛中的效果非常理想,但如果直接拿来部署就会发现根本无法运行,因为假如10ms一帧的数据,需要运算50ms才能出结果,这根本达不到实时性的要求,换句话说,在好的机器上能跑起来,但换到较差的机器就不行了。所以最终的抉择还应综合实际应用场景、机器性能,及部署在端侧还是服务器。部署在服务器上可以通过较好的gpu提升性能。移动端和pc、mac端的处理上也存在一些差异。嵌入式设备还应考虑存储量的问题,如果参数量过大会对其存储造成一定影响。
我们根据应用场景选择合适的模型后,还会不断的进行优化,或对数据做一些处理,再加上部署,这样才能够保证实时性。
举个例子,噪声里面的瞬态噪声对传统降噪来说很难处理,如图中传统降噪前后的对比,其中的平稳噪声基本能够被消除,但鼠标键盘这种噪声就无法完全消除了。而AI降噪方式能够较好地处理这种情况。
回声消除也类似,其实在回声消除中存在一个大问题,即消除回声算法遇到双讲情况时会对本地语音造成很大损伤,通过AI算法进行较好的训练后能够很好的解决这个问题。
大家可能觉得目前基于深度学习的方法已经可以替代传统方法了,但实际上却没那么简单。深度学习的方法固然好,能够解决许多传统方式解决起来比较困难的问题,但它也并不是全能的。应用基于深度学习的方法时,假如数据集覆盖很全面,效果也许会很不错,但当数据集和真实场景存在一定差异时,最终效果也会大打折扣。
另外一个重要问题是性能,由于我们的计算资源往往比较有限,而深度学习方法的性能开销却很大,对于实时性要求很高的场景来说,设备性能不够,深度学习的方法未必是最好的选择。目前大多还是深度学习加传统相结合的方式,相当于取精华去糟粕,用传统方式完成最基础功能,把复杂的部分交给深度学习,在保障性能的前提下尽可能提高使用效果。
最后,我们来总结下:
1、一场会议有许多组成部分,但声音往往是最为重要的。一方面不是所有人都喜欢开着视频,另一方面声音的卡顿会比视频的卡顿更令人抓狂,一帧声音数据的丢失就会被人明显的感知到。
2、影响声音的因素有很多,包括环境、硬件、软件等因素,都会带来不同的体验。
3、针对这些问题,可以利用语音前处理技术进行噪声抑制以及回声的消除。
4、深度学习和传统方法各有千秋,之间的优势可以互补。
希望通过今天的介绍,大家能对会议系统里音频处理相关的问题有一定的了解。
以上是本次分享的全部内容,谢谢!
(全文完)