Aoedeの高音質の声はKokoro、小さなオープンソースのニューラル音声合成モデルです。最初の統合では、FluidAudioのCoreMLとApple Neural Engineのパイプラインで動かしていました。これは自然な選択で、たいていのMacで動きます。
ところが自分のMacでは動きませんでした。このApple M5では、FluidAudioのKokoroチェーンが、試したすべての計算ユニットでクラッシュしたのです。GPUではMetalの「JIT not supported」エラー、CPUとANEでは低レベルのBNNSセグフォルト。同じライブラリが古いApple siliconでは問題なく動くので、これは新しいハードウェアが依存ライブラリを追い越した格好でした。古いFluidAudioを使った自分の別アプリは今も喋れたので、モデルは無事でランタイムが問題だとわかりました。
そこでKokoroを別のランタイムに移しました。CoreMLの代わりにAppleのMLXフレームワークでモデルを動かす、MLX移植版です。こちらはこちらで面倒もありました。MLXのMetalシェーダーは素のswift buildではコンパイルできず、本物のXcodeビルドが必要なので、プロバイダはアプリのターゲットに置かねばならず、Metal Toolchainのインストールも要ります。でも、これはM5で動きます。そしてトークンごとのタイムスタンプを露出します。結果はシンプルでした。Kokoroが動き、声はより良く聞こえ、カラオケのハイライトを推定ではなく正確にする、単語レベルのタイムスタンプが手に入ったのです。ハードウェアの事情が変わったときのために、FluidAudioの作業はブランチに残しておきました。
この乗り換えが、次のアップデートのデバッグの夜の下地にもなりました。ランタイムの移行はクラッシュを解決し、そしてもっと微妙な問題をひそかに持ち込んだのです。