跳转至

模型观察

每周本地 ASR 模型及与 Hex 编译目录相关的运行时的运行日志;最新的条目在最前,每条都注明日期,并逐一与 Hex 当前发布的内容进行对比。

2026-10-22:流式 Parakeet 对比 Moonshine,以及要补充什么

问题(Kit):如果 Parakeet 可以流式,我们还需要 Moonshine 吗?始终在线的流式 Parakeet 更好吗?有没有比 Moonshine 更好的小型模型?

结论

Moonshine?
├── Drop the ONNX Moonshine stack (moonshine-voice C lib, ORT, download.moonshine.ai)
│   └── Replace with moonshine-streaming-small Q8 GGUF through transcribe-cpp (already in the pinned 0.2.4)
├── Keep a small streaming model for commands and the live draft
│   └── Always-on streaming Parakeet is not better: same WER at command latency, 4-5x the parameters,
│       a second 0.7 GB model copy, and (buffered Unified) a recomputed 5.6 s left context per chunk
└── Meetings only: Apple SpeechTranscriber beats both on cost (Hex measured ~2% CPU, no model memory);
    plans/meeting-live-transcription.md already recommends it

置信度:中等。以下所有内容要么来自供应商报告,要么是 Hex 自己的测量;这里没有任何内容在 Kit 的硬件上重新运行过。未测量且具有决定性的:GGUF Moonshine 在 Hex 行切分后的命令识别延迟和漏检率,以及任何始终在线流的 Metal 功耗。

1. 流式 Parakeet 对比 Moonshine

Hex 当前运行:moonshine.rs 通过 moonshine-voice C 库加载 Moonshine Streaming Small(small-streaming-en 量化 ONNX 包,磁盘约 250 MB,140M 级),单线程。Hex 自己的数据(docs/features/meetings.md,Mac Studio/Pro,2026-10-22):两条会议草稿流占用一个核心的 31%,命令识别器占用一个核心的 22%,每个 Moonshine 常驻内存约 0.4 GB,第二个 Parakeet 副本在会议峰值时额外增加约 +0.74 GB(2808 对比 2072 MB)。

按延迟的准确率。 NVIDIA 自己的表格基于八个 Open ASR 数据集(AMI、Earnings22、GigaSpeech、LibriSpeech clean/other、SPGI、TED-LIUM、VoxPopuli),平均 WER %。Moonshine 的数据来自其论文,使用相同数据集。

                                latency (chunk+right)   avg WER
Moonshine v2 small (123M)       80 ms lookahead         7.84    // paper Table 3
Moonshine v2 medium (245M)      80 ms lookahead         6.65
Parakeet Unified 0.6B   offline                         5.91
                        2.08 s  (Hex default 5.6/1.04/1.04)   6.14
                        1.12 s                          6.29
                        0.56 s                          6.52
                        0.32 s                          6.92
                        0.24 s                          7.35
                        0.16 s                          8.44
                        0.08 s                         15.63    // collapses
Nemotron Speech Streaming EN 0.6B (cache-aware)
                        offline                         6.92
                        1.12 s                          6.92
                        0.56 s                          7.09
                        0.16 s                          7.84
                        0.08 s                          8.70
Parakeet TDT v2 0.6B buffered at 1.12 s                22.83    // not trained for it

解读:

  • 在命令延迟(低于 0.3 秒)下,Moonshine small(7.84)已经与 0.16 秒下的 Nemotron(7.84)持平,并超过 0.16 秒下的 Unified(8.44)。Moonshine medium(6.65)在体积仅为 40% 的情况下,与 1.12 秒下的 Nemotron(6.92)持平。
  • Unified 只有在接受 0.56 到 2 秒的延迟(6.14 到 6.52)时才会胜出,这适合字幕草稿,但与语音命令无关。
  • Moonshine 论文在 M3 MacBook 上测得的句末延迟:small 为 148 ms,计算负载 18%;medium 为 258 ms,29%(表 2)。它没有报告功耗。我没有发现任何人发布 Parakeet 或 Nemotron 流式的 Metal 功耗。

计算形态。 Unified 是 缓冲式 流式:NVIDIA 的模型卡上写着“每个块都会重新计算左侧上下文”,而 Hex 的 transcription/gguf_session.rs 使用左侧 5.6 秒、块 1.04 秒、右侧 1.04 秒。每一步要为 1.04 秒的新音频编码约 7.7 秒的音频,大约 7.4 倍的冗余(在 0.56 秒设置下为 12 倍)。按照这些模型卡在 M4 Max 上约 190 到 230 倍实时的离线 Metal 吞吐量,我推导出每条连续流约占 GPU 几个百分点,忽略每块的额外开销;这不是实测值。Nemotron 是缓存感知的(缓存恒定,无重叠),因此一次流式传输的成本大约相当于一次离线计算。Moonshine 的编码器也是增量式的(滑动窗口,50 Hz 前端)。

Apple Silicon 上的吞吐量(transcribe.cpp 数据卡,M4 Max,Q8_0,Metal,离线计算,在 11 秒片段 / 35 秒片段上的 x 实时):

Parakeet Unified          188 / 228
Nemotron EN               207 / 225
Nemotron 3.5 (multiling.) 144 / 138
Moonshine streaming tiny  239 / 112   (CPU 271 / 169)
Moonshine streaming small 129 /  59   (CPU  64 /  49)
Moonshine streaming med    87 /  36   (CPU  47 /  32)
Voxtral Realtime 4B         6 /   7

Moonshine 的自回归解码器在长转写中占主导,而且其 CPU 路径与 Metal 路径接近,因此它不需要 GPU。Nemotron/Unified 是 GPU 模型:在相同芯片上 CPU 为 32 到 39 倍。

一个已加载的 Parakeet 能否同时服务多个流? 在 Hex 的绑定中不行。对照 transcribe-cpp 0.2.4(Hex 的锁定版本)和上游进行了检查:

  • transcribe.h(上游 main):已知 0.x 限制——尚不支持并发 COMPUTE:在给定模型的所有会话中,最多只能有一个 transcribe_run / transcribe_run_batch / active stream 处于进行中。希望并行转录的调用者应为每个 worker 加载一个模型;支持在同一模型上串行化使用多个会话。
  • docs/bindings.md:C 头文件会允许在调用方串行化的情况下,多个会话各自持有一个活动流并交错馈送数据,但“一个绑定只允许每个模型有一个活动流”。
  • src/session.rs(0.2.4)中的 Session::stream 会在流的整个生命周期内持有按模型的租约;第二个流或任何 run 都会返回 Error::Busy。Hex 的引擎线程在每次听写采集期间持有的正是这个租约。
  • run_batch 仅批处理离线话语。没有批式流式。

因此:每个并发流都需要自己的 Model(Hex 测量第二个 Parakeet 约需 0.7 GB),而常驻在听写模型上的流会阻塞听写(或被听写阻塞)。transcribe.cpp 的 README 说 CPU 和 Metal 权重是内存映射的,所以同一 GGUF 的两次加载可能共享页面;但 Hex 的 +0.74 GB 测量表明,不要未经测量就假定如此。一个解除该限制的 “per-session 后端架构” 被描述为已规划,但未给出日期。

(a) 双轨实时字幕。 Moonshine 仍然是最便宜的正确选择,但它当前的运行时和 Parakeet 都有同样的限制:每个模型对象只能有一个流,所以双轨意味着两个模型。使用 199 MB 的 Q8 GGUF(可 mmap,Metal 或 CPU),这大约是 0.4 GB,与今天相同,且省去 ORT 及其“每个转录器一个流式状态”的问题——在 Hex 的测量中,该问题使每次运行丢失 553 至 631 个数据包。Parakeet 双模型约 1.5 GB,而滚动 Parakeet 本来就会在一个 chunk 内替换草稿。Apple SpeechTranscriber(Hex 测得双轨约占一个核的 2%,分段结束后 final 结果 p50 约 2.3 秒,在合成通话上 WER 3.0%,对比 Moonshine 的 1.7%)便宜一个数量级,且不需要模型内存。

(b) 常驻语音命令。 普通 resolver 命令只从已完成的行运行(AGENTS 不变量),因此部分假设延迟只对语音定界例外情况有影响。候选方案:

  • Moonshine small GGUF 配合 VAD 行分段器:199 MB,CPU 或 Metal,LibriSpeech clean 2.54%(模型卡),与 ONNX 构建大致相同。
  • parakeet-tdt_ctc-110m 离线处理 VAD 切分的语音片段:135 MB Q8,LibriSpeech clean 2.43%,英语,CC-BY-4.0。一秒命令的离线解码只需几十毫秒,因此成本在于端点挂尾,而不是模型。此处尚未测试。
  • 常驻 Nemotron 或 Unified:需要专用 0.7 GB 模型、GPU 上的 12 Hz(80 ms 块)唤醒循环,并且在这些延迟下没有精度增益。只有当 Kit 希望实时草稿中带有听写级标点时,才值得这么做。

Moonshine 相对于 transcribe.cpp 路线的一个结构性优势是:moonshine-voice 自带 VAD 和行事件。transcribe.cpp 的 Moonshine 流返回已提交/暂定文本,单个流上限 81.9 秒,且没有行分段;Hex 会用 Silero VAD v6.2(transcribe.cpp 内置)或 transcription/pause_segmenter 来驱动它,并为每一行启动一个新流。

2. 现状(截至 2026-10-22)

有两个排行榜正在使用,且不能跨榜比较:

  • Eight-set average(较旧;NVIDIA 和 Moonshine 基于它报告)。
  • Current Open ASR Leaderboard(结果提交截至 2026-10-19):九个公开集合,包括 Voice Arena Monsoon 和 URGENT24 嘈杂/混响语音。同一模型在该榜上的分数高于 eight-set average。Moonshine、Parakeet Unified 和 Kyutai 不在当前结果文件中。

当前排行榜 english_short_latest.csv(数据集 hf-audio/open-asr-leaderboard-results,提交 2026-10-19),仅含开放模型。RTFx 是在 A100 上测得的,不能说明 Mac 上的表现:

model                           params  avg WER  RTFx   license     GGUF / transcribe.cpp
Granite Speech 5.0 2B           2.3B    5.06     545    Apache-2.0  not yet (4.0/4.1 and 5.0 TurboCTC only)
Qwen3-ASR 1.7B                  2.0B    5.75     836    Apache-2.0  yes (qwen3-asr-1.7b)
Cohere Transcribe 03-2026       2B      6.26     924    Apache-2.0  yes (already in Hex)
Canary-Qwen 2.5B                2.5B    6.37     882    CC-BY-4.0   yes
Parakeet TDT 0.6B v2            0.6B    6.43     6148   CC-BY-4.0   yes (already in Hex)
Parakeet TDT 0.6B v3            0.6B    6.51     6228   CC-BY-4.0   yes (already in Hex)
Qwen3-ASR 0.6B                  0.8B    6.60     750    Apache-2.0  yes (already in Hex)
Granite 5.0 TurboCTC (new rev)  0.47B   6.84     21134  Apache-2.0  old English-only rev only
Nemotron Speech Streaming EN    0.62B   6.89     1114   NVIDIA OML  yes
Distil-Whisper large-v3.5       0.8B    7.02     898    MIT         not in the model list
Whisper large-v3-turbo          0.8B    8.39     811    MIT         yes (already in Hex)
Voxtral Mini 4B Realtime        4B      9.01     103    Apache-2.0  yes, 4.7 GB Q8, 6-7x realtime on M4 Max
Nemotron 3.5 ASR Streaming      0.64B   10.51    1348   OpenMDW-1.1 yes (multilingual; English worse)

具备流式能力且体量小,以及 Hex 将如何运行每种:

Moonshine v2 Streaming tiny/small/med  MIT; 44M/140M/266M (GGUF params); English only
│   streaming yes (50 Hz frontend, 80 ms feed); 8-set WER 12.01/7.84/6.65; LS clean Q8 4.52/2.54/2.16
│   GGUF Q8 50/199/296 MB in transcribe.cpp. No multilingual in this family; other-language Moonshine is non-streaming
├── Parakeet Unified EN 0.6B   NVIDIA OML; buffered streaming, 160 ms to 2.08 s; Hex default; 731 MB Q8
├── Nemotron Speech Streaming EN 0.6B   NVIDIA OML; cache-aware, 80 ms to 1.12 s; 730 MB Q8
│   LibriSpeech clean streaming = offline = 2.31% Q8 (byte-equal to NeMo at R=13); supported by 0.2.4
├── Nemotron 3.5 ASR Streaming 0.6B   OpenMDW-1.1; 32 supported locales, prompt-conditioned; 751 MB Q8
│   LS clean 3.05% (vs 2.31 EN-only); English regressed on the current leaderboard (10.51 vs 6.89)
├── Multitalker Parakeet Streaming 0.6B   NVIDIA OML; Nemotron fine-tune with an embedded Sortformer diarizer
│   (up to 4 speakers); the only local route to "who said it" in a stream; unmeasured by Hex
├── Voxtral Mini 4B Realtime   Apache-2.0; 480 ms default delay; auto language detection; too heavy (4.7 GB, 6-7x realtime)
├── Kyutai STT 2.6B EN / 1B EN-FR   CC-BY-4.0; 2.5 s / 0.5 s delay; PyTorch/MLX, no GGUF
│   old 8-set avg 6.4; 2.6B is too large for an always-on slot
├── Apple SpeechAnalyzer / SpeechTranscriber   system model, macOS 26+, no download; Hex already ships
│   it as a batch model. Independent tests: 2.12% clean / 4.56% other (M2 Pro, 5,559 LibriSpeech
│   utterances, Lyonesse, July 2026), 1.98% on a 40-clip snapshot (IraVoice, M5 Max, p50 about 130 ms
│   post-speech). Parakeet v2 CoreML int8 2.01 / 3.40 in the same Lyonesse round
└── Granite Speech 5.0 TurboCTC   Apache-2.0; offline only despite the "streaming-style" encoder;
    21k RTFx on A100; the Oct 21 revision adds PnC and 7 languages but is not in transcribe.cpp yet

离线准确率档位(仅供参考,非流式):Granite Speech 5.0 2B 在当前排行榜上位列开源第 2 名(5.06,发布于 2026-10-20,Apache-2.0,支持翻译和 2,000 词关键词偏置,6 种语言);Qwen3-ASR 1.7B 为 5.75(52 种语言);parakeet-ultra(Moondream 对 v3 后训练得到的版本,CC-BY-4.0,25 种语言)在 transcribe.cpp 的 LibriSpeech clean 上列出 1.80%,对比 v3 的 1.94%,并且根据 HF 数据集条目,在更早的排行榜平均分上为 5.32 对比 6.32。TheWhisper large-v3-turbo(TheStage,CC-BY-4.0)在当前排行榜上为 6.07,带有 CoreML 和流式标签,但不提供 GGUF。

3. 目录新增项(按优先级排序)

Hex 当前的目录(transcription_models.rs)包括:Parakeet Unified EN、v2、v3、Whisper large-v3-turbo、Qwen3-ASR 0.6B、SenseVoice Small、Cohere Transcribe、Apple Speech。Moonshine 是目录之外的一条独立 ONNX 路径。

1. Moonshine Streaming small (and medium as an option), GGUF    // replaces the ONNX Moonshine
│   Gain: removes ORT, moonshine-voice (header 20000 now, 30000 breaking), the download.moonshine.ai
│   host and its failure mode; one runtime, one downloader, Metal or CPU; weights 199 MB vs ~250 MB;
│   same accuracy (card LS clean 2.54% vs Useful Sensors' 2.49%); medium is 6.65 avg for 296 MB.
│   Cost: medium. Rewrite the thin layer behind moonshine.rs: VAD line segmentation (Silero VAD is in
│   transcribe.cpp), a stream per line (81.9 s cap), committed vs tentative text to LineStarted/
│   Updated/Completed, one Model per meeting track and one for commands.
│   Needs no crate bump (0.2.4 has moonshine_streaming). Gate: replay Hex's command fixtures
│   (moonshine_lab) and the meeting_echo_replay call against both backends before deleting ONNX.
│
2. parakeet-ultra (GGUF, offline)                                // replaces Parakeet v3
│   Gain: same size and API as v3 (740 MB Q8), lower error on English and every FLEURS language,
│   cuts long audio at pauses by itself (30 s segments), which suits meeting chunks.
│   Cost: low. Catalog entry plus a crate bump: the port is pinned 2026-10-04, newer than 0.2.4
│   (2026-09-25); 0.4.1 is current (2026-10-22). Q8_0 (740 MB, 1.80%) and smaller quants are published.
│
3. Nemotron Speech Streaming EN 0.6B (GGUF, cache-aware)         // new "Live" tier, not a dictation default
│   Gain: streaming WER equals offline (2.31% LS clean), 80 to 1120 ms chunks, constant memory, no 5.6 s
│   recompute, native PnC. Right choice if the live meeting draft should read like final text, or if
│   Kit wants always-on streaming with a Parakeet-family model.
│   Cost: medium. transcription/gguf_session.rs only sets the buffered Parakeet extension; Nemotron needs
│   StreamExtension::ParakeetStream{att_context_right}. Runs in 0.2.4. License is the NVIDIA Open
│   Model License. Do not make it the dictation default: Unified is more accurate offline (5.91 vs 6.92).
│
4. Granite Speech 5.0 2B and TurboCTC                            // wait for the port
│   2B is the accuracy leader (5.06) but needs a 2B LLM decoder; TurboCTC is the fastest and Apache but
│   its revised multilingual/PnC weights are not in transcribe.cpp (README lists the August revision).
│
5. Qwen3-ASR 1.7B                                                // quality tier for final meeting passes
│   5.75 current, 52 languages, Apache-2.0, already in transcribe.cpp. 2B-class decode cost, so
│   final-pass only. Hex already carries the 0.6B.
│
Not recommended: Voxtral Realtime (4.7 GB, 6-7x realtime, 9.01 avg), Nemotron 3.5 for English
(10.51 current vs 6.89), Kyutai (no GGUF, 2.6B), Moonshine tiny (12.01 avg).

只有在会议草稿场景下,才可能完全弃用 Moonshine:在 macOS 26+ 上使用 Apple SpeechTranscriber,其他场景使用 Nemotron 或什么都不用。对于命令场景,仍保留一个小型流式或 VAD 端点检测模型;Moonshine small 是已发布流式移植版中体积最小、且达到命令级 WER 的模型。

后续测量

  • 在 moonshine_lab 固定测试集上对比 GGUF Moonshine small 与 ONNX 构建:漏检率、更新 p50/p95、CPU、常驻内存(M5 Max 和一款基础 M 系列芯片)。
  • 在同一进程内加载第二个相同 Parakeet GGUF 的 Model:在 Metal 上使用 mmap 时的真实常驻内存增量。
  • 在 Hex 的通话回放上,以 160 和 560 ms 的 Nemotron EN 对比 Unified(5.6/0.56/0.56):字幕延迟、每分钟音频的 CPU/GPU 时间、powermetrics 能耗。
  • transcribe.cpp 的 HEAD 是否已解除“每模型一次计算”的限制(关注 docs/bindings.md 和 0.4.x 的说明)。

参考来源

  • Moonshine v2 论文(Kudlur 等人,2026-02-12),arXiv 2602.12241:表 2 和表 3,编码器窗口 (16,4)/(16,0),80 ms 前瞻。
  • UsefulSensors/moonshine-streaming-small 模型卡(MIT);moonshine-ai/moonshine 发布版本(v0.1.5,2026-08-24)。
  • transcribe.cpp(MIT)docs/models/:moonshine-streaming*.md、parakeet.md、parakeet-unified-en-0.6b.md、parakeet-ultra.md、nemotron-speech-streaming-en-0.6b.md、nemotron-3.5-asr-streaming-0.6b.md、voxtral-realtime.md、granite-speech-5.0-turboctc.md、bindings.md;include/transcribe.h;Hex 固定的 transcribe-cpp/-sys 0.2.4 源码(session.rs、lib.rs、family.rs、arch/)。crates.io:0.2.4 发布于 2026-09-25,0.4.1 发布于 2026-10-22。
  • nvidia/parakeet-unified-en-0.6b(2026-04-07)和 nvidia/nemotron-speech-streaming-en-0.6b(2026-03-13)模型卡;arXiv 2604.19079 和 2312.17279。
  • Open ASR Leaderboard 结果文件 english_short_latest.csv 及其提交日志(2026-10-19),arXiv 2510.06961;IBM Granite Speech 5.0 博客(2026-10-21)。
  • kyutai/stt-2.6b-en 模型卡;Mistral Voxtral Mini 4B Realtime 见上方 transcribe.cpp 模型卡。
  • Apple 设备端对比来自第三方且出自利益相关发布方:Lyonesse(2026-07-13/15)、IraVoice mac-asr-benchmark(2026-08-01)、Mumr 会议基准(2026-09-30)。Hex 自身的测量:docs/features/meetings.md 和 docs/plans/meeting-live-transcription.md。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 hex19/hex