十倍速への執念

初期のローカル Whisper 試作についての記録です。コンパイラの設定と CoreML を 2 週間詰め、速度を十倍まで押し上げました。

Performance

認めます。私は性能に取り憑かれています。

とはいえ「premature optimization」的な話ではありません。ルールは分かっている。でも Reso の価値は real-time transcription にあります。遅ければ意味がない。

Whisper.cpp を Apple Silicon で初めて動かしたときは興奮しました。動いた! でも指標を見たらこうでした。

実時間の 0.12x。

つまり 8 秒の音声に 66 秒かかる。

それは…リアルタイムではない。

1つ目の突破: CoreML

Whisper は encoder(重い)と decoder(軽め)で構成されます。

CPU を潰すのは encoder。Apple Silicon にはこの種の処理向けに Neural Engine があります。

CoreML コンパイル済み encoder を見つけて組み込むと、結果はこうなりました。
- CPU encoder: 0.12x
- CoreML encoder: 3.2x

改善はした。でも足りない。欲しいのは 10x

2つ目の突破: compiler 最適化

ここからが妙でした。

Whisper.cpp は C++。Swift アプリを Xcode でビルドすると、Swift は強く最適化される一方、C++ 依存は第三者ライブラリ扱いで最適化が弱いことがある。

そこで C++ 側に custom compiler flags を渡せると分かりました。
``bash
-Xcc -O3 # Max optimization level
-Xcc -flto=thin # Link-time optimization
``

LTO (Link-Time Optimization) が効きます。プログラム全体を解析し、ファイル境界を越えて関数をインライン化し、オーバーヘッドを削る。

この flags 追加後の結果:
- Xcode build: 3.2x
- Optimized build: 10.6x

椅子から落ちそうになりました。

知識のコスト

これは分かりやすく文書化されていません。GitHub issues、compiler flags の実験、何十ビルドのプロファイルで辿り着きました。試行錯誤に2週間。

でも結果は大きい。Reso は 話す速度より速く 文字起こしできます。M2 Pro なら 8 秒クリップを 0.75 秒で処理。

なぜ重要か

速度は単なる機能ではなく、ツールの使い方そのものを変えます。

転写が即時なら、速度を意識しなくなる。録音すれば文字が出るだけ。

それは「使っているツール」と「動いていることを忘れるツール」の違いです。

最高のツールは存在感を消します。

これは宣伝ではなく、作りながら実際にはまった落とし穴の記録です。

macOS 版 Reso をダウンロード

Reso 開発ログをもっと読む