2013年02月09日

open jtalk 1.06 を VS2012で ビルドするバッチ

open Jtalk をビルドするバッチを更新しました。(以前の記事

open Jtalkがバージョンアップしても書き換えなくていいように内部で複雑なことをしていたのですが、open Jtalk 1.06で音響モデルファイルの構成が変わってしまったので、細かなところがうまくいかなってしまいました。最初はいいアイデアだと思ったのですが、こういう自動化よりも、年に一度その都度、ファイル名や処理を書き換えてシンプルなバッチを書いてビルドするのがベストですね。

でも今回はちょっと意地になって対応してみることにしました。ついでに Windows 8 に合わせて去年登場した Visual Studio Express 2012 for Windows Desktop でもビルドできるようにしてみました。他にVC++2008とVC++2010Expressでできるはずです。

ダウンロード: openjtalk_buildbatch-005.zip

MD5:7789eb6a3270eefbadaf827df6028417

(Open JTalk 1.07及びVS2013への対応 2013.12.31更新)

使い方は以前の通りですので、「Open JTalk を Windows でビルドするバッチファイル」を見てください。上記ファイルを展開して、そのフォルダ内にopen jtalk関連のアーカイブを入れ、必要ならばbuild.info でパッチの実の指示をして、prepare.batを実行し、make.batを実行すれば、標準設定ならば、c:\open_jtalk\bin\にopen_jtalk.exeができあがります。c:\open_jtalk\ojtalk.batを使うか、次のようなバッチファイルを実行すると、確認できます。

set MESSAGE=こんにちは
set VOICE=nitech_jp_atr503_m001
cd c:\open_jtalk
(echo %MESSAGE%)>text.txt
bin\open_jtalk -x dic -m voice\%VOICE%.htsvoice -z 6000 text.txt

以前の記事に書いていない主な変更点として、build.infoファイルでパッチを当てるかどうかのフラグとしてPATCH_OPEN_JTALK_MAKE_PAIRを追加しています。右辺に何か文字があると、下記で説明している、open Jtalk 1.05 を VC++ 2012でビルドするためのパッチを当てます。

明記したほうがいいものをいくつか書いておきます。

x64向けにビルドしようとすると、今回から音響モデルデータが htsvoice 形式になったため、今までとは違う原因で hts_engine_API 内でコンパイルエラーや実行時エラーになってしまいます。今のところOpen JTalk をx64でビルドするメリットはありませんが、コンパイルが通らないと無性にその原因を調べたくなるものです。そして、たいていこういうのは ポインタやsize_t 自身のサイズです。具体的には、HTS_Model構造体npdfの型を size_t* からunsigned int*に変えています。また、waveOutOpenのコールバック関数の型のいくつかをDWORDからDWORD_PTRに書き換えます。

それから、htsvoice ファイルをvoiceフォルダの中に直接置くようにしています。たくさんのファイルが必要だったときはvoiceフォルダの中にそれらのファイルが収まったフォルダを置いていましたが、必要なのがhtsvoice ファイルだけなので、アーカイブから抽出してそれだけを置いています。なお、以前の方式の音響モデルデータファイルから、htsvoice ファイルへの変換は htsvconv.exe でできます。Windowsならばhtsvconv.exeの上にマウスでフォルダを落とせば生成されます。

新しいものがあるので、古い Open Jtalk 1.05 を使う必要も無いかもしれませんが、以前の音響データを使うときのためにこれもビルドできるようにしてあります。ただし、open Jtalk 1.05 を VC++ 2012 でビルドしようとするとエラーが出ます。 原因はC++11標準の影響で std::make_pair の明示的なテンプレート引数に関する扱いが変わったためです。これに対応するパッチも作りました。パッチファイルは open_jtalk-1.05_make_pair.patch です。

-      category.insert(std::make_pair<std::string,charinfo>(key,c));
+      category.insert(std::pair<std::string,charinfo>(key,c));

こんな感じです。

build.infoファイルで次のように記述してあると、自動的にopen Jtalk 1.05にパッチをあてるようにしてあります。もちろん patch コマンドがインストールされている必要があります。

PATCH_OPEN_JTALK_MAKE_PAIR=ON

なお1.06では既にこの部分を置き換えてある mecab のコードを利用しているので修正の必要ありません。

他に新しくやったこととして内部での作業で文字列置換の標準入出力のフィルタがほしかったので、rplc.exeというコマンドを作って利用しています。具体的には、プリプロセッサマクロの定義をバッチファイルだけで書き換えるのが難しかったので、mecab\mecab.vcproj 内で@VERSION@をrplc.exeを使って処理対象のバージョンに書き換えています。



posted by takayan at 15:01 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


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

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