2010年02月19日

Open JTalkをVS2008で

ご無沙汰しています。
久しぶりに書いてます。
(2010.08.28 1.01向けに修正)

最近になって、Open JTalkというのを見つけたので、ちょっと試してみました。
OpenJTalkはオープンソース(New and Simplified BSD license)の音声合成システムです。linux向けのものですが、Windowsでもビルドし実行することができます。

参考にしたページは、研究室の片隅で○○を叫ぶの「Open JTalk をVS2005でコンパイルしてみた」と、そこで紹介されていた ja.nishimotz.com の「Open JTalk」です。前者はタイトル通りVisualStudio2005でのコンパイル方法が、後者ではUbuntuとWindowsのCygwin環境での動作例が解説されています。
今回は、手元にVS2008があるので、それでコンパイルしてみました。ちゃんと上記ページと同じwavファイルが作れました。

せっかくなので、そのとき作ったnmake向けの Makefile.mak を公開します。ソースを手を加えずにビルドするための単純なものです。

open_jtalk-1.01_vs_makefile.zip
(20100828 1.01向けに修正)

VS2008PRO向けに作りましたが、無料でダウンロードできる Express Edition の環境でもうまくいきました。それから現在Microsoftで評価版として公開されているVisualStudio2010RCをインストールした環境でも、ソースに2行書き加えればコンパイルできることも確認できました。


それでは、VS2008向けの手順です。分かりやすいようにバッチファイルの内容も書いておきます。

必要なのは以下の4つのファイルです。
hts_engine_API-1.03.tar.gz
hts_voice_nitech_jp_atr503_m001-1.01.tar.gz
open_jtalk_dic_shift_jis-1.00.tar.gz
open_jtalk-1.01.tar.gz

最初の一つは次のページから、
http://hts-engine.sourceforge.net/
残りの3つのは次のページから
http://open-jtalk.sourceforge.net/
持ってきます。
適当な新しいフォルダを作って、この4つのファイルをその中に入れます。

そして今回作ったMakefileを固めた open_jtalk-1.01_makefile.zip も同じフォルダに入れます。

これらの5つのファイルを圧縮解凍ソフトの手順に従って展開します。例えば、7-zipを入れていれば、次のようにしてコマンドラインで展開します。(7-zipのインストール先が違うときは書き換えてください。)
extract.bat
set PATH=%ProgramFiles%\7-Zip;%PATH%
7z x hts_engine_API-1.02.tar.gz
7z x hts_engine_API-1.02.tar
7z x hts_voice_nitech_jp_atr503_m001-1.00.tar.gz
7z x hts_voice_nitech_jp_atr503_m001-1.00.tar
7z x open_jtalk_dic_shift_jis-1.00.tar.gz
7z x open_jtalk_dic_shift_jis-1.00.tar
7z x open_jtalk-1.01.tar.gz
7z x open_jtalk-1.01.tar
del *.tar
7z x open_jtalk-1.01_vs_makefile.zip
展開がすんだら、次のビルド用のコマンドを実行します。
build.bat
call "%VS90COMNTOOLS%\vsvars32.bat"
cd hts_engine_API-1.02
nmake /f Makefile.mak
nmake /f Makefile.mak install
cd ..
cd open_jtalk-1.01
nmake /f Makefile.mak
copy bin/open_jtalk.exe ..
cd ..
最初の行がVisualStudio2008の環境設定です。そのあとhts_engine_APIをビルドして、そのあとopen_jtalkを作ります。
うまくいけば、これで open_jtalk.exeがアーカイブを入れたフォルダに出来上がります。

そして、実行テストです。何でもいいのですが、比較して確認できるように先人を踏襲します。
次の内容のシフトJIS形式でtest.txtと名前をつけて保存します。
新成人のみなさん、おめでとうございます。私も成人したころを懐かしく思い出します。
そして、次の内容のバッチファイル test.bat を作り、同じフォルダに入れます。
@echo off
set VOICE=hts_voice_nitech_jp_atr503_m001-1.00
open_jtalk ^
-td %VOICE%/tree-dur.inf ^
-tf %VOICE%/tree-lf0.inf ^
-tm %VOICE%/tree-mgc.inf ^
-md %VOICE%/dur.pdf ^
-mf %VOICE%/lf0.pdf ^
-mm %VOICE%/mgc.pdf ^
-df %VOICE%/lf0.win1 ^
-df %VOICE%/lf0.win2 ^
-df %VOICE%/lf0.win3 ^
-dm %VOICE%/mgc.win1 ^
-dm %VOICE%/mgc.win2 ^
-dm %VOICE%/mgc.win3 ^
-ef %VOICE%/tree-gv-lf0.inf ^
-em %VOICE%/tree-gv-mgc.inf ^
-cf %VOICE%/gv-lf0.pdf ^
-cm %VOICE%/gv-mgc.pdf ^
-k  %VOICE%/gv-switch.inf ^
-x open_jtalk_dic_shift_jis-1.00 ^
-ow _hoge.wav ^
-ot _log.txt ^
test.txt
test.bat を実行すると、音声が出力されるはずです。フォルダには音声ファイルとログファイルができているはずです。

nishimotz 氏の 上記サイトと同じファイルができたでしょうか?音声をパソコンから出力せずに音声ファイルだけを作る改造の仕方はそのページに書いてあります。


実際ビルドしてみると分かるのですが、ビルド時にメモリ リークの可能性という警告がでてしまいます。音を出してみるのが目的だったので、今回はそのままにしています。本格的に使うときには修正が必要かもしれません。

それから、このプログラムでは内部で MeCab を利用していますが、ソースを確認すると Open_Jtalk 向けに十数か所書き換えらたものが使われていて、本家の libmecab.dll を利用するようにはできていないようです。ビルドの仕方によっては Open_JTalk向け libmecab.dll を生成するようにもできますが、今回は生成しないようにしています。

OpenJtalk は、商用の音声合成に比べれば物足りなさを感じますが、フリーでここまでできれば十分だと思います。開発された方々に感謝します。 今後 Windowsで使いやすいように dll化したり、SAPI5で使えるようにしたり、いろいろできたらいいですね。でももっと興味があるのがLinuxでの利用です。いままでも、制限付きのAquesTalkの試用版を使ったり、MBROLAを使ったりすれば、お金をかけずにLinuxでの日本語の発音もできたのですが、ソースが公開されていなかったり、ライセンス的にいろいろ面倒でした。でもこのOpen_JTalkはオープンソースということなのでいろいろ自由にやれそうです。


最後に、次は参考までに現在評価版として入手できるVS2010RCでのビルド手順です。

ファイルの展開までは上記とまったく同じです。しかしこのままmakeしても途中で止まってしまいます。問題は back_inserter() のようです。回避するには、この関数が現れるファイルの先頭の方に #include <iterator> を挿入すればいいようです。具体的には、mecab/srcフォルダの dictionary_rewriter.cpp 、viterbi.cpp の2つのファイルを修正します。この修正のあと上記のビルド用のバッチファイルの一行目を 「call "%VS100COMNTOOLS%\vsvars32.bat"」に書き換えて実行すれば、open_jtalk.exe が生成されるはずです。


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

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日以上新しい記事の投稿がないブログに表示されております。