压电MEMS麦克风VM1010:如何实现微安级待机声学唤醒

📅 2026/8/27 10:23:51
压电MEMS麦克风VM1010:如何实现微安级待机声学唤醒
如果你也做过电池供电的语音产品肯定对“永远在线”这四个字又爱又恨。我最早接触 Vesper VM1010 MEMS 麦克风是在做一款需要长期待机的声控传感器节点时。当时的困境很简单既要让设备几个月不充电又希望它能随时响应人声。传统 MEMS 麦克风方案整机待机电流跑到几百微安怎么省都压不下去。VM1010 给出的做法完全不同——它把“声学唤醒”做进了麦克风本身待机时整颗芯片几乎不耗电听到超过阈值的声音才切换到全功率音频输出。这篇文章就聊聊它到底怎么实现以及我在硬件和软件上踩过的坑。1. 为什么要盯上VM1010始终开启语音设备的功耗困局1.1 “永远在线”的真正含义先纠正一个容易误会的点很多产品说的“支持语音唤醒”并不是指麦克风永远把声音转化成数字流送给处理器。真正的 always-on 语音交互要的是“平时不干活耳朵却一直竖着”。这句话说起来简单做起来非常困难。早期我们做智能开关、语音门铃、宠物喂食器这类产品最怕的就是用户问“待机能用多久”。一般会用一颗低功耗 MCU 加一颗模拟 MEMS 麦克风MCU 跑一个简单的 VAD 算法定时从 ADC 里抓几毫秒音频做能量检测。MCU 本身待机能做到几十微安但麦克风和前端放大电路不吃这一套——它们只要上电就在工作放大、偏置、ADC 采样全程开着整机待机电流轻松突破 300 微安。300 微安是什么概念如果拿 CR2032 纽扣电池供电标称容量大概 220mAh还要考虑电池自放电和电压跌落实际上能维持的时间可能只有两三个月。用户买一个智能开关装好电池两个月后就没电了这在产品经理那里是完全不可接受的。1.2 传统MEMS麦克风方案在待机场景里的死穴传统电容式 MEMS 麦克风的工作方式决定了它天然不适合长时间待机。它内部有一个振膜和一块固定背板两者形成一个微型电容。声音让振膜振动电容值变化再通过 ASIC 把电容变化转成电压信号。问题在于这个微型电容需要稳定的偏置电压ASIC 里必须有个电荷泵从电源电压往上泵出十几伏甚至更高的偏置电压给背板充电。电荷泵一旦启动就一直有静态功耗。模拟麦克风普遍在 100 微安到 300 微安数字麦克风因为有 PDM 输出和更复杂的数据接口功耗经常更高600 微安到 1 毫安都不奇怪。放在连续录音的场景里这点功耗完全没问题放在待机为主的场景里它就是整机续航的吸血鬼。还有一种方案是给麦克风做“脉冲供电”——平时断电每隔几百毫秒上电听一下。但这里有个矛盾每次上电后麦克风和 ADC 需要稳定时间如果检测周期太短省不下来多少电如果检测周期太长又可能漏掉很短的命令词。再加上麦克风上电瞬间的 pop 声、电荷泵重新建立偏置的延迟这套方案做出来的体验相当糟糕。所以在看到 VM1010 之前我们一直是在“识别率”和“功耗”之间做痛苦的取舍。直到把压电 MEMS 麦克风的方案拿回来测才发现这条路原来可以换一种走法。2. 从电容到压电VM1010换了一条路2.1 压电MEMS拾音的基本原理传统的电容式 MEMS 麦克风核心是一个可变电容。压电 MEMS 麦克风则完全换了一套物理机制振膜上集成了一层压电材料最常见的是氮化铝AlN。声压推动振膜时压电材料被拉伸或压缩内部产生极化电荷正负电荷之间形成电压差。这个电压差直接反映声音波形不需要背板也不需要电荷泵。VM1010 就是这条路线的代表产品。Vesper 这家公司早年专门做压电 MEMS 麦克风VM1010 是他们面向始终在线应用的主力型号。因为它内部没有电荷泵没有持续的高压偏置所以静态功耗被压到了一个非常夸张的低水平。用大白话说电容式麦克风像一块需要一直插着电的电容屏压电式麦克风则像一块石英打火石你敲它一下它才生一次电。平时什么都不给它它也能等着你敲。2.2 与电容式MEMS的对比各自的账要算清楚我见过很多工程师一听“压电”就觉得是猎奇技术觉得性能肯定打不过电容。其实这是一笔综合账不是单看某一项参数。下面这个表是我在实际项目里的评估视角对比项电容式MEMS压电式MEMS以VM1010为代表偏置供电需要电荷泵持续耗电不需要待机功耗可低至10µA级待机监听能力必须整颗芯片持续工作可内置声学唤醒平时只听不输出防尘防潮振膜和背板缝隙容易受污染结构更针对颗粒物/液体有冗余信号输出低阻抗容易接后级高阻抗前端需注意寄生电容和走线长度音频性能成熟方案很多SNR可以做很高中等水平适合语音交互不适合高保真录音量产成熟度非常成熟成熟但生态相对小需要多备选型电容式麦克风最大的优势是长期被手机、耳机市场打磨过信噪比可以做得很高供应链选择非常多。但它在“超低待机功耗”这个维度上确实很难和压电方案比。VM1010 的 SNR 在语音交互场景里够用但你别指望拿它录无损音乐它的定位一直是唤醒和语音命令不是高保真采集。那为什么大家不早用压电麦克风其实细究起来压电方案的输出阻抗高后级放大器要花心思设计另外压电材料的工艺和 CMOS 集成之间有很多细节问题早期良率和一致性都不好控制。Vesper 真正把这条路走通靠的是把“声学唤醒”这个功能直接集成进麦克风封装里而不只是做一颗替换电容麦克风的模拟器件。3. LISTEN与WAKE模式VM1010的低功耗工作逻辑3.1 一颗麦克风如何把自己拆成两个状态VM1010 最核心的设计是内部定义了两种工作模式LISTEN 模式和 WAKE 模式。我把这两种模式理解成“哨兵站岗”和“全员出动”。在 LISTEN 模式下麦克风内部的音频主链路几乎处于关闭状态只有声学事件检测器在监听。这个检测器只判断一件事——“周围的声音有没有超过预设阈值”。一旦超过就触发内部唤醒逻辑把音频输出链路拉起来。这个时候麦克风进入 WAKE 模式模拟输出 VOUT 才开始输出完整的音频信号同时唤醒中断信号也会通知外部主控。从功耗数据看LISTEN 模式大概在 10µA 量级WAKE 模式会升到 180µA 左右。这个功耗差异正好对应了“始终在线”场景中最关键的需求在没有语音命令的时候不做无谓的工作。3.2 唤醒判定是“声学事件检测”不是“唤醒词识别”这里必须强调一个容易搞混的点VM1010 不是帮你做唤醒词识别的。它不会分辨“你好小V”和“你好小X”更不会判断这句话后面是不是带着命令。它只做物理层的能量检测类似一个声学开关——声音超过阈值就把信号送出去至于这个声音是不是“有用”那是后面 MCU 或 DSP 的事情。这个逻辑非常合理。唤醒词识别需要跑神经网络模型这是一个计算密集型任务功耗和成本都不低。让一颗麦克风内部电路去做这件事既做不好也没有必要。VM1010 的定位是做一个“廉价、可靠的声学敲门铃”把门敲开之后真正的语音对话再交给主控上的识别模块。所以如果你想做一个纯靠麦克风完成声学事件检测然后唤醒系统的设备VM1010 比较合适如果你想在手机上做“OK Google”那种系统级唤醒还是得靠应用处理器配合专门的语音 DSP。VM1010 解决的是“唤醒前置”和“系统级省电”的问题不是“识别本身”。3.3 音频性能指标怎么看关于 VM1010 的音频指标我按 Datasheet 里的典型值梳理一下。不同批次、不同配置会有差异做产品前一定以厂家最新版本为准参数典型值说明工作电压 VDD1.6V–3.6V常见配置可直接吃锂电池电压LISTEN 模式电流约10µA级只看声音事件不输出完整音频WAKE 模式电流约180µA级模拟输出带载运行灵敏度约-38dBV/Pa和主流模拟MEMS麦克风接近信噪比 SNR约59dBA语音唤醒足够追求录音质量偏弱输出类型模拟输出需要外接ADC或Codec这些数值放到实际系统里最大的红利是电池寿命的变化。我做过一个测试板把 MCU 睡眠电流压到 5µA整机待机电流能做到 20µA 以内其中大头就是 VM1010 的 LISTEN 模式。原来只能用两三个月的设备一下变成了可以用一两年甚至更久。4. 硬件设计上要留心的几件事4.1 电源和去耦别让模拟输出砸了招牌VM1010 虽然待机功耗很低但它毕竟有一颗模拟输出电源设计不能太随意。我在第一版测试板上犯过一个典型的错误直接把 MCU 的 3.3V LDO 输出引给麦克风数字电路一翻转模拟输出上就出现周期性噪声。后来做了三处改动第一麦克风的 VDD 引脚单独接一个 RC 滤波串联 10Ω 电阻并联两个电容一个 100nF 高频去耦一个 10µF 大电容兜底第二模拟地 AGND 和数字地 DGND 在 PCB 上单点连接不要让麦克风的地回路经过 MCU 的 GPI 翻转区域第三如果系统里有 DC-DC一定要让麦克风供电避开 DC-DC 的直接输出加一级 LDO 或者至少是 π 型滤波。这些不是玄学。MEMS 麦克风的灵敏度很高VOUT 输出阻抗也不低电源上的噪声很容易通过内部电路耦合出来。你最后在示波器上看到的就是音频底噪一截一截地跳然后你还以为麦克风是坏的。4.2 PCB布局和声学开孔机械细节决定触发率MEMS 麦克风是声学器件不是普通芯片布局的时候要考虑声音怎么进来。VM1010 的底部进声或者顶部进声取决于具体封装设计时一定要对着封装图看清楚进声孔的位置。如果进声孔被走线层盖住或者被外壳挡住那不管固件怎么调阈值都没用。还有一个很容易忽略的点导音管的密封。麦克风进声孔和外壳开孔之间不能漏气。漏气会导致低频响应变差还可能让设备内部噪声耦合进去。有人觉得压电麦克风不怕灰尘和水就不做密封这是错误的理解。VM1010 对颗粒物和湿度确实比电容式更从容但导音通道该密封还是要密封否则外部风噪、内部振动都会变成误触发源。在布局上麦克风尽量靠近外壳开孔走线尽量短。如果是模拟输出VOUT 走线尤其要短因为高压阻信号对寄生电容敏感。我量过一根 2 厘米的细走线就可能让高频响应明显衰减放在语音频段内影响不大但放在 5kHz 以上的噪声上就很影响后端 VAD 判断。4.3 和主控MCU的时序配合VM1010 的唤醒中断输出接 MCU 的中断脚这个谁都知道。但时序上有一个细节模拟输出 VOUT 不是瞬间进来的。唤醒检测触发了内部逻辑之后VOUT 要经过一个短暂稳定时间才能给出干净的音频信号。如果 MCU 收到中断后立即开始采样往往会采到一串不稳定的起始瞬态。我的做法是在中断服务程序里先关中断然后启动一个定时器延时 50ms 到 80ms 再打开 ADC 或 Codec。具体延时多少要对着示波器看 VOUT 的稳定过程。稳定时间到之后再开始采集语音并且预留 1 到 2 秒的缓冲窗口容纳用户说出完整命令词。另外注意不要让 MCU 在收到唤醒之后立刻把整个系统所有外设都点亮。最理想的做法是先只启动音频采集链路等 VAD 确认确实有语音在说话再点亮无线、屏幕、电机这些东西。这样能把“误唤醒”的代价降到最低。5. 软件侧把声学唤醒调好是门手艺5.1 阈值不能拍脑袋定要量环境底噪VM1010 的唤醒阈值怎么设置是我觉得整个项目里最需要耐心的一步。它的检测器本质上是个声音能量比较器阈值设得太低空调声、风扇声、路边的车流声都可能触发阈值设得太高用户正常说一句话都叫不醒它。很多工程师上来就按经验给一个固定阈值测了两天没问题放到用户家里就乱触发。不同环境的底噪差别非常大安静卧室可能只有 30dBA临街客厅能到 45dBA 以上。我建议做一套简单的现场校准流程让设备进入校准模式连续采集几分钟底噪统计能量分布的峰值和均值。把唤醒阈值设置成比底噪峰值高 6dB 到 10dB 的余量先不要贪心。在真实场景里跑一周统计误触发次数。如果误触率太高不要一味往上抬阈值要想办法从软件侧增加“持续时长”判断。所谓持续时长就是要求声音能量连续超过阈值一段时间比如 50ms 以上才算有效唤醒事件。这样能滤掉很多瞬时冲击声比如关门声、东西掉落声、拍手声。拍手声其实很难滤因为它本身就是宽带瞬态如果你的产品不希望被拍手声唤醒最好用频域特征把这类声音区分开。5.2 两级唤醒联动麦克风唤醒只是第一步VM1010 虽然在物理层完成了事件检测但它在逻辑层是“不懂语义”的。你最终要做的是把它和后面的关键词识别、命令词识别串起来。我常用的结构是两级唤醒第一级VM1010 的声学事件触发把 MCU 从深度睡眠中叫起来。第二级MCU 快速启动一个轻量级 VAD 模型分析缓冲音频里的能量分布和频谱特征判断是不是人声。如果第二级 VAD 判断“不是人声”MCU 直接再次睡过去VM1010 继续回到 LISTEN 模式。这个过程整机只需要额外消耗几十毫安的电流几十毫秒然后回到微安级待机。对电池寿命影响非常小但能有效减少无线模块频繁上电的浪费。等到第二级也通过才真正去连接远程语音服务或者启动本地离线识别。这套联动机制比“一听到声音就全系统启动”科学得多因为它把误唤醒的代价按等级拆分而不是一刀切。5.3 我踩过的几个软件坑第一个坑睡眠时把麦克风电源关了。早期为了省电我在 MCU 进入深度睡眠前会把麦克风 VDD 一起断电以为环境更安静。结果 VM1010 的 LISTEN 模式也跟着没了声学唤醒直接失灵。后来才明白VM1010 的省电逻辑是“内部自己管”不需要外部断电。只要保证在睡眠期间给它供电它自己会保持极低功耗监听状态。第二个坑唤醒中断没做滤波。VM1010 的 WAKE 信号本身是个数字脉冲但如果不做任何软件滤波一点静电和电源抖动就可能把它打高。我在 GPIO 中断配置里开了内部上拉并且在外部加了一个 100nF 电容到地做了简单的硬件滤波。同时中断服务函数里再加 20ms 的软件去抖两个措施一起来误触率降了不少。第三个坑采样缓冲窗口太短。有些用户说完唤醒词之后会顿一下再说命令如果我把录音窗口只做成 500ms后面命令的前半段就丢了。后来我把窗口拉长到 1.2 秒并用一个环形缓冲区滚动存储随时保存最近一段时间的音频这样即使判断稍微慢一点前面的语音也不会丢。6. 选型对比VM1010、VM2020、VM3011及常见电容方案6.1 Vesper产品线里怎么选VM1010 是模拟输出这是一把双刃剑。好的一面是接 MCU 的 ADC 就能用协议简单最古老的单片机也能适配不好的一面是如果你要做多麦克风阵列或者系统里本来就有数字音频总线模拟输出反而显得多余。Vesper 后续也推出了更偏数字化的新产品比如 VM2020、VM3011 这类带数字接口的型号。它们把音频输出、声学活动检测、数字接口做在一起有些型号还能直接输出 PDM/I2S省掉了外挂 ADC 的麻烦。如果项目本身是阵列麦克风或者有现成的数字音频链路完全没必要守着 VM1010 不放。从我自己的经验看VM1010 最适合的是“少量麦克风、电池供电、极度抠功耗”的场景如果你做的是智能音箱那类插电设备功耗压力不大用传统电容式数字麦克风阵列反而更容易拿到高质量的远场识别效果。6.2 什么时候不用VM1010这个可能比“什么时候用”更重要。如果你遇到下面这些情况建议重新考虑你要做音乐录音、播客、乐器拾音。VM1010 的 SNR 和频响设计目标不是这个强求不如直接选高信噪比电容麦克风。你要在手机上做长时间多麦克风降噪。数字 PDM/I2S 接口和多麦同步机制更适合模拟输出不好做阵列对齐。你的产品已经有一颗低功耗 DSP 在跑 VAD麦克风只需要不断输出原始音频。这时候即使麦克风功耗稍高DSP 整体管理着系统功耗VM1010 的“声学事件检测”功能就重叠了。你的硬件团队对高阻抗模拟信号处理没有经验。这种模拟输出如果走线、放大不合适声音质量反而不如数字输出方案直接。在这些条件下传统电容式 MEMS 麦克风或者 Vesper 的新一代数字方案可能更合适。VM1010 不是万金油它解决的是特定问题——用极低的功耗把声学事件送到系统面前。如果你想清楚了自己的问题域它会是一个很好用的杠杆。最后再分享一点我自己的体会做低功耗语音产品先把“唤醒”从应用处理器里拆出来再谈优化识别率。VM1010 最大的价值不是省了多少微安而是让系统架构变成“平时什么都不跑被声音叫醒才工作”。如果你也在评估这个方案建议先用官方的评估板在你的真实环境里测一遍底噪和触发率再决定阈值和后端软件怎么写。这颗麦克风好不好用只有放到你自己的产品里测过才算数。