端侧离线语音识别:手机上为什么跑得动
端侧离线语音识别,是把整条识别链路放在手机、手表、嵌入式板子这类终端设备上跑完,音频不上传、结果不回传。 它能跑起来,靠的不是某一项黑科技,而是模型侧和运行时侧两条线一起做压缩。
值得先说清楚一件事:端侧不总是”云端的廉价替代品”。在有些场景里,它是唯一可行的那条路。
模型侧:把计算量本身做小
第一条线是让模型本身变轻。常见的三种手段:
更小的模型结构。 端侧模型往往从设计阶段就按资源受限的目标来做——层数更少、隐藏维度更窄、编码器的下采样更激进。这不是把大模型裁一刀,而是一开始就换了一套结构选型。
量化。 这是端侧最关键的一步。神经网络训练时权重通常是高精度浮点数,量化就是把权重从高精度浮点降到低位整数(最常见的是 int8),用可接受的精度损失换取更小的体积和更快的运算。
为什么有效?体积上,位宽降下来,同一个模型占的存储和内存直接按比例缩水;速度上,整数运算在多数处理器上比浮点便宜,而且更小的权重意味着更少的内存搬运——推理很多时候卡在访存而不是算力。代价也很直白:量化是有损的,某些对数值敏感的层会掉精度,所以实践中常见混合精度,敏感的层保留较高精度,其余层量化。
算子融合。 把若干个连续的小算子合并成一个。收益不在数学上,而在工程上:少一次算子调度、少一轮中间结果的写出与读回。端侧内存带宽本就紧张,省下的这些访存很实在。
运行时侧:引擎和 NPU
模型做小了,还得有东西高效地把它跑起来。
专为端侧优化的推理引擎。 这类引擎和服务端框架的取舍不一样:它们要控制自身的二进制体积、要能在没有大内存的环境里工作、要覆盖各式各样的指令集。sherpa-onnx 就是一个例子,它自述基于 onnxruntime,提供 STT、TTS、说话人分离、语音增强、声源分离和 VAD 能力,并且无需联网。Vosk 自述为离线语音识别 API,覆盖 Android、iOS、树莓派与服务器。whisper.cpp 自述是 Whisper 模型的 C/C++ 移植——把模型从 Python 生态搬进 C/C++,本身就是为了摆脱重量级运行时依赖。
设备上的 NPU 加速。 现在的移动芯片和不少嵌入式 SoC 都带神经网络加速单元,它们对低位整数运算特别友好,正好和量化后的模型配套。但要用上 NPU,模型的算子必须落在该 NPU 支持的集合内,否则会退回 CPU 执行——这是端侧适配里最常踩的坑,也是”同一个模型换个芯片就跑不动”的常见原因。
落地面已经铺得比想象中广
端侧 ASR 早就不只是”手机上的功能”。以 sherpa-onnx 的 README 为例,它列出的运行目标包括 x86、x86_64、32 位 ARM、64 位 ARM、RISC-V、RK NPU、Ascend NPU,操作系统与设备则覆盖 Android、WearOS、iOS、HarmonyOS、Raspberry Pi、Windows、macOS、Linux。
这份清单本身就是结论:端侧语音识别的落地面已经铺到了手表、国产 NPU 和 RISC-V。它不再是个实验性方向,而是一个有成熟工具链、跨指令集覆盖的工程选项。
端侧 vs 云端:五个维度的取舍
| 维度 | 端侧离线 | 云端 |
|---|---|---|
| 隐私 | 音频不出设备,无第三方接触原始数据 | 音频要传出去,需评估传输与存储合规 |
| 网络 | 无网、弱网、地铁隧道里都能用 | 断网即不可用,弱网时延迟抖动明显 |
| 精度与词表 | 受模型规模限制,长尾专名、生僻词表现更弱 | 可用更大模型和更大词表 |
| 成本结构 | 一次性研发与适配投入,无按次费用 | 按调用量计费,用量涨则成本线性涨 |
| 更新方式 | 模型跟随 App 版本分发,用户不更新就用旧的 | 服务端替换即时对所有人生效 |
这张表的用法不是”选分数高的一边”,而是先看你的场景里哪一行是硬约束。
三样真收益,具体是什么意思
隐私不出设备。 这一条被说得最多,但常常说得太轻。真正的分量在合规场景:医疗问诊记录、政务窗口录音、涉密环境的会议——这些场景里,很多时候不是”上传更贵”或”上传有风险”,而是制度上根本不允许音频离开本地。此时端侧不是一个更省钱的方案,它是唯一能落地的方案。云端再准也进不了门。
无网可用。 车载、户外设备、工厂车间、地下空间,网络质量本来就不可控。云端方案在这些地方不是慢一点,而是间歇性完全不工作,产品体验上等同于坏了。端侧则把网络这个变量从链路里彻底拿掉。
无按次费用。 云端 ASR 的成本随调用量线性增长,端侧则是把成本前移成一次性的研发与适配投入。对高频、长时长、大用户量的场景,这个结构差异会随规模放大。注意这里说的是成本结构不同,不是”端侧一定更便宜”——小用量场景下,为了适配一堆芯片型号投入的人力,未必划算。
代价:两件必须提前接受的事
精度与词表规模受限。 模型小、量化过、词表窄,长尾专名和口音的表现会明显弱于云端大模型。这不是调参能抹平的,是资源上限决定的。做端侧方案时,测试集要按真实业务的难度来建,别拿安静环境的朗读音频给自己发合格证。
模型更新要随 App 分发。 服务端换模型是替换一次、所有人立刻生效;端侧换模型意味着发新版本、等应用商店审核、等用户升级。一个已知问题,在服务端可能几小时修好,在端侧要以周甚至月为单位计算生效周期,而且线上永远存在多个模型版本并存的长尾。排查线上问题时,第一件事是先确认对方跑的是哪个模型版本。
一个常见的折中是端云协同:端侧负责唤醒、VAD、短指令这类高频低难度的部分,复杂的长句转写在有网时走云端。这样既保住了离线可用的底线,又不必让端侧模型去硬扛全部难度。
常见问题
问:端侧模型是不是就是把云端模型量化一下?
多数情况不是。量化只是最后一步,端侧模型通常在结构选型阶段就已经和服务端模型分道扬镳了。把一个为服务端设计的大模型强行量化到端侧,往往在精度和速度上两头不讨好。
问:一定要有 NPU 才能做端侧 ASR 吗?
不是。CPU 上跑得动的端侧方案是存在的,NPU 是加速手段而不是准入门槛。是否值得为 NPU 做适配,取决于你的目标设备是不是集中在少数几款芯片上——适配成本是按芯片型号累加的。这个”用什么算”的账怎么算,可以对照GPU 还是 CPU:语音识别部署怎么选里的思路。
问:端侧识别的音频还需要做前处理吗?
需要,而且更要注意。采样率、声道、位深这些要求和云端一样不能含糊,具体见ASR 对音频格式的要求。端侧算力紧张时更要把 VAD 用好,静音段不送模型,本身就是最有效的省电手段。
相关阅读
本文讲的是端侧语音识别的通用工程原理,不绑定某一个具体实现。 文中点名的开源项目,其能力描述取自各自仓库的公开自述,能力边界与支持范围请以官方文档为准。 我们没有对文中提到的任何方案做过性能实测,因此不给速度、内存、准确率一类的数字。