今回はRaspberry Pi(以下ラズパイ)とOpen Jtalkを使って年始まで楽しめるカウントダウンタイマーを作ってみます。
初期設定
まずOpen JTalkをインストールします。これは apt を使って行えます。
$ sudo apt-get install open-jtalk \
open-jtalk-mecab-naist-jdic \
hts-voice-nitech-jp-atr503-m001
次に女性キャラクターの声をインストールします。
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip --no-check-certificate unzip MMDAgent_Example-1.7.zip sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
これで準備完了です。
音声出力の設定
ラズパイには音声出力が2種類あります。
- 1. マイク出力(デフォルト)
- 2. HDMI出力
今回はマイク出力を利用します。この設定を行うのは以下のコマンドです。
amixer cset numid=3 1
また、raspi-config の Advanced Options > Audio で Headphones を指定しても大丈夫です。

音量設定
音量設定は alsamixer コマンドで行います。
alsamixer

コードを書く
では試してみます。JTalk用のPythonライブラリはないので、コマンドを実行します。まず、そのための関数は次のようになります。
import subprocess
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','voice.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
c.stdin.write(t.encode())
c.stdin.close()
c.wait()
aplay = ['aplay','-q','voice.wav']
wr = subprocess.Popen(aplay)
open_jtalk コマンドを使って voice.wav ファイルを生成しています。このコマンドをシェルで書くと次のような意味になります。
open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-r 1.0 \
-ow voice.wav
そして生成された voice.wav を aplay コマンドを使って再生します。
音声を指定する
では実際に読み上げる文章を作ります。これは次のような関数です。元旦よりも前であれば、その秒数をカウントします。元旦を過ぎたら、新年のメッセージを流してプログラムを終了します。
from datetime import datetime
def say():
d = datetime.now()
new_year = datetime(2021, 1, 1, 0, 0, 0)
delta = int((new_year - d).total_seconds())
if (delta <= 0):
text = '明けましておめでとうございます。本年もよいとしでありますように'
jtalk(text)
exit()
else:
text = '元旦まであと%s秒です' % delta
jtalk(text)
後はこの関数を実行し続けるだけです。
#coding: utf-8
import time
while True:
say()
time.sleep(10)
処理全体は次のようになります。
#coding: utf-8
import time
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','voice.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
c.stdin.write(t.encode())
c.stdin.close()
c.wait()
aplay = ['aplay','-q','voice.wav']
wr = subprocess.Popen(aplay)
def say():
d = datetime.now()
new_year = datetime(2021, 1, 1, 0, 0, 0)
delta = int((new_year - d).total_seconds())
if (delta <= 0):
text = '明けましておめでとうございます。本年もよいとしでありますように'
jtalk(text)
exit()
else:
text = '元旦まであと%s秒です' % delta
jtalk(text)
while True:
say()
time.sleep(10)
Open JTalkでファイルを生成して、aplayで読み上げるのに約7秒くらいかかります。そのため、10秒間のスリープを入れています。実際に動作させたところです。
新年になった場合はこんな音声です。
まとめ
録画した時点ではまだまだ秒数がありますが、徐々に新年に向けて秒数が迫っていくはずです。夜は読み上げないように時間帯の処理分岐を入れたり、読み上げるメッセージをオンラインから取得してみるのもいいでしょう。Open JTalkを使うことで、音声読み上げ機能を簡単に導入できます。ぜひ皆さんのIoTプロジェクトで活用してください。
]]>
