2023 年以来,云端大模型 + 语音交互是行业热点。但真正落到出货量上------开关、家电、玩具、门锁、面板------主战场一直是端侧:
- 隐私:录音不出设备。这一条在很多品类里是硬需求
- 延迟:本地推理百毫秒级,没有网络往返
- 可用性:断网、弱网照常工作
- 成本:没有云端调用费和订阅风险
问题也很直接:一颗典型的 MCU(Cortex-M4F,100MHz,128KB SRAM,512KB~2MB Flash,无 NPU)要跑语音识别,看起来完全不够。这篇文章讲的就是怎么把它变得够用。
二、先分清任务等级(90% 的项目死在这里)
"在 MCU 上跑语音识别"是一个被严重滥用的说法。先分清三件事,资源需求差几个数量级:
| 任务 | 词表规模 | 典型模型量级 | 算力需求 | 典型平台 |
|---|---|---|---|---|
| 唤醒词检测(KWS) | 1~3 个词 | 10~100KB | 极小,可常开 | MCU 直跑 |
| 命令词识别 | 几十~几百条 | 100KB~1MB | 中等 | MCU + 定点优化 |
| 连续语音识别(ASR) | 开放词表 | MB~几十 MB | 高 | DSP/NPU 或云端 |
工程结论先行:绝大多数产品只需要前两级。想用 MCU 直接跑开放词表 ASR 是伪需求,正确的做法是"高频命令端侧 + 复杂语义云端"的两级架构。
三、先算资源账:语音任务的真实开销
端侧部署从算账开始。以 16kHz 采样、25ms 窗、10ms 跳、40 维 MFCC 的前端为例:
- 特征前端:每秒约 100 帧,每帧包含 FFT、Mel 滤波、DCT 等运算------定点化后(CMSIS-DSP,Q15/Q31)在 M4F 上是"毫秒级/秒"的开销,完全可接受
- 模型推理:这是大头。以深度可分离卷积(DS-CNN)结构为例,一个 10~20 词表的模型,参数量可压到 10 万级以下,单帧推理在 M4F 上属于毫秒量级
- 内存峰值 :特征环形缓冲 + 模型权重 + 运行时张量------运行时张量的峰值内存才是瓶颈,而不是权重
算完账你会发现:KWS 在 M4 级别 MCU 上绰绰有余;命令词识别需要认真压缩;连续 ASR 别想。
四、极限压缩六板斧(按收益/成本比排序)
1. 量化(收益最大,先做这个)
FP32 → INT8 是性价比最高的一步:
- 常见收益:模型体积 ÷4,推理速度提升 2~4 倍(M4 上定点比浮点快得多,尤其无 FPU 的型号)
- 精度代价:KWS 类任务通常掉 1~3 个百分点,用校准数据集做 per-channel 量化可以进一步压到 1 个点以内
- 工程注意:全链路定点化------特征、权重、激活、中间张量全部用 Q 格式,任何一个环节残留浮点都会把收益吃掉
2. 模型结构选择(空间比参数更值钱)
- 深度可分离卷积:把标准卷积的计算量和参数砍到约 1/8~1/9,是端侧语音模型的事实标准
- 时间卷积结构(如 TC-ResNet):小词表场景性价比极高,且天然适合流式
- 小 LSTM/GRU:序列建模强,但流式状态管理和内存占用都要额外设计------选它之前想清楚
3. 特征层压缩
- 特征维度不是越高越好:40 维 MFCC 在很多命令词任务上砍到 20 维以内,精度基本不损失
- FFT 用定点实现替换浮点版本
- 前端一切"锦上添花"的处理(多余的重采样、动态范围压缩)都要审一遍
4. 剪枝与结构化稀疏
非结构化剪枝省参数不省算力(MCU 没有稀疏加速);结构化剪枝(整通道剪掉) 才能真正减小计算图。收益不如量化直观,属于第二优先级。
5. 知识蒸馏
用大模型(云端或 PC 上训的)的软标签训练小模型,可以在同等参数量下换取几个点的精度------非常适合"模型已经压到极限但精度差一口气"的场景。
6. 二值/三值网络(谨慎)
极端压缩手段,理论体积收益巨大,但噪声环境下的掉点往往不可接受。产品级落地很少见,玩具类场景可以评估。
五、运行时才是实战的另一半
模型压缩得再好,运行时设计不对照样跑不动:
- 内存 arena:所有中间张量共享一块编译期规划好的 buffer,全程零动态分配------这既是性能要求,也是可靠性要求(malloc 在嵌入式里就是原罪)
- 流式推理:语音是流式的,帧级处理要维护好状态(尤其 RNN 的隐状态);采集用 DMA 双缓冲,推理和采集并行
- 消除数据搬运:每少一次 memcpy,就少一次 cache 未命中和一次功耗
- 用现成的优化内核:CMSIS-NN 提供 int8 深度可分离卷积/全连接的高效实现,别自己手写循环------它比朴素实现通常快数倍
六、系统级设计:决定产品体验的从来不是模型
模型只是产品的一半,另一半在系统设计:
- 两级架构:常开的小模型只负责唤醒词(低功耗模式),唤醒后切换到更大的命令词模型------这是所有量产方案的共同选择
- VAD 门控:静音段不推理,功耗直接降一个档
- FAR/FRR 平衡:误唤醒(半夜自己开灯)比漏识别更伤用户信任。阈值调整要拿真实家庭噪声录测试集,别用安静的办公室数据自欺欺人
- 词表设计:词条之间发音距离要大,避免近音词互相干扰
- 前端降噪:双麦阵列在远场场景几乎是必需品,这不是模型能补救的
七、结论:压缩的优先级和资源预算
给一个可以直接抄的工程顺序:
量化 > 结构选择 > 特征压缩 > 剪枝 > 蒸馏 > 二值化
(收益/成本比从高到低)
一个典型 KWS 任务的资源预算(M4F 级 MCU,经验量级):
- Flash:模型 30~100KB
- RAM:运行时峰值 20~60KB(含特征缓冲)
- 算力:单帧 < 1ms(100MHz 级)
- 功耗:常开监听可做到毫瓦级
这个预算是可以塞进大多数中低端 MCU 的------端侧语音从来不是"算不动",而是**"没有按正确的方法算"**。
最后:端侧和云端不是对立关系。我的判断是终局形态------高频命令端侧(免费、即时、断网可用),复杂语义云端(能力边界无限)。端侧压缩做到极限的目的,不是取代云端,而是让 90% 的交互请求根本不需要到云端去。
文中数据为公开资料与工程实践中的典型量级,具体以你的芯片手册和实测为准。
原创文章,转载请注明出处。做过几款离线语音产品的落地,欢迎同行交流。