音声合成してみよう

音声合成プログラムのインストール

音声合成エンジン「openJTalk」をインストールするためのシェルスクリプト「setup_tts.sh」を実行しましょう。途中で続けるかどうか聞かれたら、「Y」(はい)と答えてください。

sh setup_tts.sh
#! /bin/bash
# 音声合成プログラムopenJTalk(日本語)とflite(英語)のインストール

echo "Step1=openJTalk標準パッケージのインストール"
sudo apt-get -y install open-jtalk # プログラム本体
sudo apt-get -y install open-jtalk-mecab-naist-jdic # 辞書
sudo apt-get -y install hts-voice-nitech-jp-atr503-m001 # 音響モデル。標準の男性声。

echo "Step2=MMD Agentから音響モデルMeiを取得"
# MMD Agent(http://www.mmdagent.jp/)
cd /tmp # カレントディレクトリーを /tmp に移動。
wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
# MMDAgent_Example-1.7.zip の取得
unzip MMDAgent_Example-1.7.zip MMDAgent_Example-1.7/Voice/*
# MMDAgent_Example-1.7.zip の展開
sudo cp -r MMDAgent_Example-1.7/Voice/mei/ /usr/share/hts-voice
# Meiの音響データを/usr/share/hts-voiceへコピー

echo "Step3=/var/openjtalkディレクトリーが存在していなければ作成する"
if [ ! -e /var/openjtalk ]; then
  sudo mkdir /var/openjtalk # /var/openjtalkディレクトリー作成
  sudo chown pi.pi /var/openjtalk # 所有者 pi、所有グループ pi を指定
fi

echo "Step4=fliteのインストール"
sudo apt-get -y install flite
echo "設定完了"

音声合成サンプルの実行

音声合成できるかどうか、試してみましょう。サンプルプログラム「sample_talk1.py」を実行してみてください。「こんにちは」「Hello!」と声がしたら成功です。Ctrl+Cで終了してください。

python3 sample_talk1.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Sample Code : 音声合成サンプル

# モジュールのインポート
from time import sleep     # ウェイト処理
import subprocess          # 外部プロセスを実行するモジュール
import sys

# 変数
ttsJpn = "exec_talkJpn.sh" # 日本語発話シェルスクリプトのファイル名
ttsEng = "exec_talkEng.sh" # 英語発話シェルスクリプトのファイル名

# メインループ
try:
  while (True):
    cmds = ['sh',ttsJpn, 'こんにちは'] # コマンドリストの作成
    proc = subprocess.Popen(cmds, stdout=subprocess.PIPE) # コマンドの呼び出し
    proc.communicate() # コマンド実行プロセスが終了するまで待機
    cmds = ['sh',ttsEng, 'Hello'] # コマンドリストの作成
    proc = subprocess.Popen(cmds, stdout=subprocess.PIPE) # コマンドの呼び出し
    proc.communicate() # コマンド実行プロセスが終了するまで待機
except KeyboardInterrupt:
  print (' 終了しました')
  sys.exit(0)

日本語をしゃべらせる

上記プログラムの中で利用しているシェルスクリプトを利用すれば、直接コマンドラインから喋らせることもできます。

sh exec_talkJpn.sh "おはよう"
#!/bin/bash
# 音声合成(Open JTalk)起動スクリプト

# メッセージがない場合は終了
CMD=`basename $0`
if [ $# -lt 1 ]; then
  echo "Usage: ${CMD} <message>"
  exit 1  # エラーコード 1で終了
fi

HTSVOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice # 音声データファイル名
DICDIRE=/var/lib/mecab/dic/open-jtalk/naist-jdic/ # 形態素解析ソフトMeCabの辞書ディレクトリ名
VOICEDATA=/tmp/voice.wav # 生成する音声合成データファイル名
sudo echo "$1" | open_jtalk \
-x $DICDIRE \
-m $HTSVOICE \
-ow $VOICEDATA \
-s 55000 \
-b 0.0 \
-r 1.0 \
-fm 0.0 \
-u 0.0 \
-jm 1.0 \
-jf 1.0 \
-z 10000
aplay -q -D plughw:0,0 $VOICEDATA
# sudo rm -f $VOICEDATA
exit 0

英語をしゃべらせる

英語も簡単に音声合成できます。下記のようにコマンドに続けてシングルクォーテーションで囲って英語を記述するだけです。

sh exec_talkEng.sh 'Hello'
#!/bin/bash
# 音声合成(flite)起動スクリプト
VOICEDATA=/tmp/voice.wav
sudo espeak -v "english"+f3 -p 99 -w $VOICEDATA $1
aplay -D plughw:0,0 $VOICEDATA
#sudo rm -f $VOICEDATA

もっと大きな音を出す

左記の位置に100kΩの抵抗をハンダづけすることで、音量を2倍にすることができます。