Funny Snowman

FunnySnowman > Geek<ギーク>なコトをやってみよっと

テキストを音声データに変換してロボットに喋らせる。

ゴール設定(ラズパイで入力したテキストをスピーカーで鳴らしてみる)

ロボットに何か喋らせる為に、まずはテキストデータを音声データ(wav形式等)に変換する「音声合成」というものをやってみる。音声ファイルへの変換ができたら、前述のスピーカーで音を鳴らすだけ。音声合成エンジンの「Open JTalk」は、ライセンスフリーのLinux日本語音声合成エンジンです。今回は、オフラインで実行可能な「Open JTalk」をラズパイにインストールします。

R2D2を喋らせる

事前準備(JTalkのインストール)

日本製のソフトウェアなのに、公式サイトは英語のみという「Open JTalk」の<公式サイトはこちら>。下記の4つのモジュールをインストールする。

$ sudo apt-get install open-jtalk                       # JTalk本体をインストール
$ sudo apt-get install libhtsengine1                    # JTalkの動作に必要な音声合成エンジン
$ sudo apt-get install open-jtalk-mecab-naist-jdic      # 辞書ファイルをインストール
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001  # 音声合成用(音響モデル)をインストール
  

「open_jtalk」コマンドで、JTlakのバージョンと設定可能パラメータを表示できる(下記は、一部日本語に置き換え済み)。

$ open_jtalk -h

The Japanese TTS System "Open JTalk"
Version 1.07 (http://open-jtalk.sourceforge.net/)
Copyright (C) 2008-2013 Nagoya Institute of Technology
All rights reserved.

  usage:
       open_jtalk [ options ] [ infile ]
                                                           # [デフォルト値][最小-最大値]
  options:                                                           [  def][ min-- max]
    -x  dir        : 辞書のディレクトリ                              [  N/A]
    -m  htsvoice   : 音響モデル ファイル名                           [  N/A]
    -ow s          : 出力するwavファイル名                           [  N/A]
    -ot s          : ログファイルの指定                              [  N/A]
    -s  i          : サンプリング周波数(48000前後)                   [ auto][   1以上  ]
    -p  i          : フレーム周期(240前後)                           [ auto][   1以上  ]
    -a  f          : オールパス定数                                  [ auto][ 0.0-- 1.0]
    -b  f          : ポストフィルタ係数                              [  0.0][ 0.0-- 1.0]
    -r  f          : スピーチ速度(話す速さ)                        [  1.0][ 0.0--    ]
    -fm f          : 追加ハーフトーン                                [  0.0][    --    ]
    -u  f          : 音声/無声のしきい値                             [  0.5][ 0.0-- 1.0]
    -jm f          : スペクトラム系列内変動の重み                    [  1.0][ 0.0--    ]
    -jf f          : F0系列内変動の重み                              [  1.0][ 0.0--    ]
    -z  i          : オーディオバッファサイズ (if i==0, turn off)    [    0][   0--    ]
  

実験(テキストを音声データに変換)

“こんにちは”というテキストファイル「input.txt」を、音声データファイル「output.wav」に変換してみよう。JTalkで最低限必要なパラメータは次の4つ。
-x : 辞書ファイル(/var/lib/mecab/dic/open-jtalk/naist-jdic)
-m : 音響モデル(/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice)
-ow: 出力するファイル名(output.wav)
テキストファイル(input.txt)
これらを一行コマンドで実行すると、「output.wav」ファイルが出来上がる。

$ echo "こんにちは" > input.txt
$ 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 output.wav \
             input.txt
$ # output.wavファイルが作成されている。
$ ls output.wav -la

-rw-r--r-- 1 pi pi 105644  5月  9 23:08 output.wav
  

実験(音声データをスピーカーで鳴らす)

デフォルト「男性の声」で喋る

JTalkが出力した音声データ「output.wav」を「aplay」コマンドで音を鳴らす。

$ aplay -D hw:1,0 output.wav

再生中 WAVE 'output.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
  

男の人の声で「こんにちは」って喋りました。

次のWEBサイトでは、Open JTalkの音声合成と音声出力のデモを体感できます<Open JTalkのデモ>。

毎回パラメータを指定するのが面倒なのでスクリプトファイルを作成して簡単に実行できるようにします。「jtalk.sh」というファイルを作成し、下記のスクリプトを書きます。

#!/bin/bash
# ファイル名:jtalk.sh

# ファイルを指定
voice=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice
dic=/var/lib/mecab/dic/open-jtalk/naist-jdic

# パラメータを定義
option="-m $voice \
  -s 30000 \
  -p 150 \
  -a 0.03 \
  -u 0.0 \
  -jm 1.0 \
  -jf 1.0 \
  -x $dic \
  -ow output.wav"

# テキストを音声データに変換実行
echo "$1" | open_jtalk $option

# 音声をスピーカーで鳴らす。
aplay -q -D hw:1,0 output.wav
  

「jtalk.sh」に実行権限を付与して、テキスト変換と音声出力を1行で実行!

$ # 実行権限の付与
$ chmod +x jtalk.sh
$ # スピーカーで喋る            
$ ./jtalk.sh "こんばんは"      
  

次は「女性の声」で喋る

たった1行で「こんばんは」って喋るようになりましたよ。次は音響モデルを変更して、女性の声で喋ってもらいましょう。まずは音響モデルのメイちゃん(MMDAgent_Example-1.7.zip)のダウンロード。バージョン1.7の場合は、下記のURLからダウンロードできました。Zipファイルなので解凍して、中身の音響モデルファイル「*.htsvoice」を5つ全て「/usr/share/hts-voice/mei」ディレクトリに移動します。ZIPファイルには他にも「モーションファイル?(*.vmd)」ファイルがたくさん入っていましたが、今回は使いません。

$ cd /usr/share/hts-voice       # 音響モデルのディレクトリに移動
$ sudo mkdir mei                # 新しいディレクトリを作成
$ # 音響データをダウンロード
$ sudo wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
$ # zipファイルを解凍します。
$ sudo unzip MMDAgent_Example-1.7.zip
$ # htsvoiceファイルの移動
$ sudo mv MMDAgent_Example-1.7/Voice/mei/*.htsvoice mei
$ # いつものユーザーディレクトリに戻る
$ cd ~

  

解凍後のディレクトリとファイルはこんな感じ(↓)。

ファイル一覧

最後に音響モデルをメイちゃんノーマルの「mei_normal.htsvoice」に変更する。ついでにパラメータも女性らしい声に調整済み。

#!/bin/bash
# ファイル名:jtalk.sh

# ファイルを指定
# ↓最初にインストールした男性の声
#voice=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice
# ↓追加した女性の声(メイちゃん)
voice=/usr/share/hts-voice/mei/mei_normal.htsvoice
# ↓辞書ファイルのあるディレクトリ
dic=/var/lib/mecab/dic/open-jtalk/naist-jdic

# パラメータを定義
option="-m $voice \
  -s 48000 \
  -p 240 \
  -a 0.5 \
  -u 0.0 \
  -jm 1.0 \
  -jf 1.0 \
  -x $dic \
  -ow output.wav"

# テキストを音声データに変換実行
echo "$1" | open_jtalk $option

# 音声をスピーカーで鳴らす。
aplay -q -D hw:1,0 output.wav
  

スクリプトを実行。メイちゃんの声で「こんにちは」とスピーカーから音が出ました。音響モデルを変更できるので文章に応じて感情を変更するのもいいですね。
mei_angry.htsvoice (--〆)ぷんぷん
mei_bashful.htsvoice          (*´з`)もじもじ
mei_happy.htsvoice (^◇^)わーい
mei_normal.htsvoice          ( ^^) のーまる
mei_sad.htsvoice (T_T)/~~~えーん

$ ./jtalk.sh "こんにちは"
  

最終型「感情を選択して、女性の声」で喋る

喋らせるテキストと一緒に感情のパラメータを与えて、メイちゃんの音響モデルを選択できるようにした(↓)。

#!/bin/bash
# ファイル名:jtalk.sh

# 音響モデルのファイルを定義
if [ $2 == "normal" ]; then
  voice=/usr/share/hts-voice/mei/mei_normal.htsvoice
elif [ $2 == "angry" ]; then
  voice=/usr/share/hts-voice/mei/mei_angry.htsvoice
elif [ $2 == "happy" ]; then
  voice=/usr/share/hts-voice/mei/mei_happy.htsvoice
elif [ $2 == "sad" ]; then
  voice=/usr/share/hts-voice/mei/mei_sad.htsvoice
else
  voice=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice
fi

# 辞書ファイルのディレクトリ
dic=/var/lib/mecab/dic/open-jtalk/naist-jdic

# パラメータを定義
option="-m $voice \
  -s 48000 \
  -p 240 \
  -a 0.5 \
  -u 0.0 \
  -jm 1.0 \
  -jf 1.0 \
  -x $dic \
  -ow output.wav"

# テキストを音声データに変換実行
echo "$1" | open_jtalk $option

# 音声をスピーカーで鳴らす。
aplay -q -D hw:1,0 output.wav
  

第一引数に喋るテキスト文を、第二引数に感情を与えてスクリプトを実行する。

$ ./jtalk.sh "やった。成功したよ。" "happy"
$ ./jtalk.sh "おっと。失敗しちゃった。" "sad"
  

まとめ(実際の動画:ラズパイで入力したテキストをスピーカーで鳴らしてみる)

以下の最小6ステップで、テキストを喋らせる機能をラズパイに実装することが可能だった。パラメータが色々あって面倒かと思いきや、ちょっと値をいじると色んな音が出るので面白い。男性の声や女性の声など音響モデルファイルを変更すると、声のトーンや感情も表現できる。ひとつだけ注意すると、例えば「Hello」を喋らせると、JTalkは「エイチ・イー・エルエル・オー」と喋ってくれるので、英語は苦手な様です。というわけで、ラズパイにスピーカーを繋いだら、ぜひ音声合成もお試しください。

(1)「JTlak本体」をインストールする。
(2)「音声合成エンジン」をインストールする。
(3)「辞書ファイル」をインストールする。
(4)「音響モデル」をインストールする。
(5)「open_jtalk」を複数のパラメータと一緒にテキストを与えると、音声データ(wavファイル)が出力される。
(6)「aplay」などで音声データを鳴らす。

ラズパイが喋るようになったので、次は音声認識で会話できるようにしてみよう。

▲上に戻る