AoedeのEnglish音声にはクセがありました。「read」を現在形では正しく、過去形では間違って読むのです。「I read it yesterday」は毎回「I reed it yesterday」になっていました。同じバグが「reread」と「wound」(windの過去形)にも出ていて、wound は包帯を巻く方の「傷」のように読まれていました。
直す材料の大半はすでに揃っていました。ローカルの音声は、この手の「綴りは同じで読みが違う単語(ヘテロニム)」に対して定石どおりのことをやっています。品詞をタグ付けして、そのタグをキーにした辞書から読みを引く、というものです。過去形の「read」の正しいエントリも、過去形のキーの下にちゃんと入っていました。それが見つからなかった原因は二つあります。ひとつは、辞書を引く前に細かい動詞の時制タグをただの「動詞」に潰していたこと。「read」には「動詞」のエントリが無いので、いつもデフォルトの「reed」に落ちていました。もうひとつは、Pythonのモデルの代わりに使っているAppleのオンデバイスのタガーが、そもそも時制を返さないこと。「read」は過去形も現在形も綴りが同じなので、単語そのものには時制を復元する手がかりがありません。
そこで、合成の前に周りの単語から時制を読むようにしました。前に「have」「has」「had」があれば過去分詞なので「red」(「I have read it」)、「to」や「will」のような助動詞があれば原形なので「reed」(「I will read it」)、動詞の近くに「yesterday」のような時間の手がかりがあれば、それだけで「red」に寄せます。手がかりが無ければ、より安全でよくある「reed」のままにします。オンデバイスで動く決定論的なルールがいくつか、モデルは無し。リサーチでも、ここはこれが正解だと出ていました。ニューラルな手法は本当に難しいケース、たとえば綴りも品詞も同じ「bass」(魚 vs 楽器)のようなペアのためにあって、この種の文脈による判別は upstream でもまだ未対応の TODO のままです。そうした難しいケースはAoedeでもまだ間違っていて、時間の手がかりが無い「she read her book」も「reed」のままです。それでも、これまで文ごとに引っかかっていた日常的な過去形は、ちゃんと読まれるようになりました。