回声消除技术--整理编

1 引 言

      在语音通信中,有一个很影响通话质量的因素就是回声。回声就是指说话者通过通信设备发送给其他人的语音又重新又回到自己的听筒里的现象。回声会对说话者产生严重的干扰,必须想办法消除。一般,回声分为两种,即“电路回声”和“声学回声”。“电路回声”可以通过硬件设备的合理设计而消除,在此不作讨论。最复杂和最难消除的应该是所谓的“声学回声”。“声学回声”是指远端用户的声音从听筒出来以后,经过空气或其他的传播媒介传到近端用户的话筒,再通过话筒录音后又重新传到远端用户的听筒中形成的回声。当近端用户的放音音量比较大而录音设备和放音设备距离比较近时回声尤其明显。“声学回声”受近端用户环境的影响,可能产生多路回声,包括直接回声和反射回声,各个回声的路径不同,延迟也就不同,因而难以消除。

2 声学回声消除器

      对于声学回声消除,常见的消除算法有2类,即回声抑制(acoustic echo suppression)算法和声学回声消除(acoustic echo cancellation)算法。

      回声抑制算法是较早的一种回声控制算法。回声抑制是一acoustic echo suppression种非线性的回声消除。它通过简单的比较器将准备由扬声器播放的声音与当前话筒拾取的声音的电平进行比较,如果前者高于某个阈值,那么就允许传至扬声器,而且话筒被关闭,以阻止它拾取扬声器播放的声音而引起远端回声。如果话筒拾取的声音电平高于某个阈值,扬声器被禁止,以达到消除回声的目的。由于回声抑制是一种非线性的回声控制方法,会引起扬声器播放的不连续,影响回声消除的效果,随着高性能的回声消除器的出现,回声抑制已经很少有人使用了。

      声学回声消除算法(AEC)是对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号(s(n))的语音模型,利用它对回声进行估计(e`(n)),并不断地修改滤波器的系数,使得估计值更加逼近真实的回声(e(n))。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,如图2所示。

3 声学回声消除器设计

      一般,回声消除器的初始化需要两个参数:一次处理的数据量(帧长)和估计的录音中回声相对于录音开头的偏移量,即回声相对于录音的延迟的最大值(尾长)。回声消除接口的一般形式为:AecFunction(input frame, playback frame, out frame),对录音数据进行回声消除需要等量的播放数据输入作为建立回声模型的参考数据。要达到良好的回声消除效果,必须保证以下3点:

(1) 播放数据的产生速度要和录音数据的产生速度达到动态平衡,为此如果录放音数据的采样率不同,那么需要把他们统一成同一采样率下的数据以后再进行回声消除。如果是实时的语音处理,由于网络的不稳定性,数据包可能在网络上丢失或者由于过大的延迟而被其他的处理环节丢弃,那么来自远端的数据量可能会少于近端录音产生的数据量,对于这种情况我们必须补充播放数据,以保证放音数据的量和录音数据量达到平衡。

(2) 播放数据带有的声音信息先于录音数据中带有的对应的回声信息送给回声消除接口。这个先后顺序是回声消除的前提,回声消除器不可能消除自己没有“见过”的回声。

(3) 播放数据的声音对应的回声在录音数据中出现的位置相对于录音的开头的偏移量(即延迟)不能太大,因为所有的回声消除器支持的尾长都有一个范围,延迟超过了这个范围回声就无法消除了。

      为了满足第一条,我们需要对放音线程数据产生的速度进行控制,控制拿给声卡播放的数据量和从声卡获得的录音数据量总是保持一致。由于录音数据产生的速度总是均匀的,因此放音数据的产生也必须均匀,也就是说从服务器得到的放音数据没有及时达到时,我们需要“创造”放音数据给系统播放,同时将这些数据缓存到放音数据队列里。创造的方式有很多,比如填充静音数据或是通过Wsola算法来模拟连续语音数据。

4 回声延迟估计

      在第一次获得放音数据时,我们开始对录音数据进行回声消除。开始回声消除之后,从系统录音接口得到的录音数据里可能含有回声消除开始前录到的数据。而从开始回声消除那一刻起到放音帧真正从声卡放出来被录音设备捕获可能也需要等待一段时间(我们假设声音一放出来立即被录到录音数据里,忽略其在媒介中的传播时间,因为实际中最突出的回声是直接回声,即声音从播放设备出来,通过空气或手机本身直接传输到录音设备,而不是经过反射回到录音设备,一般直接回声从放音设备出来再回到录音设备的时间是很短的,一般不到1毫秒,可以忽略),这个时间跟声卡放音的缓冲区的长度和我们的放音帧长度有关。放音数据和录音数据的时序关系如图所示。

(以AEC开始后取得的第一个录音帧的起始录音时间为起点t0 )

粗虚线圈表示一个放音帧时长,实线圈表示录音缓冲区对应的时长,浅虚线圈表示录音帧时长。

      为了保证所有播放的声音一定会在录音数据中重现,应先启动录音线程,然后再启动放音线程。回声的延迟决定了回声消除器需要的“尾长”,“尾长”越小,同样长度的数据回声消除器的处理时间越短,回声消除算法的收敛也越快,即消除回声起效越快。为了使回声的延迟尽量小,我们需要从设备支持的采样率中选择最合适的录放音采样率。这个选择的过程是移动设备上回声消除处理的关键。

如上所述,延迟可分为两部分,一部分是由录音时产生的,另一部分是由放音产生的。

      先说放音,移动设备支持的放音采样率有多种,每种采样率下都有一个最小放音缓冲区长度,放音的缓冲区只能设置得比这个长度长。我们每次给放音API播放的数据会去填充缓冲区,只有当缓冲区被填满以后才会真正拿到声卡去播放。如果放音帧比放音缓冲区长,那么放音的延迟就只是声卡固有的放音延迟。如果放音帧比放音缓冲区短,那么就要等若干个放音帧来填充放音缓冲区,直到填满以后才送给声卡去播放。而声卡收到放音数据到放音数据开始播放,这之间可能还有一个间隔,这是由于声卡总是一段数据一段数据地播放,如果送到声卡的时候前一段数据还没播放完,那么声卡会等到前一段数据播放完了才开始播放送来的这段数据,这个“数据段”的长度一般对应的就是“最小放音缓冲区长度”。所有上述的时间内产生的录音数据也会被送到回声消除器里去处理,因此这段时间内造成的数据延迟为(用时长表示):

      放音延迟 = - 1 ・ 放音帧时长 + 声卡延迟 (1)

      其中[ ]表示向上取整,即取不小于该数的最小整数。“声卡延迟”即数据包送到声卡后到其播放出来之间的间隔。如果有多个采样率下的放音延迟都达到最小,那么我们选取最接近编解码采样率的那个采样率,因为越相近的采样率重采样时造成的失真越小。而放音缓冲区长度也就设置为(大于或等于最小放音缓冲区长度的)重采样为放音采样率后的放音帧长度的最小倍数。

      再说录音,录音稍微复杂一些。录音也和放音一样,在每种录音采样率下都有一个最小录音缓冲区长度,录音的缓冲区只能设置得比这个长度长。当录音数据填满第一个缓冲区以后,我们才能从录音API中获得第一个录音块,由于回声消除的原因,我们每次都要从录音数据里取得和放音帧“等长”(这里的“等长”是指播放时长相等)的录音帧来进行处理。在放音线程得到第一个放音帧、开始回声消除这个时刻之后,我们从录音API里得到的录音数据里可能有一部分是在回声消除开始之前就录到的,这个数据有多少跟录音帧长度以及录音缓冲区的长度都有关。如果录音缓冲区的长度不是录音帧长度的

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值