当前位置:首页 > 中国芯 > 端侧AI
[导读]导读: 玩具一边放儿歌一边等你喊它的名字,这件事在算法上叫回声消除。多数讨论盯着混响时间,按房间 0.4 秒去配滤波器长度,动辄上万阶。玩具的声学环境不是房间,喇叭和麦克风只隔 8 厘米,混响短得多,但耦合强了 27 分贝。真正卡住端侧算力的不是尾长,是这 27 个分贝,以及喇叭失真给线性滤波器画的那条天花板。

玩具一边放儿歌一边等你喊它的名字,这件事在算法上叫回声消除。多数讨论盯着混响时间,按房间 0.4 秒去配滤波器长度,动辄上万阶。玩具的声学环境不是房间,喇叭和麦克风只隔 8 厘米,混响短得多,但耦合强了 27 分贝。真正卡住端侧算力的不是尾长,是这 27 个分贝,以及喇叭失真给线性滤波器画的那条天花板。

喇叭和麦克风只隔 8 厘米

一台桌面玩具的扬声器和麦克风都在同一副塑料壳里,两者的间距由结构决定,通常 6 到 10 厘米。

这个距离决定的第一件事是直达声的延迟。声速 343 米每秒,8 厘米对应 0.23 毫秒。对 16 千赫兹采样的系统来说,这是 3.7 个样本。参考信号和麦克风信号之间的这个延迟必须先对齐,对齐误差超过一个样本,自适应滤波器的收敛就会明显变慢。

距离还决定了两件事的量级。扬声器标称灵敏度通常按 1 米 1 瓦测得,取 70 分贝声压级。声压随距离按平方反比衰减,8 厘米处的声压级是 70 加上 20 乘 log(1 除以 0.08),也就是 91.9 分贝。同一间屋子里,用户坐在 30 厘米外说话,正常音量 65 分贝。

图 1 近场声耦合路径与三个声压级(依据原文第 3 节场景与正文参数绘制)

27 个分贝的落差

91.9 减 65,差 26.9 分贝。这是回声和语音在麦克风处的幅度差。

这个数字的含义要放到识别门限上看。唤醒词检测要求回声残余至少比语音低 10 分贝,否则模型会把儿歌里的音节当成唤醒词。加上 26.9 分贝的先天差距,回声消除要提供的抑制量是 36.9 分贝,工程上按 40 分贝留余量。

40 分贝的抑制量,对房间回声消除是个常规指标。但房间回声消除里,回声和语音的幅度差通常在 10 到 15 分贝,因为人和扬声器离麦克风的距离差不多。近场结构把这个差距拉到了 27 分贝,好处是初始信干比高,坏处是扬声器信号在麦克风的前置放大器里占掉了大部分动态范围。16 位采样、90 分贝动态范围,留给语音的只剩 63 分贝,底噪一上来,弱语音先被量化噪声吃掉。

滤波器长度只算尾长

自适应滤波器的阶数由要建模的 impulse response 长度决定,长度等于尾长乘采样率。

房间的混响时间取 0.4 秒,按 16 千赫兹采样,需要 6400 阶才能覆盖。玩具的塑料腔体不是房间,体积小、内壁吸声处理,混响时间在 0.12 秒量级。取 100 毫秒作为尾长,1600 阶就够。

这比按房间算的少四分之三。所以“回声消除很吃算力”这个印象,在玩具这个具体形态上要先打个折。尾长不是这里的瓶颈。

一帧 8 毫秒的代价

1600 阶的归一化最小均方算法,每个样本要做 2 乘 1600 次乘加,3200 次。16 千赫兹采样意味着每秒 16000 个样本,算力需求是 51.2 兆次乘加每秒。

拿一颗 240 兆赫兹、带单精度浮点单元的 Cortex-M4 来对。理论上单周期一次乘加,240 兆次每秒,51.2 兆占 21.3%。这个数字看着还行,但它是这一颗芯片上要跑的众多任务之一。

唤醒词检测是常驻的,每 30 毫秒一帧,一个百万次乘加量级的小卷积网络,折算 33.3 兆次每秒,占 13.9%。音频编解码、蓝牙协议栈、电源管理再占一部分。三者加起来,51.2 加 33.3 等于 84.5 兆次每秒,已经到 240 兆的 35.2%,加上其余任务,实际占用会顶到 60% 以上。留给峰值负载的余量很薄。

分块频域实现是这里的常规解法。把时域卷积搬到频域,块长取 128 个样本,对应 8 毫秒的算法延迟,1600 阶被切成 13 个频域分区。每样本的实数乘加从 3200 降到 400 量级,算力落到 6.4 兆次每秒,是原来的八分之一。代价是 8 毫秒的延迟和一块额外的缓冲区,对唤醒这种允许 50 毫秒响应的场景可以接受。

图 2 抑制需求的构成与线性部分的边界(依据原文第 3 节两级结构绘制)

双讲时滤波器会跑飞

上面算的算力是按单讲条件配的。用户开口说话的那一刻,条件变了。

自适应滤波器靠误差信号调整系数,误差信号是麦克风信号减去滤波器估计的回声。用户说话时,麦克风里同时有回声和语音,滤波器分不清哪部分是自己的估计误差,会把语音也当成回声去抵消,系数朝错误方向跑。这就是双讲发散。

处理办法是双讲检测。检测到近端有语音,就冻结自适应,只做减法不做更新。检测窗口取 256 个样本,16 毫秒。这 16 毫秒里滤波器已经跑偏了一点,冻结只是止损。

更麻烦的是检测本身的误判。开门声、电视声、宠物叫,都会被判成双讲,滤波器频繁冻结,收敛停在半路。玩具的使用场景里这类干扰比办公室多得多。

线性部分的天花板

回声路径里有一段是线性的:扬声器到麦克风的空气传播、壳体的结构传导、麦克风的前置放大。这部分能被线性滤波器建模。

另一段不是。扬声器在大音量下的失真、壳体的振动非线性、功放削顶,都会产生原信号里没有的频率成分。线性滤波器只能对输入信号做线性变换,它没有这些成分,也就消不掉由它们产生的回声。

消费级扬声器在 85 分贝以上输出时,总谐波失真在 1% 上下。1% 的失真对应负 40 分贝,正好和需要的 40 分贝抑制量同一个量级。这意味着即便线性部分做到极限,非线性失真产生的回声残余也会停在负 40 分贝附近,与语音的 10 分贝余量要求贴得很紧。

实测里线性自适应滤波在近场强耦合下的抑制量通常在 20 到 25 分贝。取 22 分贝,距 40 分贝的需求还差 18 分贝。

剩下 18 分贝交给谁

这 18 分贝由非线性模型补。工程上的做法是在线性滤波之后接一级残差抑制,输入是参考信号、麦克风信号和线性滤波的输出,输出是估计的残余回声谱,在频域上减掉。

这一级是小网络,可以是几层卷积加门控循环单元,参数量在几十万到两百万之间。放在端侧跑,每帧 10 毫秒,算力需求取决于帧长和通道数,通常比线性部分低一个量级,但它要占内存,还要占一块独立的 SRAM 来放中间特征。

这就是端侧回声消除的真实分工:线性部分吃掉大部分算力,解决的是可控的那 22 分贝;非线性部分算力小,解决的却是最难的那 18 分贝,而且它是神经网络,要用定点量化才能在 MCU 上跑,量化误差会直接变成残余回声。

一句话

玩具听不见你叫它,不是因为混响太长,是因为它自己的声音比你大 27 个分贝,而它消不掉的那部分失真恰好和你的语音一样响。

内容来源:Electronics(MDPI 开放获取),2023 年第 12 卷第 15 期,文章号 3258

原文标题:A Multi-Stage Acoustic Echo Cancellation Model Based on Adaptive Filters and Deep Neural Networks

作者:Shiyun Xu, Changjun He, Bosong Yan, Mingjiang Wang

DOI:10.3390/electronics12153258

链接:https://doi.org/10.3390/electronics12153258

配图说明:图 1、图 2 均为自行绘制,为原理示意,非原文原图复制

改动声明:本文为对开放获取文献的技术编译与解读,标题、行文与配图为原创

来源:21ic电子网

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭