Whistle发布:16.9MB轻量语音模型,纯CPU本地运行

Whistle发布16.9MB轻量语音模型,纯CPU本地运行。该模型专为边缘设备设计,无需额外依赖库,支持七种语言转录及词级时间戳,单次处理30秒音频,所有数据均在本地处理不上传云端。

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

首Token延迟仅11.1毫秒

用户只需按下麦克风按钮即可开始转录。Whistle 支持英语、德语、法语、西班牙语、意大利语、荷兰语或波兰语,单次处理时长可达 30 秒。所有音频数据均在本地设备上处理,不会上传至云端。

Whistle 演示:在浏览器标签页内直接运行,文件大小 16.9 MB

核心功能与技术规格

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 形式输出,而非带外返回。

动态深度调整:解码器上的梯子支持动态调整。音频深度在加载时选定,但编码器永远不会被裁剪,所有八个区块在任何深度下均完整运行。

静音检测:在解码器启动前,引擎测量剪辑的声音范围。若低于阈值,则返回空白成绩单和空白语言标识,跳过光束搜索步骤。

基准测试表现

文字错误率越低越好。缺失条形图表示模型作者未发布相应基准:Moonshine 仅支持英语,而 Whisper 报告缺少 SPGISpeech、Earnings-22 或 AMI 清理数据。Whisper 的 AMI 数字指 AMI-IHM,与其他两个报告中的 AMI 定义不同。

在 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
在 Apple M4 Pro CPU 上播放 10 秒音频测试结果。数值越小/越大代表性能越优(视具体指标而定)。

各模型均以其默认官方运行时进行测试: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 中。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读