2012年04月25日

Open JTalk を 64ビットWindows用にビルドする方法

Open JTalk を x64 Windows 向けにビルドする方法を調べてみました。

単純にターゲット環境を /MACHINE:x64 のスイッチで64ビットにしてビルドすると、Mecabのコード部分でコンパイルエラーが出ます。feature_index.cppとwrite.cpp です。原因は型の曖昧さエラーです。これを下記のページを参考にしてキャストで型を明示的に指定して解決します。

64ビットWindows用にMeCabをビルドする (Visual Studio 2010を利用)

open_jtalk_1.05 に使われている feature_index.cpp では310行目、write.cpp は235行目が問題の箇所となっています。

feature_index.cpp:310
-            case 't':  os_ << (size_t)path->rnode->char_type;     break;
+            case 't':  os_ << (unsigned int)path->rnode->char_type;     break;

writer.cpp:235
-          case 'L': *os << std::strlen(sentence); break;
+          case 'L': *os << (unsigned int)std::strlen(sentence); break;

とりあえず、これだけの修正でビルドが通ります。しかし、実際に動かすと、応答無しになってしまいます。

VC++でデバッグして調べてみると、hts_engine_API-1.06.tar.gz にある HTS_audio.c の167行目、関数 waveOutOpen 呼び出しでの引数の型が原因だと分かりました。4番目と5番目の引数のキャストを DWORD から DWORD_PTR に変えると、エラーが起きなくなります。DWORDとしてあるのはx64を考慮していない頃の古い定義によるものです。

HTS_audio.c:167
-   error = waveOutOpen(&audio->hwaveout, WAVE_MAPPER, &audio->waveformatex, (DWORD) HTS_Audio_callback_function, (DWORD) audio, CALLBACK_FUNCTION);
+   error = waveOutOpen(&audio->hwaveout, WAVE_MAPPER, &audio->waveformatex, (DWORD_PTR) HTS_Audio_callback_function, (DWORD_PTR) audio, CALLBACK_FUNCTION);

以上、3行修正して、x64向けのビルドをすると、open_jtalk.exe は 64ビットアプリケーションとして動くようになります。

このくらい手作業で十分ですが、折角なので、先日コメント欄で指摘してもらった長文で音声がおかしくなる問題を修正したものも含めて、パッチを三つ作ってみました。

open_jtalk-1.05_x64_patch.zip

patch コマンドがあれば、展開したフォルダに該当するパッチファイルを置いて、例えば、次のコマンドでパッチが当てられます。

patch -p1 < open_jtalk-1.05_x64.patch



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

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