OpenJTalkでwavファイルを作らずに直接再生する(2)
前回の続編、というか別バージョンです。
前回はオーディオ出力の所をアプリケーション側でALSAで実装しましたが、
よくよく見てみるとhts_engine_APIのライブラリの中に、
PortAudioというオーディオライブラリを使って出力するコードがあります。
PortAudioというのは知りませんでしたが、クロスプラットフォームのオーディオライブラリだそうです。
なかなか野心的ですが、完成度の方はどうなんでしょうか?
ちなみにFedoraにもパッケージがありました。
とは言ってもhts_engine_APIのconfigureスクリプトを見てもこれをenableにするオプションが見当たりません。
正式にサポートされているという感じではなさそうです。
が、折角コードがあるのでとりあえず試してみます。
まずは準備としてPortAudioの開発パッケージを入れます。
手元ではFedora16ですが
yum install portaudio-devel
で入りました。
次に、hts_engine_APIのconfigureスクリプトに手を入れて、PortAudioを使うように変更します。
適当なところに、以下の4行を追加します。
diff --git a/configure b/configure index 0ba64d4..259eddc 100755 --- a/configure +++ b/configure @@ -5836,6 +5836,10 @@ ac_cv_lib_winmm=ac_cv_lib_winmm_main ;; esac +cat >>confdefs.h <<_ACEOF +#define AUDIO_PLAY_PORTAUDIO +_ACEOF +LIBS="-lportaudio $LIBS" ac_config_files="$ac_config_files Makefile bin/Makefile lib/Makefile"
これでconfigureしてmake, make install します。
そしてOpenJTalkの方ですが、こちらも同様にconfigureを少しいじって
以下の1行(というか2行)を追加します。場所は適当です。
diff --git a/configure b/configure index c5f5c0a..8725cd2 100755 --- a/configure +++ b/configure @@ -5526,6 +5526,8 @@ if test "x$ac_cv_lib_stdcpp_main" = x""yes; then MECAB_LIBS="-lstdc++" fi +LIBS="-lportaudio $LIBS" + { $as_echo "$as_me:$LINENO: checking for iconv_open in -liconv" >&5 $as_echo_n "checking for iconv_open in -liconv... " >&6; } if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then
これで configure --with-charset=utf-8 して、 makeします。
binの下にできた open_jtalk は、wavファイルを作らずに直接音がなるバージョンのはずです。
#!/bin/sh VOICE_DIR='/usr/local/share/hts_voice/mei_normal' DIC_DIR='/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.05' CMD="open_jtalk" CMD=$CMD" -x $DIC_DIR" CMD=$CMD" -td $VOICE_DIR/tree-dur.inf" CMD=$CMD" -td $VOICE_DIR/tree-dur.inf" CMD=$CMD" -tm $VOICE_DIR/tree-mgc.inf" CMD=$CMD" -tf $VOICE_DIR/tree-lf0.inf" CMD=$CMD" -tl $VOICE_DIR/tree-lpf.inf" CMD=$CMD" -md $VOICE_DIR/dur.pdf" CMD=$CMD" -mm $VOICE_DIR/mgc.pdf" CMD=$CMD" -mf $VOICE_DIR/lf0.pdf" CMD=$CMD" -ml $VOICE_DIR/lpf.pdf" CMD=$CMD" -dm $VOICE_DIR/mgc.win1" CMD=$CMD" -dm $VOICE_DIR/mgc.win2" CMD=$CMD" -dm $VOICE_DIR/mgc.win3" CMD=$CMD" -df $VOICE_DIR/lf0.win1" CMD=$CMD" -df $VOICE_DIR/lf0.win2" CMD=$CMD" -df $VOICE_DIR/lf0.win3" CMD=$CMD" -dl $VOICE_DIR/lpf.win1" CMD=$CMD" -s 48000" CMD=$CMD" -p 240" CMD=$CMD" -a 0.58" CMD=$CMD" -u 0.0" CMD=$CMD" -em $VOICE_DIR/tree-gv-mgc.inf" CMD=$CMD" -ef $VOICE_DIR/tree-gv-lf0.inf" CMD=$CMD" -cm $VOICE_DIR/gv-mgc.pdf" CMD=$CMD" -cf $VOICE_DIR/gv-lf0.pdf" CMD=$CMD" -jm 0.7" CMD=$CMD" -jf 0.5" CMD=$CMD" -k $VOICE_DIR/gv-switch.inf" CMD=$CMD" -z 6000" echo 'こんにちは' | $CMD
こんな感じで -ow をつけずに実行してみると、一応喋ってはくれるのですが...
私の環境だと音の最後が少し切れる感じ(drainしてない感じ)ですし、
Segmentation fault が出てしまいます。
あとjackがないとか言います。
Cannot connect to server socket err = No such file or directory Cannot connect to server socket jack server is not running or cannot be started
pulseaudioと共存できるのかよくわからないので試してませんが、やっぱりなんか不完全な感じでした。
ちょっと調べたら直せそうな感じもしますが...
とりあえず、今回は以上です。