近日,一款名为 Whistle 的轻量级语音识别模型正式发布。该模型专为手机、可穿戴设备、机器人、智能家居、汽车及微控制器等边缘计算场景设计。Whistle 的核心优势在于其极小的体积——仅 16.9 MB,且完全依赖 CPU 运行,无需额外依赖库。它加载于与 Needle 相同的 C++ 引擎中,支持从同一容器和量化配置直接调用。

用户只需按下麦克风按钮即可开始转录。Whistle 支持英语、德语、法语、西班牙语、意大利语、荷兰语或波兰语,单次处理时长可达 30 秒。所有音频数据均在本地设备上处理,不会上传至云端。
核心功能与技术规格
Whistle 在设备端主要执行三项任务:
- 多语言转录:支持 16kHz 单声道音频,单次最长处理 30 秒。涵盖英、德、法、西、意、荷、波七种语言,具备自动语言检测功能(除非用户手动指定)。
- 词级时间戳:提供每个单词的开始时间、结束时间及置信度概率,基于解码器的注意力机制生成。
- 语音嵌入:输出编码器特征,每 80 毫秒对应一行数据,不包含解码后的文本转录。
模型架构解析
前端处理:16 kHz 单声道音频以 25 ms 窗口和 10 ms 步长进行分帧,生成 80 个对数梅尔频带,带宽限制在 250-3500 Hz 并按通道归一化。30 秒音频对应 3,000 帧。随后通过一个包含 128 个通道、核大小为 9 的卷积主干将帧数减半三次,最终剩余 375 帧,即每 80 ms 一帧。后续阶段均以此速率运行,embed 函数返回每帧一行数据。
编码器:由八个简单的注意区块组成,其中四个使用 mHC 剩余车道,另一个使用君主哈达马德 MLP 替代前馈网络,这与 Needle 使用的区块相同。该注意力机制非因果性,例如第 3 秒处的内容可关注第 12 秒处的内容。
解码器:包含八个宽度为 512 的梯级简单注意力块,采用 8 查询头到 2 KV 头的结构,查询和键维度为 48,值维度为 64。Q、K 和 V 上应用了 3 键因果卷积,并在 18,432 个插槽中进行 3 层和 7 层的 engram 查找。这是一个不同层次数的 Needle 封锁列表。
语音特定组件:每层增加一个加法操作。每个解码器层通过门控交叉注意力读取编码器,公式为 x ← x + σ(g) · softmax(q̂ K̂T/√d) V。每层学习一个门控参数,并从剪辑中提取 K 和 V。这些投影在片段到达时运行一次,跨越 375 帧和 8 层,之后在整个解码过程中保持缓存。因此,五个光束搜索仅需维护五个短记录缓存,而非五次遍历音频。
解码策略:使用长度归一化的对数概率进行五路束搜索打分。关键词偏置通过 Aho-Corasick 自动机遍历传入短语,与束搜索并行运行,并在自动机推进时提升对应短语的对数概率。转录文本上限为 320 个 token。词汇表包含 8,192 个文本片段加上七个语言 token(每种语言一个),因此检测到的语言以 token 形式输出,而非带外返回。
动态深度调整:解码器上的梯子支持动态调整。音频深度在加载时选定,但编码器永远不会被裁剪,所有八个区块在任何深度下均完整运行。
静音检测:在解码器启动前,引擎测量剪辑的声音范围。若低于阈值,则返回空白成绩单和空白语言标识,跳过光束搜索步骤。
基准测试表现
在 LibriSpeech 测试集(clean 和 other)、SPGISpeech、Earnings-22 以及 FLEURS 平均水平上,Whistle 领先于对比模型。在 TED-LIUM、AMI 和 MLS 平均水平上,Whisper 的数据集表现优于其他模型。
| 指标 | Whistle | Whisper base | Moonshine tiny v2 |
|---|---|---|---|
| 大小 (MB) | 16.9 | 145.3 | 41.9 |
| 首 Token 延迟 (ms) | 11.1 | 73.2 | 22.8 |
| 解码速度 (tokens/s) | 1,319 | 266 | 262 |
各模型均以其默认官方运行时进行测试:Whistle 的 C++ 引擎使用 5 束搜索,openai-whisper 和 moonshine-voice 在全音频模式下不进行流式处理。首 Token 延迟定义为从音频输入到生成第一个 Token 的时间,因此编码器不被重复计算。由于每个输入固定为 30 秒,Whistle 的首 Token 延迟随音频长度变化:5 秒音频时为 5.9 毫秒,10 秒时为 11.1 毫秒,30 秒时为 36.3 毫秒。
字错误率使用低语正常化器评分。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
基础安装仅需 16kHz 的 WAV 文件或原始样本。若需支持其他采样率或麦克风捕捉,需安装额外的 [mic] 依赖,这将引入 soxr 和声音设备库。
每次调用均返回文本、语言及首 Token 耗时。设置 word_timestamps=True 可为每个单词附加时间和概率信息。搜索过程中会增加特定短语的对数概率。通过 language="de" 可强制指定语言而非依赖检测。needle.Whistle 是同一对象的模型类,用于嵌入音频或保持调用的 .cact 文件。
用户可通过界面并排比较 Whistle、Whisper 和 Moonshine 对相同片段的处理效果。
部署支持
引擎已为 17 个目标平台预构建,涵盖 macOS、Linux、Android、iOS、watchOS、Windows 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
完整的语音 C API 包括 needle_load、needle_transcribe 和 needle_embed。引擎不读取环境变量,所有行为均由编译时的默认值或显式标志控制。
引擎及其平台文件位于 GitHub 仓库 Cactus-Compute/needle3 中。





