為十倍速执著

這是一篇早期本地 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 開發歷程