久しぶりに書いてます。
(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"最初の行がVisualStudio2008の環境設定です。そのあとhts_engine_APIをビルドして、そのあとopen_jtalkを作ります。
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 ..
うまくいけば、これで open_jtalk.exeがアーカイブを入れたフォルダに出来上がります。
そして、実行テストです。何でもいいのですが、比較して確認できるように先人を踏襲します。
次の内容のシフトJIS形式でtest.txtと名前をつけて保存します。
新成人のみなさん、おめでとうございます。私も成人したころを懐かしく思い出します。そして、次の内容のバッチファイル test.bat を作り、同じフォルダに入れます。
@echo offtest.bat を実行すると、音声が出力されるはずです。フォルダには音声ファイルとログファイルができているはずです。
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
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 が生成されるはずです。