为十倍速执着

这是一篇早期本地 Whisper 原型的历史札记:当时我花了两周去调编译器参数和 CoreML,把速度推到十倍。

Performance

我得承认:我对性能有点执着。

不是那种“过早优化”式执着,我知道那条规则。但 Reso 的核心价值就是实时转写。一旦卡顿,它就失去意义。

我第一次把 Whisper.cpp 跑在 Apple Silicon 上时很兴奋。它能跑了!但我一看指标:

0.12x 实时速度。

翻译一下:8 秒音频要 66 秒才能转写完。

这显然不算实时。

第一个突破:CoreML

Whisper 由两部分组成:encoder(重)和 decoder(相对轻)。

真正压垮 CPU 的是 encoder。而 Apple Silicon 正好有 Neural Engine 来干这类事。

我找到了一个 CoreML 编译版的 Whisper encoder,接入并不复杂:
- CPU encoder:0.12x
- CoreML encoder:3.2x

好很多,但还不够。我想要 10x

第二个突破:编译优化

真正离谱的地方在这里。

Whisper.cpp 是 C++ 写的。你在 Xcode 里构建 Swift 应用时,Swift 代码会被激进优化,但 C++ 依赖常常被当作第三方库,优化很有限。

后来我发现可以给 C++ 构建传自定义 compiler flags:
``bash
-Xcc -O3 # Max optimization level
-Xcc -flto=thin # Link-time optimization
``

LTO(Link-Time Optimization) 是关键。它会跨文件分析整个编译结果并内联函数,减少很多额外开销。

加上这些参数后:
- Xcode 默认构建:3.2x
- 优化后构建:10.6x

我当时差点从椅子上站起来。

知识成本

这些信息没有明显文档告诉你。我是靠翻 GitHub issues、试 compiler flags、做几十次 profile 挖出来的。前后折腾了两周。

但结果值得:Reso 的转写已经比你开口说话还快。在 M2 Pro 上,8 秒音频大约 0.75 秒处理完。

为什么重要

速度不只是一个 feature,它会改变你如何使用工具。

当转写几乎即时,你就不再思考“它快不快”。你只负责说,文本自动出现。

这就是“你在使用一个工具”和“你几乎忘记它存在”之间的差别。

最好的工具会消失在体验里。

这不是营销,是我们自己踩过的坑。

下载 macOS 版 Reso

阅读更多 Reso 构建日志