Androidでおしゃべりコマンドを試す。

フリーで利用出来る日本語音声合成エンジンを使って、Androidコマンドラインからお喋りさせてみようという試みです。
オープンソースで公開されている'OpenJTalk'を使用します。

ロスコンパイラの入手

Sourcery CodeBench Lite Editionから



をダウンロードして来ます。最近は色々登録しないと落とせなくなってしまった様でちと面倒かもしれません。
入手出来たら実際にクロスコンパイルをするLinuxマシンの/opt以下にインストールします。インストール先を変える場合は適宜読み替えてください。


~% cd /opt
tar xvjf arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
~% mv arm-2013.05 Sourcery

環境変数を設定しておきましょう。


~% export PATH=$PATH:/opt/Sourcery/bin/:/opt/Sourcery/arm-none-linux-gnueabi/bin/
~% export LD="arm-none-linux-gnueabi-ld"
~% export CC="arm-none-linux-gnueabi-gcc"
~% export CXX="arm-none-linux-gnueabi-g++"
~% export LDFLAGS="-L/opt/Sourcery/arm-none-linux-gnueabi/lib"
~% export CFLAGS="-I/opt/Sourcery/arm-none-linux-gnueabi/include"
~% export AR="arm-none-linux-gnueabi-ar"

ソースコード類の入手

hts_engine API から、

  • hts_engine_API-1.06.tar.gz



Open JTalkから

  • open_jtalk-1.05.tar.gz(本体)
  • open_jtalk_dic_utf_8-1.05.tar.gz(Open JTalk用辞書)
  • hts_voice_nitech_jp_atr503_m001-1.05.tar.gz(Open JTalk用HTSボイス)



MMDAgent - Toolkit for Building Voice Interaction Systemsから

  • MMDAgent_Example-1.0.zip(MMDAgent のサンプルスクリプト、meiちゃんの声の音響ファイルを拝借)



をそれぞれダウンロードしておきます。

hts_engine APIをビルドする

これが無いとOpenJTalkがビルドできません。


~% tar xvzf hts_engine_API-1.06.tar.gz
~% cd hts_engine_API-1.06
~% ./configure \
> --prefix=/opt/Sourcery/arm-none-linux-gnueabi \
> --host=i386-linux \
> --target=arm-linux
~% make
~% make install

OpenJTalkをビルド

OpenJTalk自体はhts_engine_APIのサンプルアプリという扱いのようです。


~% export CC="arm-none-linux-gnueabi-gcc -static"
~% tar xvzf open_jtalk-1.05.tar.gz
~% ./configure \
> --prefix=/opt/Sourcery/arm-none-linux-gnueabi \
> --host=i386-linux \
> --target=arm-linux \
> --with-hts-engine-header-path=/opt/Sourcery/arm-none-linux-gnueabi/include \
> --with-hts-engine-library-path=/opt/Sourcery/arm-none-linux-gnueabi/lib \
> --with-charset=UTF-8
~% make
でビルドが始まりますが、途中で 「mecab-dict-indexが実行出来ないよ!」的なメッセージと共にエラー終了しちゃうと思います。仕方ないのでホストマシンで実行可能なmecab-dict-indexを得るために、Linux上で普通にOpenJTalkをビルドします。先に設定したクロスコンパイル向けの環境変数の影響を避けるために別なターミナル上で作業します。

~% mkdir ~/linux-native
~% mkdir ~/openj
~% cd linux-native
~% tar xvzf hts_engine_API-1.06.tar.gz
~% tar xvzf open_jtalk-1.05.tar.gz
~% cd hts_engine_API-1.06
~% ./configure --prefix= $HOME/openj
~% make
~% make install
~%
~% cd open_jtalk-1.05
~% ./configure \
> --prefix=$HOME/openj \
> --with-hts-engine-header-path=$HOME/openj/include \
> --with-hts-engine-library-path=$HOME/openj/lib \
> --with-charset=UTF-8
~% make
ビルドが正常終了したら、mecab-dict-indexをクロスコンパイル環境の方にコピーします。

~% cp ~/linux-native/open_jtalk-1.05/mecab/src/mecab-dict-index ~/open_jtalk-1.05/mecab/src/
ロスコンパイル用のターミナルに戻って続きをビルドします。

~% cd ~/open_jtalk-1.05
~% make
~% make install
これで/opt/Sourcery/arm-none-linux-gnueabi/binに、open_jtalkバイナリが出来てる筈です。

~% cd /opt/Sourcery/arm-none-linux-gnueabi/bin
~% file open_jtalk
open_jtalk: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped

サウンドプレイヤーの入手

出来上がったOpenJTalkのバイナリでテキストファイルから読み上げwavファイルが作れて、それをAndroidの適当なプレイヤーで再生したり出来るんですが、やっぱりコマンドラインから扱いたいのでcuiサウンドプレーヤーを準備します。ちょっと楽して The KBOX projectの'andplay'を使わせて頂きます。


~% mkdir andplay
~% cp andplay_0.0.1_kbox.deb andplay
~% cd andplay
~% ar x andplay_0.0.1_kbox.deb
~% ls
andplay_0.0.1_kbox.deb control.tar.gz data.tar.gz debian-binary
~% tar xvzf data.tar.gz
./
./usr/
./usr/bin/
./usr/bin/andplay

再生スクリプトの準備

以下の内容でsay.shというファイルを作成しておきます。


#!/system/bin/sh
VOICE=$HOME/MMDAgent_Example-1.0/Voice/mei_happy
DIC=$HOME/open_jtalk_dic_utf_8-1.05
OUT=$HOME/tmp/jsay.tmp.wav
echo "$1" | $HOME/openj/bin/open_jtalk -s 48000 -p 210 -a 0.55 \
-z 0 \
-td $VOICE/tree-dur.inf -tm $VOICE/tree-mgc.inf -tf $VOICE/tree-lf0.inf \
-tl $VOICE/tree-lpf.inf -md $VOICE/dur.pdf -mm $VOICE/mgc.pdf \
-mf $VOICE/lf0.pdf -ml $VOICE/lpf.pdf -dm $VOICE/mgc.win1 \
-dm $VOICE/mgc.win2 -dm $VOICE/mgc.win3 -df $VOICE/lf0.win1 \
-df $VOICE/lf0.win2 -df $VOICE/lf0.win3 -dl $VOICE/lpf.win1 \
-em $VOICE/tree-gv-mgc.inf -ef $VOICE/tree-gv-lf0.inf -cm $VOICE/gv-mgc.pdf \
-cf $VOICE/gv-lf0.pdf -k $VOICE/gv-switch.inf -ow $OUT \
-ot trace.txt \
-x $DIC

andplay $OUT
rm $OUT

作成ファイルの実機へのコピー

Linuxマシン上で準備した以下のファイルをAndroid端末に送信します。
場所はrboxの$HOMEがいいと思います。

  • open_jtalk_dic_utf_8-1.05.tar.gz
  • MMDAgent_Example-1.0.zip
  • open_jtalk
  • andplay
  • say.sh



上記ファイルの上2つは普通に$HOME上で展開し、下3つは実行属性をつけて$RBOX/usr/binに移動させます。
以上でとりあえずの準備は完了です。
rboxのshell上で、


~% say.sh 喋らせたい言葉
でお喋りしてくれると思います。
ただ、筆者の環境だと喋り始めるまで5秒位かかるので、リアルタイム読み上げをしたいような用途に使うのはちょっと厳しいかもしれませんねー。
あと、rboxのzshは今のところマルチバイト対応出来てないので、日本語入力する化け化けになります(それでも一応喋りはします)のでちょっと使い方に工夫がいりますね。VimShell+skk.vimでイケるかなと思ったんですが何故かダメでしたorz
ではでは、時間がある方は色々遊んでみてくださーい。
※2013.07.18追記 - gccに "-Ofast -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp" のオプションを追記してビルドしたところ劇的に早くなりました。端末によっては動かないケースもありそうですけど。VimShellの方は私の勘違いだった様で、普通に喋ります。