今回は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プロジェクトで活用してください。
]]>