Raspberry Pi | ラズパイに喋ってもらう作戦(Open JTalk1.08のインストールと音声出力設定)
こんばんは、tapunです。
電子工作用に注文しているジャンプケーブルがなかなか届かないので、別の検証として、Raspberry Piに喋ってもらう作戦をやってみたので、その流れをメモします。
何を喋らせるの?
将来的には毎朝人が通ったときに、その日の天気などを伝えることを目標にします!
今回はとりあえず、「現在時刻を喋ってもらう」ように設定していきます。
#2015-12-15追記
天気予報を喋っていただく設定はこちらのポストを参考に♪
どうやって喋らせるの?
調べたところ、Open Jtalkという日本語音声合成ソフトがフリーかつ有名なようなので、私もこちらのソフトを使っていきます。
※Open Jtalkとは・・・ http://open-jtalk.sp.nitech.ac.jp/
名古屋工業大学で開発された、オープンソース(修正BSDライセンス)の日本語テキストに基づいて自由な音声を生成するHMMテキスト音声合成システムとのことです。
- Open Jtalkとは?
- オープンソースの日本語音声合成エンジン
入力された日本語テキストに基づいて人工音声を生成する、テキスト音声システム。
- BSDライセンス準拠。
- 名古屋工業大学で開発。
- 音声認識エンジンにHTSを使う。
http://open-jtalk.sourceforge.net/
引用元:http://www.harumaki.net/2014/10/23/open-jtalk_insatll_memo
事前準備
- pacoのインストール
今回はソースからコンパイルするので、ソースの管理用ソフトのpacoをインストールします。$ sudo apt-get install paco Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: paco 0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. Need to get 91.1 kB of archives. After this operation, 217 kB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main paco armhf 2.0.9-3 [91.1 kB] Fetched 91.1 kB in 1s (60.4 kB/s) Selecting previously unselected package paco. (Reading database ... 118489 files and directories currently installed.) Preparing to unpack .../paco_2.0.9-3_armhf.deb ... Unpacking paco (2.0.9-3) ... Processing triggers for man-db (2.7.0.2-5) ... Setting up paco (2.0.9-3) ... Processing triggers for libc-bin (2.19-18+deb8u1) ...
# pacoの説明は、こちらのまとめが参考になります。
インストールする
# こちらのサイトを参考にさせていただきました。
- hts_engine API version 1.09 (December 25, 2014)をインストールします
# 2015/11/30時点の最新版です。/tmp配下にダウンロードして解凍します
$ cd /tmp $ sudo wget http://sourceforge.net/projects/hts-engine/files/hts_engine%20API/hts_engine_API-1.09/hts_engine_API-1.09.tar.gz $ sudo tar zxvf hts_engine_API-1.09.tar.gz
ビルド・コンパイル・インストールします。 2分くらいかかりました。
$ cd /tmp/hts_engine_API-1.09 $ sudo ./configure $ sudo make $ sudo paco -lD "make install"
- Open JTalk 1.08をインストールします。
# 2015/11/30時点の最新版です。/tmp にダウンロードして解凍します。
$ cd /tmp $ sudo wget http://sourceforge.net/projects/open-jtalk/files/Open%20JTalk/open_jtalk-1.08/open_jtalk-1.08.tar.gz $ sudo tar zxvf open_jtalk-1.08.tar.gz
ビルド・コンパイル・インストールします。 これは10分くらいかかりました~。途中で心配になった。。
$ cd /tmp/open_jtalk-1.08 $ sudo ./configure --with-charset=UTF-8 $ sudo make $ sudo paco -lD "make install"
- 確認
pacoで管理されているソフトが表示されればオッケーです。$ paco -a hts_engine_API-1.09 open_jtalk-1.08
辞書ファイルのダウンロード
Dictionary for Open JTalk version 1.08 (25 December, 2014)をダウンロードして、/usr/local/share/配下におきます。
- /tmp にダウンロードして解凍して配置します。
$ cd /tmp $ sudo wget http://sourceforge.net/projects/open-jtalk/files/Dictionary/open_jtalk_dic-1.08/open_jtalk_dic_utf_8-1.08.tar.gz $ sudo tar zxvf open_jtalk_dic_utf_8-1.08.tar.gz $ sudo mkdir /usr/local/share/open_jtalk $ sudo mv /tmp/open_jtalk_dic_utf_8-1.08 /usr/local/share/open_jtalk/
MMDAgentのダウンロード
MMDAgent(version 1.4 ) をダウンロードして、/usr/local/share/配下におきます。
- /tmp にダウンロードして解凍して配置します。
$ cd /tmp $ sudo wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.4/MMDAgent_Example-1.4.zip $ sudo unzip MMDAgent_Example-1.4.zip $ sudo mkdir /usr/local/share/hts_voice $ sudo mv /tmp/MMDAgent_Example-1.4/Voice/mei /usr/local/share/hts_voice/
これでインストールは完了です!
早速喋っていただく
- シェルの作成
open_jtalkを使って喋ってもらうためのシェルを/usr/local/bin配下に作成します。$ sudo vi /usr/local/bin/jsay
jsayファイルの内容は、こちらです。
一旦tempファイルとしてwavファイルを作成し、出力後に消去しています。#!/bin/sh # 引数チェック CMDNAME=`basename $0` if [ $# -lt 1 ]; then echo "Usage: ${CMDNAME} [ text ]" 1>&2 exit 1 fi # 定数定義(出力ファイル名、辞書の場所、音声データの場所) TMPFILE=`mktemp /tmp/tmp.XXXXXXXX.wav` DIC=/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.08/ VOICE=/usr/local/share/hts_voice/mei/mei_normal.htsvoice # 音声データ生成 echo "$1" | open_jtalk \ -x ${DIC} \ -m ${VOICE} \ -ow ${TMPFILE} && \ # 生成した音声データを再生する aplay --quiet ${TMPFILE} # 生成した音声データを削除する rm -f ${TMPFILE} # 終了 exit 0
- 実行権限を付与する
$ sudo chmod +x /usr/local/bin/jsay
- しゃべってもらう
$ jsay こんにちは、わたしはラズベリーパイです
あれ?しゃべらない・・・・・
HDMIで接続しているテレビから、うんともすんとも喋りません。
そこで音声出力の設定を入れなおすことにしました。
- boot設定を編集します
$ vi /boot/config.txt
... # uncomment to force a HDMI mode rather than DVI. This can make audio work in # DMT (computer monitor) modes hdmi_drive=2 ...
“hdmi_drive=2″についていたコメントを外します。
- 音声出力の優先順位を設定します。
- ★アナログ出力を優先にする場合は
$ amixer cset numid=3 1
- ★HDMI出力を優先にする場合は
$ amixer cset numid=3 2
# 私はこちらにしました~
- ★アナログ出力を優先にする場合は
- rebootします
ここで再チャレンジすると・・・・・喋りました~!!!
$ jsay こんにちは、わたしはラズベリーパイです
最初の3文字くらいが消えちゃって「んにちは、・・・」といっちゃってますが、まぁ喋ってるので良しとします。
2015/12/03追記:出力をHDMIからアナログに変えたら解決しました。くわしくはこちら。
現在時刻を喋らせる
# こちらのサイトを参考にさせていただきました。
時刻を話させるスクリプトを適当なところに作成します。
$ vi ~/talk_date.py
中身はこんな感じです。↓
#!/usr/bin/env python # -*- coding:utf-8 -*- import shlex import subprocess from datetime import datetime import urllib2 import json CMD_SAY = 'jsay' def main(): say_datetime() return def say_datetime(): d = datetime.now() text = 'はい、今の時刻は%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) text = CMD_SAY + ' ' + text print text proc = subprocess.Popen(shlex.split(text)) proc.communicate() return ### Execute if __name__ == "__main__": main()
ファイルを保存したら、下記のように実行します。
$ sudo python talk_date.py
すると、Raspiちゃんが喋って時刻を教えてくれます!!
大満足です!
残課題
最初の2~3文字分の音声がスキップされてしまうので、なんとかしたいです。
# 上の例だと、最初の「はい、」が消えてて「今の時刻は・・・」からしか聞こえません。
2015/12/03追記:出力をHDMIからアナログに変えたら解決しました。くわしくはこちら。
まとめ
Raspberry Piに喋ってもらうために、Open JTalkをインストールしました。
音声をHDMIから優先で出力するためにboot configファイルをいじりました。
jsay “こんにちは” の形で、任意の日本語を喋ってくれるようになりました。
また、現在時刻を喋ってもらうためのpythonスクリプトを作成しました。
まずは日本語を喋るところまでクリアできたので、今後より活用できそうです!
おやすみなさい~
うおー、RaspberryPi3Bも時刻をちゃんとしゃべった〜。素晴らしい。
ありがとうございました。
太田さん、ラズパイ3Bでも試していただいてありがとうございます!お役に立てたようでよかったです。
私も3B買おうかな!
おーーーー!ちゃんと喋りますね!RasPi2でも3でも。
参考になりました。ありがとうございます!これからも応援しています。
試していただいてありがとうございます!
お役に立てて嬉しいです😃
ラズパイ3は購入しているのですが、なかなか触る時間がなくてヤキモキしていますが、また色々試して記事を書いていこうとおもってますので、よろしくお願いします!