Whistle:一个 16.9 MB 的文件,把语音识别塞进 30 秒音频和 11 毫秒首 token
端侧语音识别的常规剧本是把参数更大的模型量化压缩,再接受精度打折。Cactus Compute 这次给出的样本走的是另一条路:Whistle 是一个 Apache 2.0 协议的开放权重语音识别模型,整个模型就是单个 16.9 MB 的 .cact 文件,在纯 CPU 上运行,无任何依赖,也不需要 GPU。它支持英语、德语、法语、西班牙语、意大利语、荷兰语和波兰语七种语言,单次最多转录 30 秒音频,10 月 2 日随官方博客一同发布后,10 月 8 日登上 Hacker News 首页,拿到 611 分和 135 条评论。

三个任务,一个文件
Whistle 在设备本地完成三件事。转录是主业:16 kHz 单声道音频,一次最多 30 秒,语言自动检测,也可以显式指定。词级时间戳是第二件事:每个词都带开始时间、结束时间和概率,对齐信息直接取自解码器自身的注意力分布,应用可以据此做逐词高亮、按词定位或按词剪辑。第三件事是语音嵌入(speech embedding):编码器的输出按每 80 毫秒一行的形式直接暴露,不需要解码出文字,就能拿去做声纹匹配或语音检索。
Hacker News 评论区的实测反馈集中在英语质量上。有用户用带西班牙口音的英语测试后表示转录"准确得惊人",也有用户反馈西班牙语转录会出现"不存在的词和严重拼写错误",波兰语等小语种的表现还有待更多独立测试。官方基准只覆盖这七种语言,模型对汉语不支持,对中文应用场景没有直接价值,这一点在选型时需要留意。
静音处理是产品细节里比较克制的一项:引擎在解码开始前测量音频的响度范围,低于阈值直接返回空转录和空语言标签,完全不进入束搜索。对比业界语音模型"没听到也编一句话"的通病,这个设计把幻觉路径直接切断了。
模型结构:log-mel 前端 + Needle 形解码器
Whistle 的整体结构是一条经典管线加一处关键改动。前端把 16 kHz 单声道音频切成 25 毫秒窗口、10 毫秒步长的帧,提取 80 维 log-mel 频谱,频带限制在 250-3500 Hz,逐通道归一化。30 秒音频得到 3000 帧,随后一个 128 通道、核尺寸 9 的卷积层做三次降采样,帧数压到 375,每帧对应 80 毫秒音频。之后的全部计算都在这个速率上进行。
编码器是 8 个 Simple Attention 块,全帧自注意力,非因果(3 秒处的帧可以直接关注 12 秒处的帧),4 条 mHC 残差通道,前馈网络换成 Monarch Hadamard MLP。解码器是 8 个 Laddered Simple Attention 块,宽度 512,8 个查询头对 2 个 KV 头(GQA),查询键 48 维、值 64 维,Q/K/V 前各有一层 3 抽头因果卷积,第 3 层和第 7 层做 18432 槽位的 engram 查找。

语音专属的结构改动只有一处:每一层解码器都通过门控交叉注意力读取编码器输出,形式是 x ← x + σ(g) · softmax(q̂K̂ᵀ/√d)V,门控系数 g 按层学习。K 和 V 投影只在音频进入时执行一次,375 帧 × 8 层,之后全程复用。五路束搜索因此只需要维护五份短的转录缓存,而不是对音频重复编码五遍。
解码侧有 Cactus 招牌的关键词偏置(keyword biasing):应用把用户可能说到的名字、地名、产品词列表传进去,引擎用 Aho-Corasick 自动机 alongside 束搜索并行扫描,命中词条的对数概率被逐步抬升。词表是 8192 个文本片段加 7 个语言 token,转录上限 320 token,检测出的语言作为 token 直接输出而不是旁路返回。
与 Needle 共用一个引擎:单二进制的语音到工具调用
这是 Whistle 最值得展开的设计决策。上个月登过本站的 Cactus Needle 3 是同一家公司的 8-29 MB 端侧语言模型,带工具调用能力。Whistle 不只是"和 Needle 用了类似的块结构"——它直接复用 Needle 的 .cact 容器格式、Cactus Quants 量化方案、SIMD 内核和 KV cache,编码器和解码器里的共享块跑的就是 Needle 的代码,而不是它的复制品。一个已经部署了 Needle 的设备,装同一个二进制就能跑 Whistle,不需要第二套运行时。
组合形态是官方展示的主场景:needle --model whistle.cact --audio clip.wav 做纯转录;needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav 则把音频送进去,转录文本直接对齐工具清单,一个 JSON 对象返回工具调用和语音字段(语音字段以 audio_ 前缀区分)。语音进、工具调用出,中间没有第二段进程间通信,也没有音频离开设备。对照智能音箱、车载语音、可穿戴设备这类隐私敏感场景,这条"音频不出设备"的链路是它作为卖点存在的根基。
C API 也压缩到三个函数:needle_load、needle_transcribe、needle_embed,外加 needle_complete 直接接收音频。引擎不读任何环境变量,所有行为要么是编译期默认值,要么是显式 flag,同一模型文件在相同输入下产生相同输出。
Ladder:一套权重裁出 2 到 N 层
解码器沿用了 Needle 3 的 laddered 设计:从 2 层开始,每一个深度都作为独立模型训练过,加载时用 --audio-depth 选择。编码器不做裁剪,8 个块在任何深度下都完整运行。工程上的直接好处是同一份 16.9 MB 权重可以在微控制器到手机之间按算力选择解码深度,而不用为每档算力维护单独的模型文件。静音检测、词时间戳、嵌入输出这些能力在每一档深度下都保持一致。
基准:WER 与速度的完整账本
官方把 Whistle、OpenAI Whisper base 和 Moonshine tiny v2 放在同一台 Apple M4 Pro 的 CPU 上对比,各家用各自的官方运行时和默认配置:Whistle 用自家 C++ 引擎开 5 路束搜索,Whisper 用 openai-whisper(fp32 在内存),Moonshine 用 moonshine-voice 非流式全音频推理。Whistle 的词错误率(WER)在 86,174 条测试语句上测得,采用 Whisper 官方 normalizer 评分;Whisper 和 Moonshine 的数字直接引用各自论文(Whisper 论文表 9、10、13,Moonshine 论文表 3)。官方还声明所有报告的测试集音频都不在 Whistle 的训练或验证数据中,比对方式是跨全部测试集核对音频校验和与说话人 ID。
数字如下(WER,越低越好):
| 测试集 | Whistle (16.9 MB) | Whisper base (145.3 MB) | Moonshine tiny v2 (41.9 MB) |
|---|---|---|---|
| LibriSpeech test-clean | 4.31 | ~5.5 | ~5.9 |
| LibriSpeech test-other | 10.49 | ~11.9 | ~12.4 |
| SPGISpeech | 7.65 | 未公布 | 未公布 |
| Earnings-22 | 19.01 | 未公布 | 未公布 |
| AMI | 26.07 | ~25.6 (AMI-IHM) | 未公布 |
| AMI cleaned | 22.87 | 未公布 | 未公布 |
| TED-LIUM | 7.61 | ~5.7 | 未公布 |
| FLEURS 七语平均 | 21.4 | ~23.3 | 未公布 |
| MLS 六语平均 | 24.9 | ~26.5 | 未公布 |
注:Whisper 的对比数字取自其论文表格的量级,官方对比图中未逐一标注;Whisper 的 AMI 数字是 AMI-IHM 子集,与其他两家的 AMI 口径不同。Moonshine 仅支持英语,SpGISpeech、Earnings-22 等商务语音基准均未公布。
速度差异是这张表之外更直观的一层。10 秒音频在同一颗 M4 Pro CPU 上:首 token 时间 Whistle 11.1 ms、Whisper base 73.2 ms、Moonshine tiny v2 22.8 ms;解码吞吐 Whistle 1319 token/s,Whisper 266 token/s,Moonshine 262 token/s。体积分别是 16.9 MB、145.3 MB 和 41.9 MB。Whistle 的精度优势集中在 LibriSpeech、SPGISpeech、Earnings-22 和 FLEURS 平均;Whisper base 在 TED-LIUM、AMI 和 MLS 平均上仍然领先,代价是 8.6 倍的体积和约 6.6 倍的首 token 延迟。
工程师视角:三条可操作的结论
第一,如果你在做需要语音入口的端侧应用(智能家居、车载、可穿戴、机器人),Whistle 的样本价值在于把"语音模型 + 小语言模型 + 工具调用"压缩到单二进制、双模型、零依赖的组合,语音数据全程不出设备。第二条是适用边界:七种欧洲语言、30 秒单轮音频、320 token 转录上限,它不适合做长音频转录,也不覆盖汉语。第三条是部署成本:pip install cactus-needle 之后 needle download macos-arm64 加 needle download whistle 两条命令就能在 Apple Silicon 上跑通第一条转录,needle whistle compare 子命令可以把 Whistle、Whisper、Moonshine 在你自己的音频上并排打分,选型不需要依赖官方基准。
来源: