インターフェースを日本語化してから少しして、Aoedeが日本語を読み上げるようになりました。日本語の本を開くと言語を検出し、日本語のKokoro音声を選び、英語と同じ同期ハイライトで読み上げます。設定には、検出が外れたときのための「読み上げ言語」ピッカー(自動/英語/日本語)もあり、選んだ音声は言語ごとに記憶されます。
おもしろかったのは、日本語には単語の間に空白がないことでした。リーダーのハイライト用トークナイザーは空白で区切っていたので、日本語の文がまるごとひとつの巨大な「単語」として入ってきます。行からあふれ、ハイライトが単語ごとに動かず、文全体を覆ってしまいました。直し方は、日本語を音声側のG2Pと同じCFStringTokenizerでトークン化すること。こうすると画面上の単語境界が、ハイライトが追う単語ごとのタイミングとぴったり一致します。日本語の段落は単語間の空白なしでレイアウトするので、文字が自然につながりつつ、行ごとに折り返します。
画面上で単語の境界を合わせるのは、問題の半分にすぎません。もう半分は発音で、ここではひとつの制約がすべてを決めました。AoedeはすべてをAppleのフレームワークだけで動かしていて、GPLの依存はありません。おかげで定番のオープンソース発音エンジンは使えませんが、アプリは安心して配布できます。そしてこの選択にはコストがあり、いまそれを払っているところです。現在の読みは辞書の最初の候補なので、「私」が「わたし」ではなく「わたくし」と読まれ、ピッチアクセントもありません。日本語ではこれは箸と橋を分けるものです。いまはOpenJTalk(GPLではなくBSDライセンス)を使った二段目の処理に取り組んでいて、正確な読みと本物のピッチを目指しています。とはいえ今の時点でも、一日前にはまったくできなかった日本語の読み上げが、実際に聴けるくらいにはなっています。