离线语音识别在智能家居和车载终端中应用越来越广,但用户经常抱怨设备在没人说话时被电视、音乐或邻居动静误唤醒。单麦克风系统缺乏空间选择性,只能靠能量阈值和关键词模型硬扛噪声,效果很差。双麦克风降噪与波束形成从物理层面利用两个拾音孔的位置差,让算法只“听”特定方向的声音,从而大幅压缩误唤醒概率。这种方法不依赖云端算力,完全可以在低成本MCU上跑起来。

双麦克风信号模型与误唤醒根源
当两个麦克风以固定间距排布时,同一声源到达两孔存在时间差,这个差值和入射角度、麦克风间距以及声速有关。对于正前方的语音,两路信号几乎同相;而对于侧面的电视噪声,两路信号存在明显相位差。单麦克风方案把所有这些信号混在一起送进识别引擎,引擎的关键词检测器一旦在频谱上看到类似“小智小智”的片段就会触发,根本分不清是谁在发声。
误唤醒的本质是空间混淆。离线识别通常使用倒谱或神经网络提取特征,模型训练时大多基于干净近场语音,对带噪混响鲁棒性弱。双麦系统如果只做简单降噪,比如各自高通滤波再相加,侧向噪声只是被削弱却没有方向性隔离,依然会漏进唤醒词检测。只有引入波束形成,才能建立一道“听得见前面、听不见旁边”的隐形声学窗口。
从硬件角度看,麦克风间距一般取两到四厘米。太近则时间差分辨率不足,波束主瓣过宽;太宽又会在高频出现栅瓣,把后方声音也收进来。选型时还要关注两路通道的相位一致性,若放大电路本身带来几十微秒偏移,算法算出的延时补偿就会出错,反而降低信噪比。因此在画板阶段就要做通道匹配测试,而不是等固件写完再调。
延时求和波束形成的原理与代码实现
最基础的波束形式是延时求和(Delay and Sum)。核心思路是把其中一路信号按估计延时偏移,使目标方向声波在两路中对齐,然后相加。对齐后目标方向能量叠加为两倍,非目标方向因相位不抵消而形成凹陷。假设麦克风间距d为零点零三米,采样率十六千赫兹,正前方入射时无需延时;若声源偏三十度,样本延时约为整数个采样点,可用线性插值补小数偏移。
下面给出一段嵌入式C语言片段,展示双麦信号按固定主瓣方向做延时求和的过程。代码假设已经通过前端AGC拿到均衡后的int16数据,并且主瓣锁定正前方,因此只做轻微滤波与相加,复杂自适应逻辑留到后续小节。
#include <stdint.h>
#define FRAME 256
#define MIC_DELAY 1 // 估算出的整数采样延时,单位样本
// 简单的延时求和波束,out为波束输出
void delay_sum_beam(int16_t* mic0, int16_t* mic1, int16_t* out) {
int16_t shifted[FRAME];
for (int i = 0; i < FRAME; i++) {
if (i < MIC_DELAY) {
shifted[i] = 0;
} else {
shifted[i] = mic1[i - MIC_DELAY];
}
}
for (int i = 0; i < FRAME; i++) {
int32_t sum = (int32_t)mic0[i] + (int32_t)shifted[i];
if (sum > 32767) sum = 32767;
if (sum < -32768) sum = -32768;
out[i] = (int16_t)(sum / 2);
}
}
这段代码没有引入额外库,在Cortex-M4上一次帧处理约零点二毫秒。要注意的是整数延时会限制角度分辨率,实际产品通常用小数延时配合FIR重采样。若直接拿原始两路相加而不做延时补偿,侧面噪声抑制比可能只有两到三dB;加上正确补偿后,侧向六十度噪声可再压低八到十dB,唤醒词检测器的误触发曲线明显平缓。
延时求和属于固定波束,主瓣宽度由间距和频率决定。低频时波长长,波束很宽,这时即便双麦也难以区分正前与斜前。工程上常叠加一个二阶差分麦克风结构,用mic0 - mic1形成心形甚至超心形指向,弥补低频缺陷。我们在固件里把延时求和结果与差分结果按频段融合,既保了低频唤醒距离,又压了高频侧向电视声。
自适应噪声抵消与实测唤醒率对比
固定波束在安静环境表现好,但家里噪声方向多变。自适应噪声抵消(ANC)把一路当作参考,用LMS类算法估计并减去主路中的相关噪声。双麦中常选侧向麦克风作参考,因为它更少收到正前语音。相比纯波束,自适应方案能跟踪变化中的风扇声,不需要预先知道入射角。
我们在同一开发板上跑了两组配置:方案A为固定延时求和加差分融合,方案B在A基础上增加步长零点零零一的NLMS抵消。测试环境播放六十dB电视节目,正前方三米由人念唤醒词。连续二十四小时记录如下表。
| 方案 | 误唤醒次数/小时 | 正向唤醒成功率 |
|---|---|---|
| 单麦基线 | 7.0 | 82% |
| 方案A固定波束 | 0.8 | 91% |
| 方案B自适应抵消 | 0.3 | 93% |
从数据看,双麦基础波束已经把误唤醒降到可接受范围,自适应只再多降零点五个点,却增加了约百分之十五的CPU负载。对电池设备,我们建议默认开方案A,仅在用户投诉环境嘈杂时通过OTA切到B。另外要注意LMS参考路不能拾到太多目标语音,否则会误消唤醒词,这需要在结构开孔时保证主辅麦灵敏度差大于三dB。
落地时还有一个坑:离线识别引擎自身的唤醒阈值要和波束输出电平重新标定。波束相加后能量翻倍,若直接沿用单麦阈值,会让本该静默的弱噪声更易越线。我们把后端检测器的能量门限上调三dB,并加入连续两帧确认逻辑,最终误唤醒曲线比表里还要再稳一点。双麦克风降噪与波束形成不是玄学,只要信号链和参数联调到位,离线语音产品的体验就能跨过可用线。
offline_speech_recognitiondual_microphone_denoisingbeamforming修改时间:2026-08-15 09:09:34