Zaurusで日本語音声合成 MBROLA+muDaTTS
このエントリには続編があります。こちらをどうぞ。(実践編)Zaurusで日本語音声合成 MBROLA+muDaTTS
Linux Zaurusで日本語テキスト読み上げをやってみました。
MBROLAは多言語対応の音声合成エンジン、muDaTTSはMBROLAで日本語を発声させるためのマクロを生成するプリプロセッサです。MBROLAとmuDaTTSの組み合わせで、日本語で書かれたテキストを合成音声で読み上げすることができます。
今回Linux Zaurusでの動作を確認しました。
再現性に欠けるインストールメモ
Zaurusで動くMBROLAのバイナリ(ソース配布は無し)は、LINUX / Pocket PC版で、中に以下の三つの実行ファイルが入っていますが、
mbrola-linux-strongarm
mbrola-linux-strongarm2
mbrola-linux-strongarm2-static
最初のものは使えないようでした。
実行ファイルのほかに音素ファイルが必要です。マクロを生成するmuDaTTSは、jp2 (jp2: Japanese Female (5.6Mb) Tomohisa Tachiki)を前提としています。jp1では音声生成時にエラーが出ました。
muDaTTSの動作には、Ruby、KAKASI、Ruby/kakasi拡張モジュール、LinuxDevices拡張モジュール、ChaSen、ipadic、そしてもちろんMBROLA、音素ファイルjp2が必要です。Ruby、KAKASI、ChaSen、ipadic、Ruby/kakasi拡張モジュール(ruby-kakasi)はFocVさんのPrivate Packagesから持ってきました(maruさんruby-kakasiありがとうございます)。
FocVさんのところにあるipadicのパッケージは自分の環境ではipkgからもインストールが失敗したので、手で入れました(あなたのZaurusでは大丈夫かもしれません)。
LinuxDevicesのSoundDSPクラスの定数の案配か、muDaTTSからSoundDSPクラスを経由して音声を出すということはできていませんが、
cat test.txt | ~/muDaTTS.rb > test.pho
などとしてマクロを生成した後(不要な部分を削り)、
./mbrola-linux-strongarm2 jp2/jp2 test.pho test.wav
こんな風に音声ファイルを作り、それを、
cat test.wav >/dev/dsp
とすれば音が出ますが、ピッチが速くなっちゃってこのままだとダメ。soxで変換しつつ/dev/dspに流し込んでやるとうまくいくことは知っているんですが、とりあえず今日はここまで。
(02.15追記)SoXのパッケージ作りました。
「/opt/QtPalmtop/bin/sox」と、「/opt/QtPalmtop/bin/play」が入ります。playはsoxのシェルスクリプトによるWrapperです。
「SoX_12.17.3_arm.ipk.bin」をダウンロード
sox test.wav -t ossdsp /dev/dsp
とやると、MBROLAで作ったwavでも、ピッチがちゃんとした状態で音が出ます。SoXって高機能な音声ファイル加工ソフトで、コーラス、フランジャー、エコー、ローパスフィルタ、バンドパスフィルタ、ハイパスフィルタなどをかけたりが可能です。音版のImageMagickのconvertみたいな感じです。
母艦にてlameで、
for i in *.wav;do lame $i `basename $i .wav`.mp3;done
みたいにして変換したものをアップしておきます。まとめると、
テキスト->ChaSenで形態素解析->KAKASIでローマ字に変換->muDaTTSでMBROLAのマクロ生成
->MBROLAでマクロから音声を合成->/dev/dspで再生
といったフローになります。一言程度でもChaSen->KAKASI->muDaTTSのところで数秒〜10秒ぐらいがかかります。
サンプル音声
抑揚が無い以外は、高品質だと思います。
ココロクのエントリ「MBROLAで日本語音声合成」にコメントが付きました(自虐)
「グ」でエラーが出てしまうので、「ココロク」でやってみました。
僕の脳内は妄想でいっぱいです。
ニュースの音声ティッカーを作ってCronInetで定期巡回させて〜などといろいろ考えてます。
mpfe、Ruby/MPlayerなるものがあったので、TCP/IP経由でメソッドを実行できるようサーバ化すれば、読み上げ時に演奏を止める、といったこともできますなー。(Ruby/QteでQcop受信実行できるpublicなslotって実現できるんですかね?)
“iPod DJ Mixer”「DJ-2.20」でiPodとZaurusの音をミックスしてしまうという手もありますね。
DTalker Mobile Ver3.0 for Windows Mobileなるものがとても気になります。
そのうちドキュメントトーカ開発システム 日本語音声合成エンジン for Windows CEを買ってみたいですね。.NETなら手が届きます。
ところで、.NET+WMでスリープから起きて何かして、またスリープ移行というCronInetみたいな動作ってできるんでしょうかね。API等をご存じの方がいらしたら教えてください。
(2007.2.18追記)
CeRunAppAtTimeでできるようですね。それはObsoleteで、今はWindows CE 通知 API(CeSetUserNotificationEx)に関連APIが統合。.NET Compact Frameworkからも使えるようです。
参考
« (修正)Zaurus無線LAN自動再接続スクリプトwlan-re-establish 2007.02.10版 | Main | Zaurus Ruby/Qteとruby-sqlite3で簡単データベースアプリ »


Comments
ruby-kakasi のパッケージを用意しておきました。
ちなみに項目は作っていませんでしたが、sox(-12.18.1) のパッケージも辞書ツールの関係で用意してました。
ChaSen, ipadic の利用者がいるとは思わず、放置していました。パッケージの不具合は申し訳ないです。
それにしても、ザウルスで日本語音声合成も可能だとは思ってもいませんでした。
Posted by: maru | 2007.02.17 at 10:00 AM
maruさんいつもお世話になっております。
Zaurus環境の全域にわたって成果に依存しております。
maruさんの成果が無ければ、僕にとってのzaurusの価値は1/100になっていたことでしょう。
今後も著作購入等で還元したいと思っております。
ipadicのエラーは、サイズが大きいということもありますし、また、自分ローカルな問題の可能性が高いので「自分の環境では」と書いておきました。
soxはfeedにご用意いただいていることを確認しました。feedを使う習慣が無いもので……。
ruby-kakasiパッケージありがとうございます!
ruby-kakasiのコンパイルには、恐らくrubyをコンパイルした環境が必要だと思ったのでズルをしてしまいました。
これで追試をする人が楽になると思います。
改めて再現性を高めた形でエントリしたいと思います。
日本語音声合成ができると、いろいろ妄想が膨らみます。
その前にmuDaTTS.rbの変な挙動をどうにかしないと……。
後はとりあえずでも動くような実用的なサンプルを……。
Posted by: moyashi | 2007.02.17 at 03:52 PM