Raspberry Pi 3にUSBヘッドホンを接続し、日本語音声合成「OpenJTalk」を用いて、Python言語で作成したプログラムで日本語テキストを発話させます。

日本語音声合成「OpenJTalk」のインストール

日本語音声合成「OpenJTalk」は、日本語の文章を入力として、合成音を出力する完全なTTS(Text-to-Speech)エンジンで、最初にapt-getでopen-jtalk をインストールします。

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

mecabの辞書は、/var/lib/mecab/dic/open-jtalk/naist-jdic/ にインストールされます。

Voiceデータを流用して、MMDAgentから音声ファイルのセットアップします。

$ wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip

つぎに.htsvoiceファイルを抽出します。

$ unzip MMDAgent_Example-1.6.zip MMDAgent_Example-1.6/Voice/*

ファイルを hts-voice-nitechと同じ場所にコピーしておきます

$ sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice

USBヘッドホンの接続

Raspberry Pi 3にサンワサプライ USBヘッドセット/ヘッドホン ブラック MM-HSU01BKを接続します(「Raspberry Pi 3にマイクロホンの接続」を参照)。

次のコマンドで、オーディオの優先度を確認します。

$ cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_bcm2835

「snd_usb_audio」の優先度が一番高くない場合は、「Raspberry Pi 3にUSB DACの接続」の「USB DAC の優先度設定」に従って優先度を変更します。

OpenJTalk用プログラムの作成

subprocess モジュールは新しいプロセスの開始、入力/出力/エラーパイプの接続、リターンコードの取得を可能とします。このモジュールは以下の古いモジュール「os.system」を置き換えます。os.systemメソッドによりaplayコマンドを用いて、OpenJTalkで作成したwavファイルを再生します。

#coding: utf-8
import os
import subprocess
from datetime import datetime

def jtalk(t):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(t)
    c.stdin.close()
    c.wait()
    os.system("aplay -D plughw:0,0 'open_jtalk.wav' ")


def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    jtalk(text)

if __name__ == '__main__':
    say_datetime()

aplayコマンドのパラメータについて

USBヘッドフォンから音を出したい場合は、以下のコマンドを実行します。[0,0]がUSBヘッドセットのオーディオ、[1,1]がHDMIのオーディオで、plugをつけると指定のフォーマット、ビットレートになるよう自動でリサンプリング処理を行ってくれます。(「Raspberry Pi 3にマイクロホンの接続」の「マイクロホンによる音声録音」を参照してください。

$ aplay -D plughw:0,0 test.wav

OpenJTalk用プログラムの実行

次のコマンドでOpenJTalk用プログラム「test.py」を実行します。コンソールに再生中の表示があり、USBヘッドホンから日付の発話が聞こえます。

$ python test.py
再生中 WAVE 'open_jtalk.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モ ノラル

※注意
作成されるwavファイルはモノラルのため、aplayコマンドに「-D」を付けないと、次の王に「aplay: set_params:1239: チャネル数が使用不可能」が表示され、再生できません。

$ python test.py
aplay: set_params:1239: チャネル数が使用不可能