2010年02月28日

PythonでMBROLAを使って日本語をしゃべらせる

MBROLAというシステムを使って日本語をしゃべらせるスクリプトの紹介です。MBROLAはあらゆるプラットフォームに対応していますが、このスクリプトはWindows限定です。

MBROLAというものがあるのを知って、「日本語を音素に分解してくれるPythonスクリプト」というエントリーを書いたのがもう2年以上前になります。MBROLAを調べているうちに日本語を発音させるRubyスクリプトのmuDaTTSというのを知って、その頃いろいろ調べていた pythonでも似たようなことができないかと思って調べて書いたものです。このときは音素に分解するだけで満足してしまって、作業を止めてしまったのですが、最近になって音声出力の部分を完成させてみようという気になりました。まだ完全な形ではないのですが、とりあえずしゃべるようになったので公開しておきます。

現時点では音声の停止ができない、音量などのパラメータの変更ができないなど、まだ基本的な機能もできていないのですが、単独で日本語をしゃべってくれるようになりました。それから今回の作業で2年前の変換スクリプトに数値を正しく読まないなどの問題があったので、そこらへんも修正しておきました。

mudatts.rbを参考にしながら作ったので、以前は pydatts.py という名前にしていましたが、今回の修正を機に mecabとmbrolaを使っているTTSということで、わかりやすく mmtts.py と呼ぶことにしました。

■ 機能
・日本語を棒読みしてくれます。
・数値も読んでくれます。
・ユーザー辞書で特殊な読み方を登録できます。
・音声ファイル(wav)を作成できます。

■ 今後の課題
・音声の停止や、前の声を強制的に終わらせて発音したり、キューに音声をためて発音させたりする機能もほしい。
・抑揚が表現できればいい。その暁にはUnidicのアクセント情報も利用できればいい。せっかくMeCabを使っているのに、品詞情報を利用しない手はない。
・記号の読みの抑制や、辞書変換の抑制などもパラメータで制御できるようにできればいい。
・英語音声で英単語も読めるといい。


■ 仕組み
日本語文字列をMeCabを使って、仮名書きに変換します。
そして、これをMBROLAが処理できるPHO形式に変換します。
そして、これをpho2wav.pydを使ってmbrola.dllの関数を呼び出し、音声ファイルに変換します。
そして、変換された音声ファイルを再生し出力します。


■ 必要なもの
このスクリプトを利用するには以下のものが必要です。

・Windows用 python2.6本体
http://www.python.org/
左のメニューにある「DOWNLOAD」リンクを開き、ダウンロードページを開き、Downloadページにある Python2.6 の Windows installer のリンクをクリックするとダウンロードが始まります。
ダウンロード後インストールしておきます。

・Windows用Mbrolaパッケージ「MbrolaTools」と日本語音素データベース「jp2」
http://tcts.fpms.ac.be/synthesis/mbrola.html
上記ページを開いて、左にあるメニューの中の「Download」リンクを開き、開いたページの「MBROLA binary and voices」リンクを開きます。
ページ下方の 2)Getting the MBROLA Voicesのリストの中の「jp2: Japanese Female (5.6Mb) 」リンクをクリックすると日本語音声データベースのダウンロードが始まります。
ページ上方の 1)Getting the MBROLA binaryのリストの中のPC/Windowsリンクを開きます。開かれたページの「install package (1.8 Mb) for using Mbrola with Windows」リンクをクリックするとWindows向けパッケージのダウンロードが始まります。
MbrolaToolsを実行し、インストールします。jp2のzipファイルはあとで使います。

・Windows用MeCabパッケージ
http://mecab.sourceforge.net/
「Binary package for MS-Windows」の下にある「ダウンロード」リンクをクリックするとダウンロードが始まります。
ダウンロード後インストールしておきます。インストールするとき文字コードの選択画面でSJISを選択します。

・Windows用MeCabをPythonから利用するためのパッケージ(今回ビルドしてみました)
mecab-python-0.98.win32-py2.6.exe
ダウンロード後インストールしておきます。
今回はパッケージを使ってみましたが、ctypesを使って mecab を利用しても問題無いと思います。かえってそちらの方がpythonやmecabのバージョンに煩わされなくていいかもしれません。


■ ダウンロード

モジュール本体
mmtts092.zip
(詳しくは、さらにUnidicを使って、日本語にアクセントをつけてみる

過去のバージョン
mmtts091.zip

内容物:
mmtts.py ... スクリプト本体
userdic.txt ... 追加で読みを登録するためのファイルです
pho2wav.pyd ... スクリプトで利用しているdll (スクリプトと同じ場所に置いてください)
pho2wav.cpp ... そのdllのソース(実行には必要ないので削除してもいいです)


■ 使い方
利用するスクリプトと同じフォルダに置いて使ってください。PythonのLIBフォルダに放り込んでも使えると思います。

簡単なサンプルです。
# -*- coding: sjis -*-
# 3倍速で挨拶をします
import mmtts
mmtts.set_rate(3.0)
mmtts.set_pitch(1.0)
mmtts.set_volume(1.0)
mmtts.speak('こんにちは')

音声を出力する関数はspeak(str)です。文字列を指定します。音声の速さ、ピッチとボリュームを設定する関数 set_rate(num)、set_pitch(num)、set_volume(num)では小数点数で標準状態との比を指定します。ファイル生成系の関数として、makeWAV(str,filename)、makePHO(str,filename) があります。それぞれ文字列を指定すると、それを指定した名前のWAVファイルやPHOファイルに変換してくれます。

mmtts.py を単独で使ったときは、同じフォルダから text.txt という名前のファイルを探して読み上げるようにしています。ためしに text.txt に読ませたい文章を保存して、mmtts.py をダブルクリックをしてみてください。


細かな説明は次回にします。


posted by takayan at 05:08 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。