最終更新日
記事公開日

【ラズパイZERO】ボタンを押すと合成音声で今の時間を喋るスピーカー

ラズパイZEROを使って、ボタンを押すと今の時間を喋る装置を作りました。

動画

配線図・必要なもの

ラズパイZEROとスイッチの配線図
  1. セルフパワー型USBハブ
  2. USB ⇔ 3.5 mmジャック変換アダプタ
  3. ダイソーの300円スピーカー(改造)
  4. マイクロUSB(オス) ⇔ USB Type-A(メス)変換コネクタ
  5. マイクロUSB(オス) ⇔ USB Type-A(オス)変換ケーブル
  6. プルダウン用抵抗(10kΩ)
  7. スタート用スイッチ
  8. ダイソーで買った土台

プログラム(voice_sw.py)

# coding: UTF-8

import subprocess,datetime,time
import RPi.GPIO as GPIO

# ピンの指定方法
GPIO.setmode(GPIO.BCM)

# GPIO25
GPIO.setup(25, GPIO.IN)

# ボタンクリック待機中
print("ボタン待機中...")

while (True):

        # 割り込み処理(ボタンを押す&立ち上がりを検知)
        GPIO.wait_for_edge(25, GPIO.RISING)

        # ボタンの長押しを検知するためのカウンター
        cnt = 0;

        while (True):

                if GPIO.input(25) == GPIO.LOW:

                        print("ボタンが押されました")

                        # 合成音声を再生するための関数
                        def voice_play(voice_path):
                                subprocess.call("sudo aplay " + voice_path, shell=True)

                        # 日時の取得
                        dt_now = datetime.datetime.now()
                        hour = dt_now.hour
                        min = dt_now.minute
                        print(str(hour) + "時" + str(min) + "分")

                        # コメントの再生
                        voice_file = "./voice/kazumakun.wav"
                        voice_play(voice_file)

                        # 今の時間は
                        voice_file = "./voice/now.wav"
                        voice_play(voice_file)

                        # 時間ボイスの再生
                        voice_file = "./voice/hour_" + str(hour) + ".wav"
                        voice_play(voice_file)


                        # 分ボイスの再生
                        voice_file = "./voice/min_" + str(min) + ".wav"
                        voice_play(voice_file)

                        # です
                        voice_file = "./voice/desu.wav"
                        voice_play(voice_file)

                        # おやつのじかん
                        if (hour == 15 and min <= 30):
                                voice_file = "./voice/oyatu_yes.wav"
                        else:
                                voice_file = "./voice/oyatu_no.wav"
                        voice_play(voice_file)

                        # よるごはん
                        if (hour == 18 and min <= 59):
                                voice_file = "./voice/dinner.wav"
                                voice_play(voice_file)

                        # ねんね
                        if (hour == 21 or  hour == 20):
                                voice_file = "./voice/nenne.wav"
                                voice_play(voice_file)

                        break

                else:
                        cnt = cnt + 1

                        if (cnt >= 250):
                                print("長押し検知:シャットダウン")
                                subprocess.call("sudo shutdown -h now", shell=True)
                                break

                time.sleep(0.01)

最終版プログラム:voice_sw.txt

最初に書いたプログラム(voice_beta.txt)では、ボタンが押されるたびに毎回、音声合成のデータを作成していました。

ところが、音声データの作成に3秒ほどの時間が掛かってしまい、ボタンが押されてから声が出るまでにラグが発生していました。

そこで最終版では、0時~12時、1分~59分までの音声データをあらかじめ用意するようにしました。

音声作成プログラム:voice_make.txt

OpenJtalkをインストール

合成音声に「OpenJtalk」を使用しています。

あらかじめ、インストールしておいてください。

こちらの記事も参考にどうぞ↓

合成音声「Open JTalk」でハマったこと

cronの設定

ラズパイZEROの電源を入れたタイミングで、自動的に「voice_sw.py」を起動させるためにcronを設定します。

下記のコマンドを入力↓

crontab -e

「@reboot python /home/pi/test.py」を追記して、保存します。

# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

@reboot python /home/pi/voice_sw.py

関連情報

運営者プロフィール
コダマ

職業はIT系フリーランス。過去、電子配線業務の経験が10年ある為、はんだづけも得意です。宮崎県在住、30代・2児の父親。

プロが教える!イチからわかるハンダ付けのコツ(工学社)の著者です。

カテゴリー