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 秒で処理。
なぜ重要か
速度は単なる機能ではなく、ツールの使い方そのものを変えます。
転写が即時なら、速度を意識しなくなる。録音すれば文字が出るだけ。
それは「使っているツール」と「動いていることを忘れるツール」の違いです。
最高のツールは存在感を消します。
これは宣伝ではなく、作りながら実際にはまった落とし穴の記録です。