Docker イメージとラッパースクリプトを作っておいて echo "ほげ" | ./talk.sh
みたいな感じで手軽に喋らせたい。
改善の余地はありますがとりあえず動いた段階での最低限なメモです。
Dockerfile 書く:
FROM ubuntu:18.04 RUN apt-get update \ && apt-get -y install --no-install-recommends \ hts-voice-nitech-jp-atr503-m001 \ open-jtalk \ open-jtalk-mecab-naist-jdic \ sox \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /root/work
sox は必須ではないが音量調節のためにどうせ使うので一緒に入れておいた。
イメージをビルド:
docker build -t my-open-jtalk:0.0.1 .
コンテナ内で実行させるスクリプト
container_open_jtalk.sh
を用意:
open_jtalk \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \ -ow /tmp/output.wav cat /tmp/output.wav
同じくコンテナ内で実行させるスクリプト
container_sox.sh
を用意:
cat > /tmp/input.wav # 音量調節 sox -v 0.5 /tmp/input.wav /tmp/output.wav cat /tmp/output.wav
sox の入出力をパイプにつなげる方法を調べかけたけど、 めんどくさくなったのでひとまず cat と一時ファイルで wrap。。。
コマンドとして使う talk.sh
を用意:
#!/bin/bash gen_wav(){ docker run --rm -i --name my-open-jtalk \ -v $(pwd):/root/work \ my-open-jtalk:0.0.1 \ /bin/bash /root/work/container_open_jtalk.sh } adjust_vol(){ docker run --rm -i --name my-open-jtalk-sox \ -v $(pwd):/root/work \ my-open-jtalk:0.0.1 \ /bin/bash /root/work/container_sox.sh } # 入力は標準入力から受け取る gen_wav \ | adjust_vol \ | aplay --quiet
aplay はホスト側のもの(※ ちなみにホストも Ubuntu)。 別のディレクトリから実行すると pwd がずれて動かないので必要なら適宜なんとかする。
実行:
chmod u+x talk.sh echo "ほげ" | ./talk.sh date "+現在の時刻は %-H時 %-M分 です" | ./talk.sh
mei の音声データを使う場合
Dockerfile をこうして
FROM ubuntu:18.04 RUN apt-get ...(略。上記のに加えて wget, unzip もインストールする) WORKDIR /tmp RUN wget --no-check-certificate \ https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip \ && unzip MMDAgent_Example-1.7.zip \ && cp -r MMDAgent_Example-1.7/Voice/mei/ /usr/share/hts-voice/ WORKDIR /root/work
open_jtalk の -m
オプションで
/usr/share/hts-voice/mei/mei_normal.htsvoice
を指定するのじゃ。
参考
- 萌え声を探せ!Open JTalkのパラメータをいろいろ変化させてみた! | もブログ!
- Open JTalk のパラメータ指定のサンプル