Cactus Compute 发布 16.9 MB 端侧语音识别模型 Whistle
Whistle: Speech to Text in 16.9 MB
Cactus Compute 发布 16.9 MB 端侧语音识别模型 Whistle,在 CPU 上无依赖运行,首 token 11 ms,支持英、德、法、西、意、荷、波七语。
16.9 MB 的端侧语音模型与 Needle 共用同一二进制可直接转写为工具调用,并给出与 Whisper、Moonshine 的逐项对比。
模型研究
一个开源的语音识别模型,与 Needle 运行在同一 CPU 引擎上。它可转写七种语言,首个 token 在 11 毫秒内输出,并可与 Needle 一同加载,使单个二进制文件直接将一段音频转化为工具调用。
JM
Jakub Mroz
HN
Henry Ndubuaku
|2026 年 10 月 2 日|6 分钟阅读
今天我们发布 Whistle,一款面向手机、可穿戴设备、机器人、智能家居、汽车和微控制器的语音识别模型。它是一个 16.9 MB 的文件,无任何依赖在 CPU 上运行,并以同一容器和同一量化加载到与 Needle 相同的 C++ 引擎中。
Whistle 沙盒
开口说话,Whistle 即可在你的设备上完成转写
16.9 MB · 在此标签页运行
按下麦克风,说点什么。
Whistle 做三件事,全部在设备上完成:
- 转写。 16 kHz 单声道音频,单次最长 30 秒,支持英语、德语、法语、西班牙语、意大利语、荷兰语和波兰语。除非你指定语言,否则会自动检测。
- 词级时间戳。 每个词都带有开始时间、结束时间和概率,由解码器的注意力对齐得到。
- 语音嵌入。 编码器输出,每 80 毫秒一帧对应一行,无需解码转录文本。
--audio-depth 选择解码器层;编码器始终运行全部八层。前端。 16 kHz 单声道音频以 25 毫秒窗口、10 毫秒步长分帧,得到 80 个 log-mel 频带,频带限制在 250–3500 Hz,并对每个通道归一化。30 秒对应 3,000 帧。一个 128 通道、卷积核为 9 的卷积茎干将该数量三次减半,最终留下 375 帧,每帧 80 毫秒。此后每一阶段都以该速率运行,embed 每一帧返回一行。
编码器。 八个 Simple Attention 块:四条 mHC 残差通道以及一个替代前馈网络的 Monarch Hadamard MLP,与 Needle 所用块相同。注意力不是因果的。3 秒处的帧可以关注 12 秒处的帧。
解码器。 八个宽度为 512 的 Laddered Simple Attention 块,8 个查询头对应 2 个 KV 头,48 维的查询与键,64 维的值,在 Q、K、V 上使用长度为 3 的因果卷积,并在第 3 层和第 7 层对 18,432 个槽位进行 engram 查询。这与 Needle 的模块列表相同,只是层数不同。
与语音相关的部分是每层新增的一个模块。每个解码器层通过门控交叉注意力 x ← x + σ(g) · softmax(q̂ K̂ᵀ/√d) V 读取编码器,门按层学习得到,K 与 V 取自该音频片段。这些投影在音频片段到达时运行一次,跨 8 层处理 375 帧,并在整个解码过程中保持不变。因此五条 beam 仅需五个较短的转录缓存,而非对音频进行五次遍历。
解码。 五条 beam 按长度归一化的对数概率打分。关键词偏置与 beam 同步,在你传入的短语上遍历一个 Aho-Corasick 自动机,并在自动机前进时提升其对数概率。转录文本上限为 320 个 token。词表包含 8,192 个文本片段外加七个语言 token,每种语言一个,因此检测到的语言以 token 形式输出,而非作为带外信息返回。
阶梯在解码器上。 从 2 层开始的每个深度都作为独立模型进行训练,--audio-depth 在加载时选择其一。编码器从不切片:八个块在每个深度都全部运行。
静音。 引擎在解码器启动前测量音频片段的响度范围。低于阈值时返回空转写和空语言,且不会进入束搜索。
WhistleWhisper baseMoonshine tiny v2
Whistle 在 LibriSpeech test-clean 与 test-other、SPGISpeech、Earnings-22 以及 FLEURS 平均值上领先。Whisper base 在 TED-LIUM、AMI 和 MLS 平均值上领先,大小为 145.3 MB 对比 16.9 MB。
大小
兆字节,越小越好
Whistle16.9 MB
Whisper base145.3 MB
Moonshine tiny v241.9 MB
首 token 时间
毫秒,越小越好
Whistle11.1 ms
Whisper base73.2 ms
Moonshine tiny v222.8 ms
解码
每秒 token 数,越大越好
Whistle1,319/s
Whisper base266/s
Moonshine tiny v2262/s
每个模型都以其官方运行时和默认设置运行:Whistle 的 C++ 引擎采用 5 束、openai-whisper,以及对完整音频的非流式 moonshine-voice。首 token 时间为音频输入到首个 token 的时间。解码速度为 token 数除以其后的实际耗时,因此编码器不会被重复计算。Whisper 将每个输入填充到 30 秒,因此其首 token 时间在不同片段长度下保持不变。Whistle 的时间随片段长度变化:5 秒时 5.9 毫秒,10 秒时 11.1 毫秒,30 秒时 36.3 毫秒。
词错误率使用 Whisper 标准化器进行评分。Whistle 的数据基于 86,174 条话语测量得出。Whisper 与 Moonshine 的数据为各自作者发布的数据,来自多语言检查点而非仅英语检查点。Whistle 的训练或验证数据中不包含任何测试音频,该结论通过对所有报告的测试集的音频校验和与说话人 ID 比对得到验证。
needle_load 读取 .cact 文件中保存的任意模型,因此同一二进制文件可处理语音、文本或两者:
needle --model whistle.cact --audio clip.wav
needle --model needle3.cact --tools tools.json --prompt "turn off the kitchen lights"
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav在第三行中 needle_complete 直接接收音频片段。引擎对其进行转写,根据转写文本响应你的工具,并返回一个包含调用和语音字段的 JSON 对象,语音字段带有 audio_ 前缀。调用方无需处理任何转写文本。
{"function_calls":[{"name":"set_lights","arguments":{"room":"kitchen","on":false}}],
"confidence":0.94,
"audio_text":"turn off the kitchen lights",
"audio_language":"en"}pip install cactus-needleimport needle
print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights16 kHz 的 WAV 或原始样本无需基础安装之外的任何额外组件。其他采样率和麦克风采集需要 [mic] 额外组件,它会添加 soxr 和 sounddevice。
每次调用返回文本、语言、首 token 的毫秒数以及此后解码器的每秒 token 数。word_timestamps=True 添加每个词及其时间和概率。keywords=["Siobhan", "Krzysztof"] 在搜索过程中提高这些短语的对数概率。language="de" 强制指定语言而非自动检测。needle.Whistle() 是作为对象的同一模型,可供 embed(audio) 使用或保存一个经过调优的 .cact。
needle whistle playground 在终端中通过麦克风进行转写,needle whistle compare 将同一音频片段并行通过 Whistle、Whisper 和 Moonshine 运行并显示各自的计时。
引擎已为十七个目标预编译交付,涵盖 macOS 与 Linux,以及 Android、iOS、watchOS、Windows on ARM、RISC-V、MIPS、浏览器和 WASI 组件。每个文件夹都包含一个 needle 二进制文件、libneedle.a 与 needle.h,并能加载你提供的任何 .cact。
needle download macos-arm64
needle download whistle
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestampsneedle_load、needle_transcribe 与 needle_embed 构成了完整的语音 C API。引擎不读取任何环境变量。所有行为都是编译时的默认值或显式标志。
权重文件位于 Hugging Face,引擎及其平台文件夹在 Cactus-Compute/needle3 中,源代码在 GitHub 上。
来源:Hacker News · cactuscompute.com