たねやつの木

Photographs, Keyboards and Programming

Raspberry Piでテキストを音声化する (Open JTalk)

f:id:ibuquicallig:20180109175221j:plain

こんばんは、たねやつです。

今回はOpen JTalkというソフトを利用して、Raspberry Pi上でテキストから音声ファイルを 作成する方法について書きます。

Youtubeやニコニコ動画でよくあるゆっくり実況であったり、 もやもやさまぁ~ずのナレーションの声(ショウ君というらしいです(笑))と同じような合成音声です。

初音ミクなんかもおんなじようなジャンルになるのですかね?(゚∀゚)

Open JTalkはフリーのソフトウェアなので無料で使用可能です。 あとあと音響モデルというものも必要になってくるのですがコチラもココで紹介している分は(投稿時点で) すべて無料となっています。

こんな感じの発話音声を作成できるようにします。

open_jtalkのインストール

以下のコマンドでインストール。

$ sudo apt-get update
$ sudo apt-get install open-jtalk

コレでopen_jtalkコマンド自体は使えるようにはなるのですがさらに辞書ファイルと音響モデルが必要にあります。

入手すべき辞書ファイル・音響モデルファイルはopen-jtalkをapt-getでインストールした際の 推奨パッケージ(Suggested Package)に表示されています。

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libhtsengine1
Suggested packages:
  open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
The following NEW packages will be installed:
  libhtsengine1 open-jtalk
0 upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 187 kB of archives.
After this operation, 542 kB of additional disk space will be used.
Do you want to continue? [Y/n]

open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001が表示されているので、

$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

でインストールします。

コレで必要なファイルが揃いました。

音声を出力してみる

とりあえず出力できているか確認するには以下のコマンドをコピペで実行してください。 オプションで辞書ファイルなどを指定する必要がありかなり長くなってしまいます...

あとあとシェルスクリプトにまとめます。

echo "これはテストです" | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow ./open_jtalk_tmp.wav

な、長い...(笑) コンフィグファイルとかもないので実行するたびに辞書ファイルや音響モデルを指定する必要がありますorz

そしてコレを実行しただけでは音声ファイルが作成されるだけで、再生はしてくれません。現在のディレクトリにopen_jtalk_tmp.wav というファイルが生成されているはずです。

コレをsudo aplay open_jtalk_tmp.wavでRaspberry Pi上で再生できます。(USBスピーカーなど必要です。)

WindowsからでもsambaやFTP経由で共有すれば確認可能ですね。

このままだとかなり低い男の人の声で発話されているはずです!

声質を変えてみる

オプションで変更する

オプションを指定することで声の高さや速さなどを変更できます。

オプションについてはこのページが参考になりました。

echo "声の高さを上げました。" | open_jtalk -fm 7 -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow ./open_jtalk_tmp.wav

たとえば-fm [数値]を指定すると声の高さを変更できます。 デフォルトが0で、7ぐらいまで上げると如実に変わります。

しかし、男の人の声というのはどうしても抜け出せません(笑)

以下の音響モデルを変更して、女性の声にしてみましょう!

音響モデルを変更する

私が使用している音響モデルはtohoku-f01-neutralというものです。 いくつか試してみて一番自然かな?と感じたので採用しました。

Github上で公開されているので、Cloneなりzipなりでゲットできます(゚∀゚)

東北大学の研究室で開発(?)された音響モデルのようです。

$ cd /usr/share/hts-voice/
$ sudo git clone https://github.com/icn-lab/htsvoice-tohoku-f01.git
...

もともとの/usr/share/hts-voice/ディレクトリにcloneします。

/usr/share/内には一般的に、 いろいろなユーザーで使う(可能性のある)、個人的でないファイルを保管します。

それでは先程のopen_jtalkコマンドでしていた音響モデルを変更してみましょう。

echo "声の高さを上げました。" | open_jtalk -m /usr/share/hts-voice/htsvoice-tohoku-f01/tohoku-f01-neutral.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow ./open_jtalk_tmp.wav

女性の声に変わりました!若干高音部分がデジタルなビリビリした感じになりますが、だいぶ聞き取りやすいかと思います。

そして冒頭に上げた動画での音声とほぼ同じとなりました。

シェルで処理をまとめる

上の処理(音声ファイルの作成 〜 発話)を一つのシェルスクリプトにまとめます。 長いのでオプションごとに区切りを入れます。

発話だけ実行

#!/bin/sh

#引数のチェック
if [ $# -ne 1 ]; then
  echo "invalid argument.";
  exit 1;
fi

#一時ファイルを保存するディレクトリ
TMPDIR=./tmp
TMPFILE=${TMPDIR}/tmp.wav

echo "$1" | open_jtalk \
-m /usr/share/hts-voice/htsvoice-tohoku-f01/tohoku-f01-neutral.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-r 1.1 \
-ow $TMPFILE

#再生
sudo aplay --quiet ${TMPFILE}

#一時ファイルを削除
rm ${TMPFILE}

exit 0;

ファイル名はechoとしました。(標準のechoコマンドとかぶっていますね..(笑))

以下の処理を追加しています

  • 引数が渡されない場合 or 2つ以上渡された場合に処理を中止する。
  • 保存先ディレクトリを変数に代入(後々変更しやすいように)。
  • 発話後に作成したファイルを削除する。

実行権限を付与、一時フォルダを作成し、以下のように発話する文章を指定します。

$ chmod 755 ./echo
$ mkdir ./tmp
$ ./echo "発話する文章をここに入力します。"

発話に使った音声ファイルを残す

音声ファイルを動画中や他の場所で使用するときのために削除しないためのスクリプトです。

ファイル名はecho_saveとでもしました。

#!/bin/sh

#引数のチェック
if [ $# -ne 1 ]; then
  echo "invalid argument."
  exit 1;
fi

#一時ファイル
DIR=./tmp
FILE=${DIR}/${1}.wav

#ファイル生成
echo "$1" | open_jtalk \
  -m /usr/share/open_jtalk_voice/tohoku-f01-neutral.htsvoice \
  -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
  -r 1.1 \
  -ow ${FILE} && \

#再生
sudo aplay --quiet ${FILE}

while :
do
  #プロンプト
  read -p "save? [Y/n/a(play again)]: " RES

  #分岐
  case ${RES} in
    [nN]* )
      echo "did not save the file.";
      rm ${FILE};
      break;;
    [aA]* )
      sudo aplay --quiet ${FILE};
      continue;;
    * )
      echo "saved.";
      break;;
  esac
done

exit 0;

長々となってしまった... もっとコンパクトにスマートにまとめられれば,,,

./echo_save "発話"を実行後、音声が発話されプロンプトが表示されます。

yを入力するか、そのままエンターを押すとファイルを削除せずに残します。

nを入力するとファイルを削除します。

aを入力するともう一度音声を再生します。それからもう一度プロンプトを表示します。

何回か確認して取捨選択するために作成しました。

現在時刻を発話する

最後に少しだけ。現在時刻を発話するスクリプト。

#!/bin/bash

HOUR=`date +%H`
MINUTE=`date +%M`

STR=現在の時刻は、${HOUR}${MINUTE}分です。

./echo ${STR}

以上でRaspberry Pi上でテキストを音声化する方法とスクリプトでした。

参考

全体的な内容 https://qiita.com/lutecia16v/items/8d220885082e40ace252

open_jtalkコマンドのオプション https://kledgeb.blogspot.jp/2014/05/ubuntu-open-jtalk-2-openjtalk.html