Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174352
  • 博文数量: 340
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3405
  • 用 户 组: 普通用户
  • 注册时间: 2021-05-14 14:39
文章分类

全部博文(340)

文章存档

2023年(69)

2022年(144)

2021年(127)

我的朋友

分类: 云计算

2022-12-02 10:23:38

社交网络(IM聊天软件)一路走来,先是文字 + 表情,接着是图片 + 短视频,现在是实时音视频社交强势崛起并成为潮流的时代。实时音视频社交将是社交网络的发展趋势,毕竟音视频聊天才是人类{BANNED}最佳自然的社交方式。

在自然的社交环境中,回声是十分影响沟通体验的。

在业界,回声消除技术是公认难啃的硬骨头。它本质上是一个复杂的数学问题的工程化。音频工程师往往是数学或者物理专业而不是计算机专业出身的,没有过相关经验的工程师根本就无从下手。回声消除技术做得比较好的产品有腾讯QQ和Microsoft的Skype,开源的项目有WebRTC和Speex。在这些开源项目之前,回声消除技术是大厂的独门武艺,其它团队只能靠自己一点一滴地摸索积累。在这些开源项目之后,WebRTC和Speex提供开源的AEC模块,成为业界不错的教材。

AEC 的原理

回声消除的原理很多文章介绍过,这里只简单介绍笔者在工作中的实践。简单地来说,远端的声音信号首先通过扬声器播放出来,然后在房间中经过多个传播和反射路径,{BANNED}最佳后和近端的声音一起被麦克风采集进去。如果没有做回声消除处理,那么远端就会把重新采集进去的远端声音信号播放出来,而且和原始的远端声音有一定的延迟时间。这就是回声产生的原理。

要消除回声,其实真的很难。这有点像把红墨水倒进蓝墨水里,混合在一起,然后要求把红墨水从蓝墨水中分离出来。对于采集端来说,无论是近端的声音,还是扬声器播放出来的声音,都是从空气中无差别地采集到的声音。对机器来说,远端信号播放出来的声音和近端的声音是没有任何区别的,就像对水来说红墨水和蓝墨水没有区别一样。回声消除的工作就是要把没有任何区别的远端回声和近端声音分离。这项工作其实比想象中要难得多。

幸运的是,我们并非没有任何办法可以找到远端回声和近端声音的边界。

远端的声音信号和回声是相关的。也许有朋友会一拍脑袋焕然大悟地说:那就直接把远端声音从采集到的声音中减掉就可以了。然而事情并没有那么简单。

远端的声音信号并非等同于回声。远端的声音从扬声器播放出来,到被采集端采集,经历过扬声器 - 房间 - 麦克风(Loudspeaker-Room-Microphone,LRM)这样的回声馈路。在 LRM 回声馈路中传播的时候,远端声音一方面经过多次反射,另外一方面经过多次叠加,{BANNED}最佳后变得和远端声音信号有差别了。

如果能够对这个函数求解,那么就可以根据远端声音信号和远端回声之间的相关性进行建模。这个模型是对回声馈路 LRM 的模拟,会高度逼近回声馈路 LRM。

等到这个模型稳定时,输入远端声音信号 fs,就可以输出高度接近远端回声的信号 fe。通过滤波器生成反相的信号,和采集到的声音信号进行叠加,就可以把回声信号消除掉。这就是回声消除 AEC 的基本原理。

这个函数求出来的解不大可能和远端回声完全一致,只能高度逼近。该函数求出来的解和远端回声越逼近,回声消除的效果就越好。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

静音、单讲和双讲

虽然实时语音的通话是双工模式,但是可以分为不同的情形:静音、单讲和双讲。针对不同的情形要采取不同的回声消除策略。

1静音

即没有人说话的情形。

在语音段才需要做回声消除,在非语音段不会有回声,不需要做回声消除,甚至不需要发送语音信息,从而可以降低码率,节约带宽成本。

因此,准确探测语音活动十分重要。语音的探测算法叫 VAD(Voice Activity Detection)。不同的厂商有不同的 VAD 实现方法。我们是利用基音周期实现 VAD,有效地提高 VAD 判断的准确性,避免将非语音段误判为语音段。

2单讲

即只有远端说话的情形。

由于只有远端说话,从麦克风采集进来的语音信号只包含远端的回声,而不包含近端的语音。单讲情形下的回声消除相对比较容易处理,可以采取比较激进的处理策略。

如果确定单讲是高概率事件的情况下,可以直接地把所有语音信号都干掉,然后适当地填充舒适噪音。一般来说,在单讲情形下,用线性自适应滤波器跟踪回声馈路,可以很好地消除回声,大概能够抑制掉 18dB 的回声。

3双讲

有多方同时说话的情形。

由于有多方同时说话,从麦克风采集进来的语音信号就包含了远端的回声和近端的语音,两者混合在一起。双讲情形下的回声消除就十分困难:一方面要保护近端的语音信号不被损伤,另外一方面还要尽量地把回声消除干净。

这里不但有“红墨水蓝墨水分离”的难题,而且还有“投鼠忌器”的困境。一般来说,在远端回声比近端语音要高大概 6dB~8dB 的情况下,如果要把远端回声消除干净,那么肯定会或多或少地损伤到近端语音。

另外,如果远端回声比近端语音要高出 18dB 以上,比如说扬声器离麦克风太近,远端回声把近端语音完全掩盖掉了,那么回声消除的效果肯定是不好的。这种情形下,可以采取比较激进的策略,把远端回声和近端语音一起干掉,然后适当地填充舒适噪音。

因此,回声消除模块要有能力区分这三种情形,才能针对各种情形采取不同的算法。通过 VAD 可以区分非语音段和语音段。如何区分单讲和双讲的方法将在下面讨论。

AEC 的实现

回声消除主要包含两个步骤:线性自适应滤波和非线性处理。

线性自适应滤波就是对 fe=f(fs) 求解,建立远端回声的语音模型,进行{BANNED}中国第一轮回声消除。

非线性处理又分为两个步骤:残留回声处理和非线性剪切处理。残留回声处理进行第二轮回声消除,处理残留回声;非线性剪切处理就是对衰减量达到阈值的语音信号进行比较激进的剪切处理。

线性自适应滤波和非线性剪切处理在学术论文和开源项目中能找到东西学习。残留回声处理就很难,一般都是要靠团队自行摸索、积累和创新。正是因为如此,语音技术的门槛才如此的高。

线性自适应滤波

以远端声音信号和远端回声的相关性为基础,建立远端回声的语音模型,利用它对远端回声进行估计,目的是获得对远端回声尽量逼近的估计。我们可以把回声馈路 LRM 看作一个“环境滤波器”。

经过它的处理,远端声音信号被变成远端回声。回声消除就是要构建一个“算法滤波器”,基于对远端回声的语音模型,不断地调整该滤波器的系数,使得估计值更加逼近真实的回声。估计值越逼近真实回声,回声消除效果就越好。

自适应滤波器收敛后得到的就是需要求解的回声馈路函数 fe=f(fs)。当滤波器收敛稳定之后,输入远端声音信号 fs,就可以输出相对准确的对远端回声信号的估计值 fe。把采集到的信号减去远端回声信号的估计值 fe,就得到实际要发送的语音信号。

实现线性自适应滤波器有两个难点:

    快速收敛:
    在收敛阶段,采集到声音信号要求只有远端的回声信号,不能混有近端的语音信号。近端的语音信号和远端的参考语音信号没有相关性,会对自适应滤波器的收敛过程造成扰乱。

    因此,我们的策略是让自适应滤波器收敛的时间尽量地短,短到收敛过程的时间段里采集进来的信号只有远端的回声信号,这样自适应滤波器收敛的效果就会很好。在收敛好之后,滤波器就稳定下来了,就可以用来过滤远端的回声信号了。
    动态自适应:
    在收敛好稳定下来以后,自适应滤波器还要随时自动适应回声馈路的变化。自适应滤波器要能够判断回声馈路是否发生变化,并且能够重新学习和对其进行建模,不断地调整该滤波器的系数,进入一个新的收敛过程,{BANNED}最佳后快速地逼近新的回声馈路。

    这种情况在手游的场景中是十分常见的,用户拿着手机边走边玩游戏,游戏语音周遭的回声馈路时刻发生着变化,自适应滤波器就要时刻自动重新收敛来适应新的回声馈路。


这两个难点是一对矛盾的特征,要求自适应滤波器一方面要能够快速收敛后保持系数高度稳定,另外一方面要能够随时保持更新状态跟踪回声馈路的变化。

阅读(235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~