音声合成ライブラリgtalkを使ってみる
最近無性にしゃべる人工無能が作りたい欲求にかられている。
ニコニコなどで有名な『ゆっくり』こと「Aques Talk」でとりあえずは遊んでみたのだが、(mecabで形態素解析してAquesTalkに流す。)まずLinux版がフリーでない、およびアクセント辞書を持っていない、オープンソースでない、などの不満から別のライブラリを探すことにした。(もちろん『ゆっくり』も十分素敵なライブラリではあるのだけれど。)
で調べてみた結果galatea toolkitという、擬人化音声対話エージェントのツールキットがあった。このツールキットはライセンスフリーで、そのツールキットのひとつがgtalkという音声合成ライブラリであった。
http://hil.t.u-tokyo.ac.jp/~galatea/index-jp.html
これは形態素解析はchasenを使っており、アクセント解析も実装されている。『ゆっくり』に比べ抑揚があって聞こえがよい。
とりあえずソースを解析し、実行ファイルをライブラリに変換し、自作のプログラムから読み込めるようにしてみた。
その過程でいくつか詰まった点があったのでメモしておく。。。
chasenのdllが読み込めない。
chasenのdllのパスはssm.confで指定。またchasenrcのパスも指定する必要がある。
パスが正しいのに読み込めないのは、libchasen.dllが暗黙にlibiconv-2.dllを読み込んでいるためで、dllを実行ファイルと同じ階層においておく必要がある。
chasen_getopt_funcを実行しようとするととまる。
( *chasen_getopt_func )( opt, stdout );
で関数が終わらなくなってしまう。
これはdll内部で不正終了し、それを外部のプログラムが不正したことに気づかないことによる現象のようである。
私の場合はこのchasenrcで指定したchadic.chaの相対パスが実行プログラムからたどれなくなっていたことによるエラーだった。chasenrc内部の相対パスを正しく指定した結果、このエラーもなくなった。
以上のことをした結果、『ゆっくり』より滑らかに話すプログラムが完成した。割と満足。
chasenの更新
ただこのプログラム、ずいぶん前に更新が終了しているようで、サイトに公開されているchasenのバージョンが2.33だったのにたいし、最新版は(現在)2.42であった。せっかくなのでバージョンをあげてみた。
その結果再び詰まったのでメモ。
dllのパスやchasenrcのパス、およびchadic.chaのパスの指定は上記のとおりである。galateaのサイトで公開されているchasenのchasenrcはgtalk用にカスタマイズされているが、一般公開されているchasenはされていないので、カスタマイズしてやる必要がある。
修正箇所を残しておく。パスなどは環境によるが、一応私の環境のものをメモしておく。変更部分のみ。コピペじゃだめですw
;相対パスで文法ファイルを指定。 (GRAMMAR ../chasen-2.4.2/dic) ;;; ;;; output format /出力フォーマット ;;; (OUTPUT_FORMAT "<W1 orth=\"%m\" pron=\"%?U/%m/%a/\" pos=\"%U(%P-)\"%?T/ cType=\"%T \"//%?F/ cForm=\"%F \"//%?I/ %i///>\n") ;;; ;;; output format for compound words /複合語出力 ;;; (OUTPUT_COMPOUND "SEG") ;;; ;;; BOS string /BOS文字列 ;;; (BOS_STRING "<S>\n") ;;; ;;; EOS string /EOS文字列 ;;; (EOS_STRING "</S>\n") ;;; ;;; annotation POSs /注釈 ;;; (ANNOTATION (("<" ">") "%m\n"))
修正後は無事新しいchasenの方でも読み上げてくれた。ただ違いはあまり実感できていない。><
galateaおよびgtalkで遊ぼうとして失敗している人が、googleで調べた結果結構いたのであるが、もし参考になれば幸いである。
次はjuliusで遊ぼうかなぁ。