eSpeakと日本語
2011/08/24 追記: ここに書いてあることは多分にデタラメを含んでいるから、本当にeSpeakで日本語に対応させたかったら別のちゃんとした文書をあたったほうがよい。
eSpeakはオープンソースのスピーチシンセサイザー。フォルマント合成で音声合成を実現している。
英語をはじめ、ヒンディー語やスワヒリ語、中国語など数多くの言語に対応しているが、未だ日本語には対応していない。
既にある言語を元に少しデータを加えれば、日本語に対応させることは比較的容易に思われたので、少し試してみた。
導入
eSpeak: Speech Synthesizer
バージョン1.43のソースコードと、espeakeditをダウンロードしてくる。
Ubuntuの場合は、最初から入っているespeakとインストールされるパスが重なるので、気になる場合はMakefile内のPREFIXを /usr/local に変更してインストールすること。espeakeditはビルドしたままで使える。
その後、ホームディレクトリ直下にespeak-dataディレクトリを作り*1、その中にespeakとespeakeditに付属していたdictsourceとphsourceを置く。
音素テーブル
音素テーブルは ~/espeak-data/phsource/phonemes で、ここから各言語用音素テーブルが呼び出されている。日本語の音素テーブルを含めるため、 ~/espeak-data/phsource/phonemes に次のものを追記する。
phonemetable ja base include ph_japanese
日本語用音素テーブル をeSpeak: Phoneme tablesや他のファイルを参考にして作成する。
// ~/espeak-data/phsource/ph_japanese // 抄 phoneme u~ vowel starttype #u endtype #u length 250 FMT(vnasal/u_n) endphoneme phoneme k vls uvl stop lengthmod 2 Vowelin f1=1 f2=1700 0 200 f3=-300 80 f4 Vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30 WAV(ustop/k_unasp_, 75) endphoneme phoneme S; vls pla frc sibilant lengthmod 2 Vowelin f1=0 f2=2700 400 600 f3=300 80 WAV(ufric/sh_pzd2, 20) endphoneme
ルール・単語リスト
ディレクトリ ~/espeak-data/dictsource には発音辞書のソースがある。*_rulesファイルには綴りと音素の関係を記述する。*_listや*_extraには単語の音素やその他のプロパティを記述する。eSpeak: Pronunciation Dictionariesを参考にした。
// ~/espeak-data/dictsource/ja_rules // 抄 .group k k k .group g g Q _) g g .group s s s sy S;
ボイスファイル
~/espeak-data/voices に新しいファイル ja を作り、次の内容を記述する。
// ~/espeak-data/voices/ja name japanese language ja gender male
音素・辞書のコンパイル
espeakeditを起動する。
〈Voice→Select Voice〉から ~/espeak-data/voices/ja を開く。
〈Compile→Compile phoneme data〉で音素データを、〈Compile→Compile dictionary 'ja'〉でルール・単語リストをコンパイルする。
Textタブを開いて、上にテキストを入力する。Translateボタンで綴りから音素に変換した後、Speakボタンで発音させる。*2
課題
- 音素データや音素テーブルが他の言語からの流用なので、日本語の発音とは違っている。日本語の発音に合わせて修正する必要がある。
- アクセントをどうやって記述するか。
- 仮名や漢字に対応させる。
まとめ
まだデータをほとんど書いていないので、ローマ字綴りの日本語をなんとか発音するだけだが、きちんとデータを揃えれば日本語も発音できるようになりそうだ。
2月28日追記
アクセント、イントネーションを変えるにはドキュメントにも書かれていないフラグをいじったり、最悪プログラムを書かないといけないみたいです。ちょっと険しそう。