Open JTalkのDockerイメージを作って手軽に喋らせる

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 を指定するのじゃ。

参考