近零功耗语音唤醒方案:微安级多级唤醒架构设计与实践

发布时间:2026/8/27 10:29:48
近零功耗语音唤醒方案:微安级多级唤醒架构设计与实践 去年接了一个智能家居传感器的项目客户要求设备在纽扣电池供电下撑一年以上同时还要保留“语音唤醒”功能。听到这个需求我脑子里第一个反应就是常规方案绝对扛不住。只要让麦克风通路常开数字语音处理芯片一直跑着电流就是毫安量级CR2032根本活不过几周。那段时间我把TI、ADI、Syntiant、Knowles这些厂家的低功耗语音方案翻了个遍最后搭了一套“模拟VAD先监听数字DSP后确认”的多级唤醒架构把待机监听电流压到了微安级别整机平均功耗不到5μA才算真正接住了这个需求。这篇文章想把这套方案从头到尾拆开讲一遍包括为什么近零功耗语音唤醒必须做分级、模拟前端怎么设计、唤醒词检测怎么调度、实测怎么测、以及我踩过的那些坑。适合正在做电池供电语音设备、或者准备把语音控制塞进智能门锁/无线传感器/可穿戴设备里的工程师参考哪怕你之前没做过语音也能照着把整个链路搭起来。1. 项目背景与功耗困局1.1 传统语音唤醒方案为什么扛不住市面上一提到语音唤醒很多人第一反应就是“小爱同学”“天猫精灵”那种智能音箱方案一颗音频DSP或SoC常开麦克风阵列持续采集、回声消除、唤醒词网络在前端一直跑。这种方案体验确实好但代价是功耗动辄几十毫安到几百毫安。智能音箱插着电无所谓可一旦换成电池设备这就是灾难。我做过的几款产品里采用常开DSP方案的设备整体监听功耗普遍在20mA以上。如果客户要求待机一年单电池容量至少要 20mA × 24h × 365 ≈ 175Ah这已经远超消费级电池能提供的量级。哪怕把DSP换成功耗更低的专用助听器芯片比如常见的低功耗音频编解码器轻量NN加速常开状态下也极难低于2~3mA。对纽扣电池而言这依旧是几百倍以上的超支。这里有一个很关键的产品逻辑真正需要“听”的时间其实极少。绝大多数时候设备周围是安静的麦克风采集到的只是环境本底噪声。如果能让一小部分超低功耗模拟电路常开去判断“环境里有没有疑似语音”有动静了再把DSP拉起来做二次确认无动静就继续睡觉那平均功耗能降低两三个数量级。这就是近零功耗语音激活方案的核心思路。1.2 功耗预算怎么算才合理在做这个项目之前我专门建了一版功耗预算表用Excel拉了各状态电流和时间占比。当时客户给的硬指标是两节AA电池约2000mAh可用容量待机一年以上同时每天至少支持20次语音唤醒。按这个要求反推平均待机电流不能超过 2000mAh / 8760h ≈ 228μA看着好像不难但如果要预留峰值功耗、低温自放电、电源转换损耗实际平均电流必须控制在30μA以内才稳妥越低越好。于是我把方案目标定为整机平均监听电流小于10μA语音激活后系统状态切换在1ms内完成用户说“你好小X”后到MCU确认唤醒的时延不超过300ms。这组数字定下来后所有器件选型、电路结构、固件调度都有了明确导向——好的目标预算表能把方案讨论时间缩短一半。1.3 近零功耗的真正含义“Near-Zero-Power”这个词并不严谨物理上没有真正的零功耗它指的是把设备在“安静监听”状态下的功耗压低到接近电池自放电的水平。以CR2032为例它年自放电大约为标称容量的1%~3%也就是2~7mAh/年。如果一个语音唤醒方案能把监听功耗做到5μA年耗电量约为44mAh虽然还是比自放电高但已经处于“可以忽略”的量级起码不会成为电池寿命的短板。做这个项目时我给自己定的参考线是监听功耗不超过电池年自放电的5倍。超过这个值语音功能就会显著影响待机时长用户感知会非常明显。如果低于这个水平那就可以放心大胆地去优化唤醒成功率和误唤醒率而不用过度纠结功耗。2. 近零功耗语音激活的整体架构设计2.1 多级唤醒模拟VAD、数字VAD、唤醒词检测近零功耗语音激活的关键不是把某一个模块做到极致省电而是搭建一条“由低功耗向高功耗逐级递进”的唤醒链路。我的设计分为三级第一级模拟语音活动检测模拟VAD一个纯硬件电路里面只有微功耗比较器、运放、滤波器和少量电阻电容。它常开监听麦克风的模拟输出检测到声音能量超过阈值时输出一个脉冲信号。这一级听声音能量的“大小”不做任何语义判断。整体电流被我压到了2~4μA。第二级数字VAD当模拟VAD触发了MCU从Deep Sleep醒来打开内置ADC采集一小段音频用短时能量、过零率、持续时间等特征判断这段声音到底是语音还是碗碟碰撞、门铃声、电视噪声。这一级只在触发后工作持续时间一般30~150ms等效电流增加很小。第三级唤醒词检测数字VAD确认是语音后MCU继续采集1~2秒音频通过片上DSP或轻量级神经网络搜索预置的唤醒词比如“小X小X”。匹配成功才真正把主系统唤醒点亮屏幕、启动生态链路、开始识别命令词。这个结构带来的最大变化是功耗最高的模块始终不常开只在自己被需要时工作几十毫秒。从系统角度平均功耗 常开模拟电路电流 × 100% 数字VAD电流 × 触发占空比 唤醒词检测电流 × 触发占空比。只要后两级触发频率不高平均功耗就基本被第一级主导。2.2 关键器件选型与指标取舍微功耗比较器是这套电路的核心。我选型时对比了TI TLV3691、LPV7215和ADI MAX9646最终用了TLV3691它的静态电流约为300nA响应时间约20μs对语音包络检测足够。唯一要注意的是输入端偏移电压TLV3691的最大偏移约2mV对于3.3V供电下的阈值电压来说偏差很小基本不影响触发精度。微功耗运放方面选了LPV521噪声略高但在100Hz~3kHz频段内做包络检测完全够用。它的静态电流也只有微安级别。如果要求更高信噪比可以考虑OPA349功耗稍高但在20μA以内。麦克风是另一个容易忽视的功耗大头。很多模拟MEMS麦克风的偏置电流在50~100μA如果常开比比较器和运放加起来还高直接毁掉近零功耗的目标。我后来用了Knowles SPU0410LR5H-QB这类超低功耗模拟MEMS麦克风典型偏置电流可以做到20μA以下再配合脉冲式偏置平时每200ms只给麦克风供电20ms监听功耗又降了一截。当然脉冲式偏置会漏掉脉冲间隙内极短暂的声音事件但对绝大多数交互场景来说200ms的轮询周期不会明显影响唤醒成功率。MCU我参考了STM32U575、EFM32TG11和nRF52840这几颗芯片。最终选了STM32U575因为它在Fast Wakeup模式下从Stop模式唤醒到执行首条指令只需要约3μs而且片上有足够的DSP算力跑轻量级唤醒词模型。10μA以下的Stop模式电流对整体方案没有任何压力。2.3 电源域划分与Always-On域设计多级唤醒架构让系统里同时存在多个功耗等级不同的模块因此电源域划分必须提前做。我把它分成三个域Always-On域包括模拟VAD电路、MCU的低功耗定时器/GPIO唤醒逻辑、基准电压源、电池电压监测。这个域在任何状态下都供电但不给数字音频子系统和无线射频模块供电。Conditional域包括音频编解码器/麦克风偏置、NFC或无线透传芯片、主系统外设。只有模拟VAD检测到事件后由MCU控制负载开关为其供电。Full域包括应用处理器或主控SoC、显示屏、马达、传感器矩阵。只有唤醒词确认后才开启。这样的划分让“安静状态”下Flow到地里的电流路径被物理切断而不是仅仅依赖固件关外设。有个细节电源域切换时会产生掉电和上电的毛刺如果不做软启动限流对电源轨的冲击很大。我给Conditional域加了一颗带软启动的负载开关型号是TPS22918启动时间约1ms足够避开音频模拟电路的settling time。3. 实操过程与核心环节实现3.1 模拟VAD电路的原理与参数计算模拟VAD的原理并不复杂整体链路是麦克风信号 → 前置放大 → 带通滤波 → 包络检波 → 比较器输出。我按下面的参数搭了电路可以直接参考。前置放大增益我设在了约200倍46dB目标是最小能检测到约50dB SPL的说话声。按SPU0410LR5H-QB灵敏度约-38dBV/Pa计算50dB SPL对应的声压约为0.063Pa麦克风输出电压约0.063Pa × 0.0126V/Pa ≈ 0.8mV RMS经过200倍放大后约160mV RMS再经包络检波后峰值约230mV。比较器阈值我设在200mV这意味着环境噪声低于50dB SPL不会误触发说话人距离设备30~50cm时能稳定触发。带通滤波器我用了二阶高通一阶低通频段设置在200Hz到3kHz主要覆盖人声的基频和第一、第二共振峰范围。高通截止频率不能太高否则男声的基频会被滤掉我把转折点设在200Hz实测对轻声男声仍然友好。低通设为3kHz能剔除一些高频嘶嘶声和超声触发的问题。包络检波用的是微功耗二极管RC并联时间常数取10ms。太短会导致语音音节之间的空隙产生多个脉冲抖动太长则会让持续性的噪声也聚合成一个长脉冲难以判断语音起始位置。10ms是折中值基本能还原语音音节包络。比较器我加了正反馈电阻实现了大约30mV的迟滞。这个迟滞非常关键在阈值附近没有迟滞的话比较器会因噪声反复翻转导致MCU不断被唤醒、功耗瞬间上升。有了30mV迟滞之后实测触发后输出稳定不会出现“抖振唤醒”。3.2 MCU侧唤醒调度与固件状态机MCU侧状态机设计是整个固件最核心的部分。我用了四个状态IDLE、STABLE_VOICE、KEYWORD_DETECT、SYSTEM_RUN。IDLE状态下MCU处于Stop2模式只有模拟VAD的比较器输出引脚和RTC定时器在活动。比较器输出由EXTI线接入MCU高电平触发唤醒。唤醒后第一件事不是立刻采集音频而是给音频条件域供电等待约20ms让麦克风和运放稳定然后读取比较器输出是否仍然有效并启动ADC采集。STABLE_VOICE是数字VAD阶段。我采集了32ms音频做短时能量和过零率分析如果短时能量高于阈值同时过零率处于100Hz~3kHz人声范围就认为这是一个稳定语音事件。如果只是脉冲噪声过零率往往非常高短时能量又会有极尖锐的峰值很容易被剔除。这个阶段执行时间约为40ms在3.3V、48MHz主频下瞬时电流约8mA但由于时间短折合平均功耗只有几微安。STABLE_VOICE通过后进入KEYWORD_DETECT。这一阶段MCU采集约1.2秒的音频先做MFCC特征提取再用CMSIS-NN跑一个12KB的卷积模型识别“小X小X”的概率是否超过0.8。为了防止系统被长语音或环境音卡在识别阶段太久我加了600ms超时保护如果识别分数始终低于阈值就回到IDLE。整个识别阶段运行时间约1.5秒电流约12mA计算下来每次完整识别约消耗5μAh的电量完全可以接受。3.3 功耗测试方法与实测数据功耗测试是项目里最容易糊弄也最需要较真的环节。我先用高侧电流采样电阻示波器记录瞬时电流波形再用IOTA的精确电流表跑整晚的积分测试两个结果交叉验证。注意用万用表电流档测平均功耗时如果被测设备有突发大电流精度会失真必须用带锁存功能的电流积分工具。实测的数据如下纯模拟VAD监听电流2.8μA不含MCU深度睡眠电流MCU深度睡眠电流1.2μA合起来3.9μA。每次模拟VAD触发后MCU唤醒执行数字VAD平均占空比0.1%等效额外功耗约0.9μA。每次唤醒词识别后加主系统运行假设一天5次、每次2秒、平均电流20mA等效额外功耗约2.3μA。最终整机长期平均电流约7.1μA。换算到两节AA电池2000mAh可用容量理论待机约28万小时当然实际还要扣除电池自放电和低温损耗但两年以上待机没有悬念。这个数据在客户验收时被反复质疑过几轮因为通常语音设备都在毫安级别。后来我们直接输出了一整晚的积分电流曲线在凌晨安静时段整机电流长期维持在4μA附近他们才松口。实测证明只要分级唤醒设计到位微安级监听电流并不是纸上谈兵。3.4 电池、电源转换和低电压阈值补偿电池供电系统有一个容易被忽略的细节随着电量下降电池电压会从4.2V跌到3.0V甚至更低。而比较器的阈值是分压电阻从VDD得来的VDD本身也是3.0~4.2V变化这会导致触发灵敏度跟着漂移。阈值越高低电压下越容易漏触发。我做了两个补偿措施一是给比较器阈值供了一个微功耗基准源用TLV70018静态电流约600nA输出精确的1.0V基准再在基准上用电阻分压产生200mV阈值。这样无论电池电压怎么掉触发点基本不变。二是固件定期读取电池电压当电压低于3.2V时主动把数字VAD的能量阈值下调3dB让安静环境下的微弱人声也能被捕获。实测在电池接近放电末期时唤醒成功率仍然稳定在95%以上。4. 常见问题与排查技巧实录4.1 误唤醒和漏唤醒的平衡误唤醒是语音设备最惹人烦的问题我家那台测试样机有一阵子经常被电视里的笑声触发刚开始还以为是硬件问题。排查后发现模拟VAD阈值200mV的理论触发点是50dB SPL但电视节目中的笑声和掌声往往能达到70dB SPL以上直接击穿阈值。而数字VAD过零率判断对音乐声也容易混淆因为音乐中语音频段的能量可能比人声还大。最后我做了三层妥协第一层模拟VAD从单脉冲触发改为连续两次脉冲确认每次脉冲间隔约30ms这样单次突发噪声很难同时创造两个有效语音脉冲第二层数字VAD用25ms短时能量加50ms长时能量的比值作为判决条件相比单纯短时能量能更有效地过滤持续性的背景音乐第三层唤醒词模型训练时专门混入电视音、门铃声、餐具碰撞声作为负样本把误唤醒从每天十几次降到每天不到两次。漏唤醒方面我保留了“双阈值机制”正常阈值保证日常对话能唤醒低阈值用于安静环境下的轻声唤醒低阈值触发后固件会记录一次“近误触发”事件不会直接唤醒主系统但会给数字VAD提供更多时间来判断。4.2 麦克风偏置漏电和PCB布局的坑有一版PCB打样后我测待机电流怎么都压不到5μA以下总在8μA左右徘徊。排查了很久发现是麦克风偏置电路的问题我给模拟MEMS麦克风加了一个常开的LDO供电可LDO自身静态电流就有3μA加上麦克风偏置电阻漏电整体电流就抬上去了。解决方法是把麦克风供电改成由MCU GPIO控制的负载开关平时关闭只有模拟VAD触发后才开启。不过这样改动后模拟VAD电路自身就没有麦克风信号输出了所以麦克风偏置实际上由“常开的低成本电阻二极管”和“可关断LDO”双路组成正常时用低漏电路径事件触发后再确认一次。PCB布局上麦克风尽量放在板边、远离开关电源电感。我第一版把麦克风放在了DCDC电感正下方结果只要DCDC一工作麦克风拾取到的开关噪声比人声还大。改到板边并增加地隔离后底噪降了约15dB。另外电容触摸按键和音频走线也不能平行布太长否则每次触摸屏扫描都会给模拟VAD一个伪触发信号。4.3 低温环境和电池内阻的影响电池在低温下内阻会显著增大瞬间大电流时电压会跌落导致模拟VAD比较器误判。我遇到一次在-10°C环境下设备每隔几分钟就误唤醒一次。分析后发现低温时电池电压被拉低到接近比较器参考电压的临界点系统一启动DCDC峰值电流又让电压掉得更狠模拟VAD的阈值跟着漂反复触发。针对这个我把模拟VAD的参考电压源改成独立于主电源的微功耗基准同时给MCU的电压监测模块增加“低电压抑制”标志当电池电压低于3.0V时MCU会拒绝因模拟VAD中断而进入唤醒流程直到电池电压恢复到安全范围。这个处理虽然牺牲了一点低温下的唤醒体验但至少不会让系统陷入误触发死循环。5. 一些补充心得和后续扩展方向项目做完之后我最大的体会是近零功耗语音激活的价值不只是延长电池续航它带来的是产品定义上的自由度。以前因为功耗限制不敢做的“常开语音入口”现在可以在门锁、传感器、遥控器、医疗贴片上尝试了。这个方案的瓶颈也从“电路能不能做出来”转移到了“如何在微安级功耗下保留足够好的唤醒体验”。如果后续要继续扩展我最关注两个方向一是把关键词识别的模型做得更小更准直接在Cortex-M4级别的MCU上跑更丰富的词表争取把唤醒词命令词一体化二是尝试事件驱动型传感器融合比如把模拟VAD和PIR热释电传感器联动声音和人体活动都满足条件才触发唤醒这样误唤醒率和功耗都能进一步下降。语音人机交互在电池设备上普及只是时间问题先把功耗这座山翻过去后面的路就好走多了。