Linux の Docker の中で voiceroid+ ゆかりさんを動かす

2016/2/16

Tweet

何をするのか

Linuxの上で動いている.サーバも立っている
Linuxの上で動いている.サーバも立っている

インストール

といっても基本的には 今井の作ったスクリプト を実行すれば良く,ここには簡単な日本語訳を書いておく.

イメージをビルドする

しばらくかかる

git clone -b voiceroid https://github.com/tomoki/docker-wine-japanese.git
cd docker-wine-japanese
./builder.sh

Voiceroid をコンテナにいれる

実行しているコンテナを次まで終了しないこと.(勝手に消去する設定にしているので)

./make_container.sh
# ここでボイスロイドをいれる. (i.e, wine voiceroid_yukari_dl.exe とか)
# shared_directory は外と中から見れるので,使ってください
# i.e, in host,       $ cp voiceroid_yukari_dl.exe shared_directory
#      in container,  $ wine shared_directory voiceroid_yukari_dl.exe
# to run voiceroid,   $ wine start .wine/drive_c/users/wine/Desktop/VOICEROID+\ 結月ゆかり.lnk

コンテナをイメージにする

あとあと他のマシンと使いまわせるようにしておく. このイメージを公開しないこと.

とりあえずコンテナのidをチェック.

sudo docker ps -a

CONTAINER ID IMAGE                   COMMAND                CREATED       STATUS      PORTS NAMES
24f120fb0db7 tomoki/docker-voiceroid "/bin/sh -c /bin/bash" 3 seconds ago Up 2 second       voiceroid_cont

このケースは 24f120fb0db7.これをイメージにする.

sudo docker export 24f120fb0db7 > voiceroid_docker_image.tar

注: このイメージはUIDを使ってしまっているので,実際には他のマシンでは動かないかもしれない.

イメージをインポートする

cat voiceroid_docker_image.tar | sudo docker import - voiceroid-dock

動かすときには

./launcher.sh

サーバとして動かす

shared_directory にサーバスクリプトがある.

# in host
./launcher_with_port.sh

# in container
wine start .wine/drive_c/users/wine/Desktop/VOICEROID+\ 結月ゆかり.lnk
python3 shared_directory/server.py

# in host URLエンコードすること
# 音声保存
wget "http://localhost:48234?message=hello&speaker=yukari"
# 音声をそのまま話す
wget "http://localhost:48234?message=hello&speaker=yukari&direct=true"

こんな感じのshellscriptが良いかも

#!/bin/sh
encoded=`echo "$1" | nkf -wMQ | sed 's/=$//g' | tr = % | tr -d "\n"`
echo $encoded
curl "http://localhost:48234?direct=true&speaker=yukari&message=$encoded"

X Windowの仮想バッファを使う

なぜか普通のウィンドウでやるととても不安定.なので仮想バッファを使う. まずは以下のシェルスクリプトをshared_directory下に作成.

start_yukari.sh

#!/bin/sh
wine start .wine/drive_c/users/wine/Desktop/VOICEROID+\ 結月ゆかり.lnk

exec_yukari_and_server.sh

#!/bin/sh
cd /home/wine
echo "Starting Yukari"
./shared_directory/start_yukari.sh
sleep 5
echo "Server is running at port 48234"
python3 shared_directory/server.py

exec_yukari_and_server_nohead.sh

#!/bin/sh
xvfb-run -a /home/wine/shared_directory/exec_yukari_and_server.sh

実行

exec_yukari_and_server_nohead.sh をコンテナ中で実行すればサーバがXなしで立ち上がります.

# in container
$ ./exec_yukari_and_server_nohead.sh

Emacs からサーバを叩く

Emacs からゆかりさんをしゃべらせたい?簡単です.

下記のshellscriptをspeak.shとして保存して,

#!/bin/sh
encoded=`echo "$1" | nkf -wMQ | sed 's/=$//g' | tr = % | tr -d "\n"`
echo $encoded
curl "http://localhost:48234?direct=true&speaker=yukari&message=$encoded"

次のEmacsLispでいけます.

(defun speak-yukari (str)
  (interactive)
  (call-process-shell-command
   (concat "/home/tomoki/Dropbox/yuduki/docker/speak.sh " str) nil 0))

(speak-yukari "こんにちは")

うごかなかったら

githubのissueに書いてください.