2012年05月01日

Open JTalk を Windows でビルドするバッチファイル

前回、hts_engine_API の最新バージョンを間違えてしまったので、書き換えたものを作ろうとしたのですが、折角なのでバッチファイルの内部でバージョン番号を書き換えないでいいものを作ったほうが便利そうだったので、そうしてみました。

さらに、以前ソルーションファイルを作って、VC++を起動してビルドできるようにしていましたが、そのファイルも今回の成果をいろいろ追加して入れてみました。VC++2008用ですが、2010で開けば自動的に変換するので利用できます。

ojtalk.bat の仕様も変えて、他の音声に切り替えやすいようにしてみました。あとで説明しますが、音響モデルのフォルダに省略時のパラメータを書いたテキストがあれば、それを使うようにしています。

 

■ ビルド方法

open_jtalk.exe のビルドには、Visual Studio C++ 2010Visual Studio C++ 2008 のどちらかが必要です。2010Express 版でもいいはずです。それからファイルの解凍のために 7zip か tar が必要です。

ファイルは次のリンクからダウンロードします。

openjtalk_buildbatch-003.zip

展開して、そのフォルダに、Open JTalkのビルドに必要な3つのアーカイブを入れます。リンク先から最新版をダウンロードしてください。
open_jtalk-*
hts_voice_nitech_jp_atr503_m001-*
hts_engine_API-*

最初に、prepare.bat を実行します。すると、アーカイブを展開し、インストール先(標準設定でc:\open_jtalk)に、この時点で転送できるファイルを全て転送してくれます。

prepare.bat で準備がすんだら、make.bat を実行します。すると、各フォルダーの Makefile.mak の手順に従い open_jtalk.exe を生成し、インストール先のbinフォルダーに転送します。これで終わりです。

ちゃんと動くかどうかは、インストール先にある ojtalk.bat をダブルクリックして実行すれば確かめられます。「open jtalk」としゃべってくれれば、とりあえずOKです。一度ojtalk.bat を実行すると、インストール先に text.txt が作られるので、このファイルに文章を書き込み、その都度、ojtalk.bat をダブルクリックすると、その内容を読み上げてくれるはずです。

 

■ ソルーションファイル

make.bat を使えば、十分なのですが、open_jtalk\open_jtalk の中にある open_jtalk.sln を使うと、Visual Studio の画面を開いて、ビルドできます。ただし、通常は、ソルーション構成は Release か Debug、ソルーションプラットフォームは Win32 にしてください。必要ないとは思いますが、他の設定を利用するには、prepare.bat の実行前に、 build.info を編集しておく必要があります。

なお、Visual Studio を通して辞書をコンパイルすると相当時間がかかります。気長に待ってください。

 

■ 利用例

今回付属してある ojtalk.bat では、インストール先のvoiceフォルダ(デフォルトだとc:\open_jtalk\voice)に音響モデルのファイルをフォルダごと入れるようにしています。さらにその中に voice.info というファイルがあれば、省略時の -s、-p、-a、-g、-b、-u、-z、-jm、-jf、-jl の値があるとします。mei の利用の仕方は以前紹介しましたが、例えば、フォルダ mei_normal の中に、次の内容の voice.info を入れておきます。

s=48000
z=6000
p=240
a=0.55
jm=0.7
jf=0.5
jl=1.0

音響モデルの指定を –vname でできるようにしたので、次のコマンドで Mei が挨拶します。

ojtalk.bat –vname mei_normal こんにちは

さらに、Windows スクリプティングホスト(wsf) を使うと次のようなこともできます。

<job id="time">
<script language="JScript">
d = new Date();
m = d.getMinutes();
m = (m=="0")?"ちょうど":m+"分";
WScript.CreateObject("WScript.Shell").Run("c:\\open_jtalk\\ojtalk.bat -vname mei_normal "+d.getHours()+"時"+m+"です。",0,true);
</script>
</job>

このような内容の time.wsf というファイルを作って、ダブルクリックすると、時報を伝えてくれます。

さらに、これをインストールしたフォルダに入れておいて、デスクトップにショートカットを作ります。ショートカットを作ると、そのプロパティを開いてショートカットキーも登録できるようになります。例えば、それをCTRL+ALT+Tなどとすると、このショートカットキーがかぶらなければ、このキー操作でいつでも時刻を教えてくれます。またこのスクリプトを、タスクスケジューラに登録して、繰り返し間隔などを設定すれば、定期的に現在時刻を教えてくれるようになります。

 

■ ちょっと複雑な設定

普通に使うならば、上に書いた方法で十分ですが、make.bat でテキストの文字セットを UTF-8 や EUC-JP にしたり、x64向けのビルドをする場合は、build.info を書き換えればできるように作っています。ソルーションファイルを使う場合も同じです。

自動でパッチを当てるときは、パッチを当てるかどうかを「=」の右に文字があるかないかで判断しています。ただこの build.info についての説明はあまり必要ないだろうし、説明も長くなるので割愛します。

 

■ patch コマンドの導入

今回の修正程度ならば、手作業の方が手っ取り早いですが、一応 patch コマンドの導入方法も書いておきます。MinGW/MSYS を利用する方法です。次のサイトから、mingw-get-inst-*.exe という名前のインストーラをダウンロードしてきて実行します。(現時点の最新版は mingw-get-inst-20120426.exe)

MinGW - Minimalist GNU for Windows -  Browse Files at SourceForge.net 

インストール場所は標準のC:\MinGWにします。今回の利用だけならば、コンポーネントは何も選択しなくてもいいです。インストーラの使い方が分からないときは、こちらのサイトに詳しく書いてあります。Windows で MinGW バージョン 20110530 のインストールとテスト実行

インストールが終わったら、次のコマンドを、コマンドプロンプトを開いて実行します。

cd c:\MinGW\bin
mingw-get install msys-patch

これで導入完了。この場所にあれば、PATH を通さなくても、今回のバッチファイルでは patch が実行されるようにしています。ついでに、折角調べたので忘れないように書いておくと tar コマンドは「mingw-get install msys-tar-bin」で入ります。

なお、このように patch コマンドを導入しても、現在のバージョンに対応したパッチが用意されていないと自動でパッチは適用されません。今回用意しているのは、open_jtalk-1.05、hts_engine_API-1.06 向けのパッチです。





posted by takayan at 00:38 | Comment(8) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
すばらしいbatchをありがとうございます。
私の環境(VC++2008)では一部エラーが出るのでopenjtalk_buildbatch-002のcall vsvars32.bat付近で置き換えることでコンパイルが成功しました。
Delphi(わたしの主な開発環境はDelphiなので)からexeを操作して思いどおりに声を出せたときは少し感動しました。。
open_jtalk.cを変更して、コンソールアプリから、スタティックライブラリ(libファイル)に変更して、クラスを作りたいのですが、mainを消しただけではうまくいかず、私には敷居が高いようです。もしよろしければヒントだけでも教えていただけたら幸いです。
いきなりお願いをして申し訳ありませんが、よろしくお願いします。
Posted by happy_camper at 2012年05月09日 19:10
happy_camper さんコメントありがとうございます。
いい加減なことを書いてもいけないので、ちょっと試してみました。
open_jtalk.c から main()を削除する方法で問題ないと思います。他に、Usage()、Getfp()も削除してしまっていいでしょう。
残るのは、
OpenJTalk_initialize();
OpenJTalk_load();
OpenJTalk_synthesis();
OpenJTalk_clear();
の4関数ですね。これを外部から利用できるように open_jtalk.hも作っておきます。

libファイルを生成するにはopen_jtak.cをコンパイルするMakefile.makの41行目の内容を次のように変えます。
$(CL) /LIB $(LFLAGS) /OUT:open_jtalk.lib $(OBJS)

そして、make.batを実行すれば、 ソースのbinフォルダの中にopen_jtalk.libができあがっているはずです。

上記の4つの関数は最後のものを除いて引数がとても多いので、もっと簡潔に利用できる関数を作った方がいいでしょうね。
Posted by takayan at 2012年05月14日 12:59
こんにちは。
本日コメントに気付き、replyが遅れてしまいました。
lib作成のご教示いただきありがとうございます。
'いい加減なことを書いてもいけないので'という姿勢もまねせねばと思っております。
実際にコンパイルしてlibファイルが得られました。
$(CL) /LIB $(LFLAGS) /OUT:open_jtalk.lib $(OBJS)
俄仕立てで似たような変更を試みていたのですが、適切ではなかったようです。。
libファイルのサイズが大きいのは覚悟していましたが、38MBほどあります。mecabの辞書かと思うのですが、普通どおりだとmecabの辞書は50MB程度でちょっと不思議です。
辞書分だけ削った内容に変更する努力をしたいと思っています。
...とその前にlibをアプリに取り込んで使えるかなど検証するのが先でした。
とりあえずお礼を書きたかったのでコメントさせていただきました。ありがとうございました。
Posted by happy_camper at 2012年05月19日 10:08
happy_camperさん、お礼の言葉ありがとうございます。
libファイルの大きさはこんなものだと思います。ほとんどがmecab関連のobjです。でもこの場合辞書データそのものは入っていないはずです。
大きくても今まで通りのexeができますが、それでもこの大きさが気になるときは open jtalkに使ってあるmecabをdllとして切り離す手もあります。そうすると、openjtalk.libは1798kbと小さくなります。これを組み込んだopen_jtalk.exeは233kbになります。
今回はlibファイルということでしたが、全体をlibではなくdllにするならば、既にNVDA向けにnishimotzさんが作られているlibopenjtalk.dllがあります。これを利用するのも一つの手だと思います。でも大変そうなのでこれは試していません。
Posted by takayan at 2012年05月20日 18:55
こんばんは。
libファイルのサイズに関して、おっしゃられるとおりだと投稿した後から、変なことを書いてしまったと反省しております。
近況を申し上げると、objファイルとlibファイルを作成できたのですが、delphiではlibファイルが直接使えず、objファイルのリンクしかできないので、C++Builderで試してからと考えていましたが、VCではCOFFでborlandのOMFとはフォーマットが違うそうです。。何とかなると思っていたのですが、考えが足りませんでした。coff2omf.exeという変換ツールもあるそうですが、とても険しい道のりに思えます。
C++Builderでコンパイルするには、かなりCのコンパイルやバッチファイルなど勉強する必要がありそうです。とりあえずはexeを操作してopen jtalkを利用させていただこうと考えています。
ところで、open_jtalk.cでは、MAXBUFLEN 1024となっていますが、これ以上の長さのデータを渡すことができないのでしょうか。それともopen_jtalk.exe内だけの仕様なのでしょうか。
質問ばかりしてすみません。

Posted by happy_camper at 2012年05月21日 01:58
happy_camperさん、どうも。
Delphiを使うと最初に書いてありましたね。深く考えていませんでした。いろいろ勉強しないといけないようですね。
MAXBUFLEN は mecab に送るテキストの長さですから、そこだけ考えると、必要に応じて長くしてもかまわないんじゃないかと思います。ただ、それに続く音声を作る処理では、長すぎるとどうなるかは知りません。ここが重要なのでしょうが、そこまで詳しくありません。
Posted by takayan at 2012年05月27日 01:09
openjtalkをwindowsで非常に手軽に利用できるようになり,大変感謝しております.今後とも参考にさせていただきたいと思います.
Posted by nora96o at 2012年07月06日 21:08
nora96oさん、コメントありがとうございます。
役に立てて良かったです。
Posted by takayan at 2012年09月08日 02:33
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック
×

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