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と共存できるのかよくわからないので試してませんが、やっぱりなんか不完全な感じでした。
ちょっと調べたら直せそうな感じもしますが...

とりあえず、今回は以上です。