Kristopher Baker iOSを土台に · プロダクトシステム · AI支援ワークフロー
← Aoede

shipped · 2026.06.07 · 約2分

AoedeがiPhoneとiPadで動くようになった

アプリを移植しているつもりが、実際には抽出していました。AoedeはiPhoneとiPadでも動くようになりましたが、作業のほとんどはiOSアプリそのものではありません。Aoedeの頭脳の全体、つまりドキュメントモデル、再生コーディネーター、MLXのKokoro音声スタックは、すべてmacOSターゲットの中にあって、共有できる「アプリ」などなく、全部が溶接されたMacアプリがあるだけだったのです。だから最初の一歩は、それらをすべてAoedeFeatureKitというパッケージに引き出し、両方のアプリがそれを使うようにすることでした。その上に乗るiOSアプリは、あえて薄くしてあります。タッチ前提のライブラリ、同じカラオケハイライトと追従スクロールを再利用するコンパクトなリーダー、グラスのトランスポートバー、ロック画面のコントロール、そしてバックグラウンド再生です。

頭脳を共有してみると、コードが「自分はMacの上にいる」と暗黙に決めてかかっていた場所が、ことごとく表に出てきました。MLXは本物のMetal GPUを必要としますが、iOSシミュレータにはそれがないので、起動した瞬間に落ちました。いまはシミュレータ上ではKokoroを非対応として検出し、Appleの音声にフォールバックします。OpenJTalkの辞書は/usr/bin/tarを呼び出して展開していましたが、iOSにtarはないので、端末上の日本語は、クロスプラットフォームの展開処理を書くまで、Apple読みのG2PとCFStringTokenizerのふりがなにフォールバックします。メモリもより厳しくて、iOSではRAMを超過すると、フットプリントが大きくなるだけでなくアプリが殺されます。だからMLXのキャッシュ上限は端末に合わせて変わり(だいたいRAMの24分の1)、6GBに満たないiPhoneでKokoroを選ぶと、やんわり注意が出ます。Appleの音声は、どの端末でも既定のままです。

同じリーダー、同じハイライトが、いまはひとつのコードベースを二つのプラットフォームで共有しています。デスクトップと電話が分かれるのは、ハードウェアがそうさせるところだけです。