Today for AI

Hacker News AI · 2026/10/9 00:59:39

Whistle 发布 16.9 MB 端侧语音转文字模型:支持七语种实时转录与词级时间戳对齐

原标题:Whistle: Speech to Text in 16.9 MB
78AI 研判分
核心综述

Cactus Compute 推出 Whistle,一款仅 16.9 MB 的超轻量级端侧语音转文字模型。该模型基于 Needle 架构,支持英、德、法、西、意、荷、波七种语言,可在浏览器或本地设备完全离线运行,提供实时转录、词级时间戳及语音嵌入提取功能,显著降低了隐私敏感场景下的 ASR 部署门槛。

报道全文原始报道全文

本文目录5 个章节

Whistle 沙盒Speak,Whistle 在你的设备上完成转录16.9 MB · 在此标签页运行语言关键词

按下麦克风并说些什么。

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

Whistle 在设备端执行三项任务:

  • 转录。 支持 16 kHz 单声道音频,单次处理最长 30 秒,涵盖英语、德语、法语、西班牙语、意大利语、荷兰语和波兰语。除非你指定语言,否则系统会自动检测语言。
  • 词级时间戳。 每个单词都附带起始时间、结束时间和概率值,这些时间戳由解码器的注意力机制对齐生成。
  • 语音嵌入。 编码器输出,每 80 ms 帧对应一行数据,无需解码转录文本。

模型

标记为“共享”的模块直接运行 Needle 的代码,而非其副本。--audio-depth 参数用于选择解码器层数;编码器始终运行全部八层。

前端。 16 kHz 单声道音频以 25 ms 窗口和 10 ms 步长进行分帧,转换为 80 个 log-mel 频带,限制在 250-3500 Hz 范围内并按通道归一化。30 秒音频对应 3,000 帧。一个包含 128 个通道、核大小为 9 的卷积主干将帧数减半三次,最终留下 375 帧,即每 80 ms 一帧。此后的所有阶段均以此速率运行,且 embed 函数返回每帧对应的一行数据。

编码器。 八个 Simple Attention 块:四个 mHC 残差通道,以及用 Monarch Hadamard MLP 替代前馈网络,这与 Needle 使用的块相同。注意力机制非因果性。第 3 秒的帧可以关注到第 12 秒的帧。

解码器。 八个 Laddered Simple Attention 块,宽度为 512,8 个查询头对应 2 个 KV 头,48 维的查询和键,64 维的值,Q、K 和 V 上应用 3-tap 因果卷积,并在第 3 和第 7 层通过 18,432 个槽位进行 engram 查找。这即是 Needle 的块列表,但层数不同。

语音特有的部分在于每层的一个附加组件。每个解码器层通过门控交叉注意力读取编码器信息,公式为 x ← x + σ(g) · softmax(q̂ K̂ᵀ/√d) V,其中门控参数按层学习,K 和 V 取自音频片段。当音频片段到达时,这些投影仅计算一次(跨越 8 层的 375 帧),随后在整个解码过程中保持不变。因此,使用五个 beam 搜索仅需维护五个简短的转录缓存,而不是对音频进行五次遍历。

解码。 五条波束(beams)按长度归一化的对数概率进行评分。关键词偏置(Keyword biasing)在传入的短语上运行 Aho-Corasick 自动机,与波束搜索并行推进,并在自动机状态前进时提升其对应的对数概率。转录文本上限为 320 个 token。词汇表包含 8,192 个文本片段加上七个语言 token(每种语言一个),因此检测到的语言是作为 token 输出的,而非通过带外(out-of-band)方式返回。

层级结构位于解码器端。 从 2 层开始的所有深度都被训练为独立的模型,--audio-depth 参数在加载时选择其中一个。编码器从未被裁剪:在所有深度下,全部八个块均参与运行。

静音处理。 引擎在解码器启动前测量音频片段的响度范围。若低于阈值,则返回空转录和空语言标识,且不进入波束搜索阶段。

基准测试

Whistle、Whisper base、Moonshine tiny v2 词错误率(Word error rate),越低越好。缺失的柱状图表示该模型的作者未发布相关基准数据: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,对比 Whistle 的 16.9 MB。

大小(MB),越小越好 Whistle: 16.9 MB Whisper base: 145.3 MB Moonshine tiny v2: 41.9 MB

首 Token 时间(ms),越小越好 Whistle: 11.1 ms Whisper base: 73.2 ms Moonshine tiny v2: 22.8 ms

解码速度(tokens/s),越大越好 Whistle: 1,319/s Whisper base: 266/s Moonshine tiny v2: 262/s

在 Apple M4 Pro CPU 上处理 10 秒音频的结果。各面板内的柱状图按比例缩放。

每个模型均在其官方运行时环境及默认设置下运行:Whistle 使用 C++ 引擎并设置 5 条波束,openai-whisper,以及 moonshine-voice 以非流式模式处理完整音频。首 Token 时间定义为从输入音频到生成第一个 Token 的时间。解码速度计算方式为 Token 数量除以后续墙钟时间(wall time),因此编码器耗时未被重复计算。Whisper 会将所有输入填充至 30 秒,因此其首 Token 时间不随音频片段长度变化。Whistle 的首 Token 时间与音频片段长度成正比:5 秒时为 5.9 ms,10 秒时为 11.1 ms,30 秒时为 36.3 ms。

词错误率(Word error rates)使用 Whisper 的标准化器进行评分。Whistle 的数据基于 86,174 条语音片段测量得出。Whisper 和 Moonshine 的数据则引用其作者发布的数值,这些数值来自多语言检查点(multilingual checkpoints),而非仅支持英语的检查点。经比对所有报告测试集中的音频校验和与说话人 ID,确认 Whistle 的训练或验证数据中不包含任何测试音频。

一个引擎,三种加载方式

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 数(tokens per second)。设置 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。