espeakで発音できるようにプログラムを作ってみました。日本語のスクリーンリーダーや、日本語の音声合成ソフトでは当たり前の機能ですが、いざ作ってみるといろいろ面倒でした。作っている間ずっと考えていたのは、こういうのは一人のプログラマが個人的に読み方を決めてはいけないなということです。日本語を普段使っている人なら違和感のある表現もいろいろくみ取って理解してもらえますが、それに期待して手抜きしたものが、日本語学習者にそれが本来の形だと思い込まれても困ります。音声ガイドという性質上、一般的な日本人の日本語よりも、アナウンサーの日本語を手本にすべきだと考えました。面白かったので、実験的にいろいろなことをしています。具体的には次の読みをできるようにしてみました。・数字と助数詞によって起きる発音の変化は『NHKことばのハンドブック』の第5章の表を手本とする。・算用数字の直後の英字の列は単位でないかを確認し、そうならばカタカナ表記に置き換えて読む。・コロンで区切った2桁:2桁:2桁の数値は時刻とする。・スラッシュで区切った4桁/2桁/2桁の数値は日付とする。ハイフンで区切られた同様の日付は直後に時刻があるときだけ日付とする。これに関連して、括弧で囲まれた曜日を表す1文字の漢字を常に曜日として読み上げる。分かるものはハイフンを「ノ」と読む。・コンマによる桁区切りは3桁だけでなく4桁区切りにも対応する。・位を表す漢字と位取りの数字の組み合わせの読みは、万の位以上や小数の算用数字にも対応する。算用数字と組み合わせる位の漢字は万進数に限らず、百万や千などの位に対応する。このとき本来の値で読み替える。・整数の左側、小数部分の右側にある桁埋めの「0」は読み上げない。・16進数と2進数の接頭語として0xと0bを認識し、ついでに読み終わった後に十進数での値も読み上げる。・URLに現れるパーセントエンコードは16進数数字として読み上げず、デコードして文字として読み上げる。eSpeakの方ですが、jaの作り方は分かりましたが、他にもファイルをインストールしないといけなくなるので、今回もen_dictの置き換えだけにします。前回は、音声表記をローマ字に変えた方が細かな発音指定ができるんじゃないかなと考えていまいしたが、結局カタカナの方が都合がいいことに気がつきました。漢字仮名交じり文からカタカナにするだけでも情報をたくさんそぎ落としてしまっているのに、これをアルファベットにしたら、文中の英単語と日本語との区別ができなくなってしまいます。意外にこの区別は便利です。いうわけで、今回もカタカナで作っています。ほんの少し、「ンム」を[m]、「ング」を[ng]を表すように変えてみました。日本語の中の無声音化は、eSpeak側で記述するルールで対応できるかもしれませんが、まだ理解できていないので今回はやっていません。アーカイブに入れてあるkatakanize.pyは動作の確認ができるように、標準入力の1行をespeakで解釈できる形式で出力するようにしています。次のコマンドでキーボードからの入力を読み上げてくれます。以前はちょっと書き換えれば、python2で動くようにしていましたが、python3のみで動きます。katakanize.py|espeakまた、test.txtにutf-8の文字コードで日本語を1行書いておくと、次のコマンドでwavファイルを作ります。-wtest.wavダウンロード:orca-3.10.1-espeak-jp_003.zip更新履歴コンマの区切りが思ったようになっていなかったので修正しました。2013/12/13テスト用のコードを入れたままにしていたので修正しました。|この記事へのコメント参考にさせていただいてます。こちらではJavaScriptだけで日本語読み上げを作ってみました。http://logue.github.io/espeak-japanese/漢字の読みは日本語形態素器にかければいいとして、数字の読みはやっぱり力づくでコーディングするしかなさそうですね。09:11Logueさん、コメントありがとうございます。JavaScriptを使ってここまでできるんですね。(06/28)OpenJTalkの共有ライブラリを作ってみました。追加しました(03/14)点字タイプ入力ソフトに、テンキー点字入力機能を追加しました(11/13)OpenJTalkの共有ライブラリを作ってみました。2.0QRコードSeesaaブログ。