TL;DR
SSML で指定するとできる。(それはそう)
背景
中国語では、同じ漢字でも意味が異なると発音が変わることがある。
例えば『論語 学而第一』では "不亦説乎" というフレーズがあり、ここで使われている "説" には意味に応じた発音がある。基本的には「話す」のなどの意味で "shuo1" だが、"不亦説乎" は「なんと説(よろこ)ばしいことであろうか」なので、この意味で使うときには "yue4" と発音される。
Polly は文脈を理解しているわけではないので、ふつうに読ませたときに別の意味の発音で読まれてしまったときには、ピンインを指定する必要がある。
本記事は声調変化をコントロールする話ではない。Polly は声調変化には対応しており、"不亦" を正しく "bu2 yi4" に対応する抑揚で読んでくれた("不" は本来 "bu4")。
方法
SSML(Speech Synthesis Markup Langueage)を使うとできた。Polly における中国語の SSML ドキュメントはこちら。
"不亦説乎" は下記のように設定する。
<speak>
不亦 <phoneme alphabet="x-amazon-pinyin" ph="yue4">説</phoneme>乎。
</speak>
もっとも、SSML は発音をハードコードで指定しているだけなので当たり前で、いってみれば "説" を "ma1" と読ませることもできてしまう。
取り得た別の手段
もっとスマートな方法として、発音辞書を外に持つ方法(lexicon)もあるようだが、そちらは時間内にうまくできなかった。スピーチを SSML で指定する現在の方法で問題が生じたら再検討することにする。このあたりが参考になるかも
その他のスピーチ制御
SSML はいろいろな制御ができるので、たとえば読む速度も制御できる。
論語を読ませるなら x-slow
くらいがちょうどよかった。
<speak>
<prosody rate="x-slow">
不亦 <phoneme alphabet="x-amazon-pinyin" ph="yue4">説</phoneme>乎。
</prosody>
</speak>