跳到正文
原文
Hacker News· gmays·· 20 小时前精选AI 评分65

Cactus Compute 发布 16.9 MB 端侧语音识别模型 Whistle

Whistle: Speech to Text in 16.9 MB

AI 导读

Cactus Compute 发布 16.9 MB 端侧语音识别模型 Whistle,在 CPU 上无依赖运行,首 token 11 ms,支持英、德、法、西、意、荷、波七语。

推荐理由

16.9 MB 的端侧语音模型与 Needle 共用同一二进制可直接转写为工具调用,并给出与 Whisper、Moonshine 的逐项对比。

正文 · AI 翻译

返回博客

模型研究

一个开源的语音识别模型,与 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 · 在此标签页运行

按下麦克风,说点什么。

支持英语、德语、法语、西班牙语、意大利语、荷兰语或波兰语,最长 30 秒。首次按下会下载 16.9 MB 的模型,音频不会离开你的设备。

Whistle 做三件事,全部在设备上完成:

  • 转写。 16 kHz 单声道音频,单次最长 30 秒,支持英语、德语、法语、西班牙语、意大利语、荷兰语和波兰语。除非你指定语言,否则会自动检测。
  • 词级时间戳。 每个词都带有开始时间、结束时间和概率,由解码器的注意力对齐得到。
  • 语音嵌入。 编码器输出,每 80 毫秒一帧对应一行,无需解码转录文本。
标记为 shared 的模块运行的是 Needle 的代码,而非其副本。--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

词错误率,越低越好。缺失的柱状图表示该模型作者从未发布的基准测试:Moonshine 仅支持英语,Whisper 没有报告 SPGISpeech、Earnings-22 或 AMI cleaned。Whisper 的 AMI 数据为 AMI-IHM,是与其他两款报告的 AMI 不同的子集。

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

在 Apple M4 Pro CPU 上处理十秒音频。柱状图在每个面板内按比例缩放。

每个模型都以其官方运行时和默认设置运行: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-needle
import needle

print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights

16 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-timestamps

needle_load、needle_transcribe 与 needle_embed 构成了完整的语音 C API。引擎不读取任何环境变量。所有行为都是编译时的默认值或显式标志。

权重文件位于 Hugging Face,引擎及其平台文件夹在 Cactus-Compute/needle3 中,源代码在 GitHub 上。

来源:Hacker News · cactuscompute.com