GitHub

16 kHz · acoustic echo cancellation

ali_jaec

给定麦克风信号与远端参考信号,估计并消除扬声器回声,输出近端语音。0.058 M 参数,10 ms 帧,两个网络分阶段训练。模型导出为 ONNX,可以在浏览器里直接跑——没有后端,第 02 节的结果就是本页用 ONNX Runtime Web 现算出来的。

01 示例音频

来自官方示例的 10 秒录音对。麦克风里同时有近端人声和远端回声;算法输出应当保留近端人声、去掉远端回声。下面四条依次是麦克风、远端参考、本模型输出,以及已发布参考实现在同一段音频上的输出 —— 最后一条是拿来对比的基线。

近端 mic 麦克风拾取 · 近端人声 + 回声
远端 ref 扬声器播放 · 回声的来源
算法后 本模型输出 · 与 mic 时间对齐
JAEC 参考实现 已发布模型在同一段音频上的输出 · 已对齐到 mic
−85 dB +25 dB 四条共用同一色标
同一段 10 秒音频的时频图:512 点 FFT、10 ms 一帧(和模型自己用的分析参数一致),纵轴 0–8 kHz 线性,四条共用一条时间轴,与上面的播放器对齐。颜色是能量,色标固定(−85 → +25 dB)且四条共用,所以深浅可以直接横向比。远端 ref 里那些空白竖条是远端静音,而同一时刻 mic 里仍然有东西 —— 那就是近端人声。两条输出的差别,就在「留住了多少近端、漏掉了多少回声」。播放任意一条,白线跟着走。

先听近端 mic,再听算法后;想听基线就放JAEC 参考实现。

02 浏览器内推理

点击下面的按钮,页面会下载 ONNX 模型并用 ONNX Runtime Web(WebAssembly,单线程)重新计算上面这段音频。结果会覆盖算法后播放器,并与预生成的版本逐样本对比。

模型尚未加载

03 试试你自己的音频

选两个 16 kHz 单声道 WAV:近端麦克风与远端参考。文件不会上传到任何地方,全部在本地浏览器里处理。其他采样率会做线性重采样。

04 指标

500 个留出测试文件(每个 10 秒)。SI-SDR 对照干净近端语音计算:它是唯一能同时惩罚「残留回声」和「削掉近端」两种失败的单一数字。

指标本模型已发布参考实现验收门槛
SI-SDR 均值7.537 dB5.963 dB≥ 6.00
SI-SDR 中位数7.565 dB—≥ 6.00
ERLE 均值7.852 dB6.689 dB≥ 6.00
远端静音段保持度+2.187 dB−0.525 dB≥ −3.00

「远端静音段保持度」是远端不说话时输出与麦克风的能量比:0 dB 表示原样通过,负值表示近端被削。设这一项是为了防止「把所有东西都衰减掉」也能拿高分。

真实声学路径本模型已发布参考实现
官方示例对 · ERLE8.02 dB10.33 dB
同一对 · 近端保持(参考安静的频点)−3.7 dB−7.4 dB

取舍与局限:本模型在官方示例对上比参考实现少消约 2.3 dB 回声,换来近端损伤减半(上表第二行)——门控把参考安静的频点原样透传,是结构性质而非训练出来的。训练数据额外覆盖四种工况(远端静音、远端活跃但无回声、弱回声、强回声),前三种 SI-SDR 31.7 / 34.4 / 27.3 dB;强回声(高出近端 12~22 dB)只做 9.7 dB 抑制——无减法级的掩码方案的天花板。详见仓库 README。

05 怎么做的

信号流。远端参考 x(n) 沿顶部依次经过四级:GCC-PHAT 延迟估计(输出标量延迟 tau)、
            参考 x(n) 与麦克风 d(n) 先经过一个共享的逐频点白化权重,再做 16 频带特征;GRU 在这些带上预测 257 点掩码,直接乘到麦克风频谱上。同时 GCC-PHAT 对麦克风与参考做互相关,先捕获整体时延,逐帧跟踪器随后跟随,把参考对齐到回声位置。输出 e(n) = mask · d(n),经逐频点合成权重整形后重叠相加回波形。

两个网络分阶段训练:先只训延迟估计器(用合成路径的精确时延标签),冻结后再训掩码网络。共享输出梯度会让两个目标把时延往相反方向拉。