- 最終更新日
- 記事公開日
【ラズパイZERO】ボタンを押すと合成音声で今の時間を喋るスピーカー
ラズパイZEROを使って、ボタンを押すと今の時間を喋る装置を作りました。
動画
配線図・必要なもの
- セルフパワー型USBハブ
- USB ⇔ 3.5 mmジャック変換アダプタ
- ダイソーの300円スピーカー(改造)
- マイクロUSB(オス) ⇔ USB Type-A(メス)変換コネクタ
- マイクロUSB(オス) ⇔ USB Type-A(オス)変換ケーブル
- プルダウン用抵抗(10kΩ)
- スタート用スイッチ
- ダイソーで買った土台
プログラム(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_beta.txt)では、ボタンが押されるたびに毎回、音声合成のデータを作成していました。
ところが、音声データの作成に3秒ほどの時間が掛かってしまい、ボタンが押されてから声が出るまでにラグが発生していました。
そこで最終版では、0時~12時、1分~59分までの音声データをあらかじめ用意するようにしました。
OpenJtalkをインストール
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