ラズパイと一緒に新年を迎えよう! – Raspberry PiとOpen Jtalkを使って年始に向けたカウントダウンタイマーを作る【2020年版】

Facebooktwittermail

通常のパソコンではキーボードやマウスを使った入力と、画面への出力が基本です。しかしIoTの場合、センサーを入力デバイスとして使ったり、出力デバイスも画面以外のものを使うことがよくあります。その一つが音声です。音声入力や音声出力を使うことで、よりIoTらしい使い方ができます。

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

Facebooktwitterrssyoutubeinstagram