transcribe.cpp:一个 ggml 运行时跑完 16 个语音转文字模型家族

本地语音转文字的开发者,长期以来面对一个尴尬的现实:能用的推理栈屈指可数。OpenAI 的 Whisper 有官方 Python 实现和社区维护的 whisper.cpp,NVIDIA 的 Parakeet 和 Canary 必须跑在笨重的 NeMo PyTorch 框架上,想上 GPU 加速还要自己折腾 ONNX 转换。每换一个模型家族,就要重写一遍部署管线。

transcribe.cpp:一个 ggml 运行时跑完 16 个语音转文字模型家族

2026 年 7 月登上 Hacker News 首页头条(528 分、109 条讨论)的 transcribe.cpp 试图终结这种碎片化。它是一个基于 ggml 运行时的 C/C++ 语音转文字推理库,用一个统一接口跑 16 个模型家族、60 多个模型变体,覆盖 Metal、Vulkan、CUDA 三大 GPU 后端,外加 tinyBLAS 加速的 CPU 路径。项目由跨平台听写应用 Handy 的维护者 Sebastien Jones 发起,代码托管在 handy-computer/transcribe.cpp,MIT 协议开源。

它解决的核心痛点

transcribe.cpp 的作者在项目说明里直白地描述了现状:"用现在的 ASR 推理栈分发一个跨平台应用,体验非常糟糕。你基本上只有 whisper.cpp 和 ONNX 两个选择。" 这两个选择各有硬伤:whisper.cpp 只支持 Whisper 家族,Parakeet、Canary、Voxtral 这些后起之秀一律不沾;ONNX 路径虽然能覆盖更多模型,但只能跑 CPU,GPU 加速能力几乎为零,大量性能被浪费在桌面上。

对于需要把语音转文字能力嵌入桌面或移动应用的开发者,这意味着要在"支持的模型少"和"跑得慢"之间反复权衡。如果选择 MLX 在 Apple 设备上加速,又得维护两套引擎、做两次模型移植。市面上零星存在一些声称支持多模型的库,但作者指出它们大多出自不明作者之手,没有公开测试数据,无法判断推理结果是否可信,更无法判断项目能活多久。

transcribe.cpp 给出的答案是:一个有维护者背书、每个模型都经过数值验证和 WER 测试、可在三大平台 GPU 上加速、提供四种语言官方绑定的推理库。它本质上把 ggml 在 LLM 领域验证过的"一个运行时跑所有模型"的思路,搬到了 ASR 场景。

16 个模型家族,60+ 变体

transcribe.cpp 当前的模型覆盖范围远超同类项目。以下是它支持的模型家族清单:

家族变体数代表模型定位
Parakeet10TDT/RNN-T/CTC,110M–1.1B高吞吐英文,NVIDIA 开源旗舰
Canary4canary-1b-flash 等翻译 + 转写
Canary-Qwen1canary-qwen-2.5bFastConformer + Qwen3 LLM 解码
Whisper12tiny 至 large-v3-turbo多语种经典
GigaAM4v3 e2e-rnnt/ctc俄语专用
Moonshine2tiny/base边缘设备轻量
Moonshine Streaming3tiny/small/medium流式轻量
Qwen3-ASR20.6B/1.7B通义系
Cohere Transcribe103-2026Cohere 首款 ASR
SenseVoice1small阿里轻量多语种
FunASR Nano2nano-2512/mlt-nano阿里下一代
Nemotron Streaming2en-0.6b / 3.5 多语种流式实时
Voxtral2mini-3b / small-24bMistral 音频 LLM
Voxtral Realtime1mini-4b-realtime流式音频 LLM
Granite Speech44.0-1b / 4.1-2bIBM 企业级
MedASR1medasr医学听写专用
MOSS Transcribe-Diarize1moss-transcribe中英 + 说话人分离

这份清单几乎囊括了 2026 年所有主流开源 ASR 模型。对开发者而言,这意味着不需要再为"Parakeet 跑在 NeMo、Whisper 跑在 whisper.cpp、Voxtral 跑在 transformers"这种割裂状态写胶水代码——同一个 transcribe-cli 二进制就能跑全部。

Parakeet 家族的 WER 实测

transcribe.cpp 最值得关注的工程实践,是它对每个模型都做了数值验证 + WER 全量测试。以 NVIDIA Parakeet 家族为例,以下是 transcribe.cpp 自己的 WER 管线在 LibriSpeech test-clean 上测出的结果(Q8_0 量化):

变体解码器参数量Q8_0 大小WER语言
parakeet-tdt-1.1bTDT1.1B1.27 GB1.38%英语
parakeet-rnnt-1.1bRNN-T1.1B1.27 GB1.46%英语
parakeet-unified-en-0.6bRNN-T0.6B731 MB1.60%英语
parakeet-rnnt-0.6bRNN-T0.6B730 MB1.62%英语
parakeet-tdt-0.6b-v2TDT0.6B730 MB1.69%英语
parakeet-tdt-0.6b-v3TDT0.6B740 MB1.94%25 欧洲语
parakeet-ctc-1.1bCTC1.1B1.26 GB1.85%英语
parakeet-ctc-0.6bCTC0.6B722 MB1.87%英语
parakeet-tdt_ctc-1.1bTDT+CTC1.1B1.27 GB1.87%英语
parakeet-tdt_ctc-110mTDT+CTC110M135 MB2.43%英语

从这组数据能看到几个结构性规律:

TDT 解码器的帧跳跃优势。 Parakeet 家族有三种解码器:TDT(带时长预测头的 transducer)、经典 RNN-T、CTC。TDT 的时长预测头让解码器可以跳过静音帧,因此同参数量下 TDT 的解码速度比 RNN-T 快,WER 也更低(1.1B 下 TDT 1.38% vs RNN-T 1.46%)。0.6B 档位上 RNN-T 反而略优于 TDT(1.62% vs 1.69%),但 TDT 的速度优势仍然成立。

CTC 的速度-精度权衡。 CTC 是单遍贪婪对齐,没有 transducer 的搜索循环,解码最快,但要付出约 0.2 个百分点的 WER 代价。对延迟敏感的流式场景,CTC 是合理选择。

110M 变体的边缘部署价值。 parakeet-tdt_ctc-110m 在 Q8_0 下只有 135 MB,WER 2.43%,是 Parakeet 家族最小的成员。它同时携带 TDT 和 CTC 两个解码头,运行时可按需切换——需要速度走 CTC,需要精度走 TDT。

跨平台 GPU 加速

transcribe.cpp 的加速后端覆盖了主流硬件:

  • Metal(Apple Silicon,自动启用)
  • Vulkan(Linux/Windows,需 libvulkan-dev
  • CUDA(NVIDIA GPU,需 CUDA toolkit)
  • tinyBLAS(Justine Tunney 的 llamafile_sgemm 内核,默认开启,CPU 加速)

以 Parakeet 110M 模型为例,在 Apple Silicon GPU 上编码 10 秒音频的推理耗时约 27 毫秒,比同模型在 CPU 上快 96 倍。这个数字来自 modelslab 的对比测试,测量的是编码器前向推理,不含解码和后处理。

更宏观的对比来自 Open ASR Leaderboard 的公开数据。在 RTFx(实时倍率,越高越快)维度上,Parakeet-TDT-0.6B-v3 的吞吐量是 3332 倍实时,而 Whisper large-v3 只有 68 倍——也就是说,同样硬件上 Parakeet 的处理速度是 Whisper 的近 50 倍。这种差距的根源在于架构:Parakeet 的 FastConformer 编码器 + TDT 解码器在序列建模上比 Whisper 的 Encoder-Decoder + cross-attention 更高效。

libopenblas 是可选依赖,但作者强烈推荐安装——它能将宿主侧解码器加速 10-15 倍。不装的话构建会自动回退到标量路径。

WER 验证方法论

transcribe.cpp 区别于其他多模型 ASR 库的关键,是它把"每个模型的推理结果是否可信"当作工程问题来对待。作者在项目说明里点出了 ONNX 生态的信任危机:"Hugging Face 上的 .onnx 模型给我带来了巨大的不确定性,你无法判断它的推理是否准确。"

为消除这种不确定性,transcribe.cpp 对每个发布的模型执行两层验证:

  1. 数值验证:将 transcribe.cpp 的输出与参考实现(NVIDIA NeMo 或 Hugging Face transformers)逐张量比对,确保推理数值一致。
  2. WER 全量测试:对每个模型跑数千条语料的完整 WER 扫描,确认输出与参考实现一致或极度接近。测试结果发布在 GitHub 仓库和 Hugging Face 模型卡片上。

这套验证由 Modal 提供 GPU 算力支持,Blacksmith 提供 CI runner。Mozilla AI 的 BiR 项目在早期资助了这个方向的研究。对于生产环境的使用者,这意味着从 transcribe.cpp 拿到的转录文本,和从官方参考实现拿到的文本,在统计意义上没有差异。

用法与绑定

核心用法极简。构建后一行命令即可转录:

bash
build/bin/transcribe-cli \
  -m models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-Q8_0.gguf \
  samples/jfk.wav

输入要求是 16 kHz 单声道 WAV,其他格式用 ffmpeg 转换:

bash
ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav

官方绑定覆盖四种语言,由维护者同步更新:

语言路径
Pythonbindings/python
TypeScript / JavaScriptbindings/typescript
Rustbindings/rust/transcribe-cpp
Swift / ObjCbindings/swift

对于想从 whisper.cpp 迁移的项目,transcribe.cpp 设计为"基本可平替"——API 接口对齐,GGUF 模型格式一致,构建方式相同。差异在于 transcribe.cpp 的模型覆盖范围远大于 whisper.cpp(后者只支持 Whisper 家族)。

量化与模型分发

transcribe.cpp 沿用 llama.cpp 的量化体系。所有预构建 GGUF 模型托管在 Hugging Face 的 handy-computer 组织下,支持的量化预设包括:

  • F16(半精度浮点)
  • Q8_0(8 位整数量化,WER 损失最小)
  • Q6_KQ5_K_MQ4_K_M(K-量化,体积递减)

量化工具 transcribe-quantize 可从参考 GGUF 生成更小的模型:

bash
build/bin/transcribe-quantize \
  models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-F32.gguf \
  models/parakeet-tdt-0.6b-v2/parakeet-tdt-0.6b-v2-Q4_K_M.gguf \
  --quant Q4_K_M

需要从源 checkpoint 转换时,转换器直接从 NVIDIA NeMo 的 .nemo 文件加载,无需手动导出中间格式:

bash
uv run --project scripts/envs/parakeet \
  scripts/convert-parakeet.py nvidia/parakeet-tdt-0.6b-v2

这条命令会写出 parakeet-tdt-0.6b-v2-F32.gguf,遵循 llama.cpp 风格的 <slug>-<QUANT>.gguf 命名约定。

与 whisper.cpp 和 ONNX 的定位差异

把 transcribe.cpp 放回 ASR 推理生态里看,三条路径的取舍很清晰:

维度whisper.cppONNX Runtimetranscribe.cpp
模型覆盖仅 Whisper 家族广(需手动转 ONNX)16 家族 60+ 变体
GPU 加速Metal/CUDA/Vulkan主要 CPUMetal/Vulkan/CUDA + tinyBLAS
推理可信度高(官方维护)低(ONNX 来源杂)高(数值验证 + WER 测试)
嵌入难度低(4 语言官方绑定)
流式支持取决于模型

whisper.cpp 仍然是只跑 Whisper 的可靠选择。ONNX 适合需要极致 CPU 覆盖但不在乎 GPU 加速的场景。transcribe.cpp 填补的是中间地带:需要跨多个模型家族、需要 GPU 加速、需要可验证的推理准确度。这个地带恰好是桌面听写应用、实时字幕工具、会议转写产品的刚需。

项目状态与社区反馈

transcribe.cpp 于 2026 年 4 月创建,目前 594 star、15 fork。作者明确标注这是 v0.1.0 版本,"还有一些我一个人发现不了的粗糙边缘",呼吁社区反馈 bug。项目得到了 Mozilla AI(BiR 项目)、Hugging Face(模型存储)、Modal(GPU 算力)、Blacksmith(CI runner)四家组织的赞助支持。

Hacker News 讨论区里,开发者们关注的几个方向颇有代表性。有人提出能否支持 IPA(国际音标)音素级转写,用于少数民族语言的语音记录——这类语言语料太少,永远不会有专门训练的模型,但音素级转写对语言学研究有价值。有人关心连续听写的低延迟工作流:打开文档开始说话,文字实时出现在光标处,而不是等录音结束再批量转写。还有人问能否转写视频音频(而非麦克风输入),用于语言学习场景。

这些需求反映出一个事实:ASR 的工程化需求远比"模型够准"复杂。延迟、连续性、多模型切换、跨平台分发,每一项都是产品化的硬门槛。transcribe.cpp 把推理这一层做扎实了,上层的应用创新才有地基。

对于正在评估本地 ASR 方案的开发者,transcribe.cpp 值得纳入选型清单的理由很具体:一个二进制跑 16 个模型家族,三大 GPU 后端全覆盖,每个模型的 WER 都有公开测试数据可查,MIT 协议无商用限制。在 ASR 模型百花齐放的 2026 年,这种统一推理层的需求一直存在,现在有了第一个像样的开源实现。


项目地址github.com/handy-computer/transcribe.cpp 模型仓库huggingface.co/handy-computer 作者应用Handy 听写

推荐阅读