Pythonでプログラミングする
今回は日本語音声合成にOpen Jtalkを使用しました。
Open Jtalkは、(1)テキストをwavファイル(音声)に変換して、(2)aplayコマンドでその音声ファイルを鳴らす(つまりしゃべらせる)ということができます。
インストールは
$ sudo apt-get install open-jtalk
インストールすると、Do you want to continue? と聞かれますので、 y を押してEnterします。
インストール時、推奨パッケージ(Suggested Package)がありますので、これもインストールしておきます。
$ sudo apt-get install open-jtalk-mecab-naist-jdic
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001
音声ファイルへの変換としゃべらせるコマンドを一緒にした実行ファイルを作る
毎回 テキストファイルをwavファイルに変換-->しゃべらせる-->wavファイルを削除 をするのは面倒なので、これをsaywd.shという名前の1個の実行ファイルにまとめます。
$ sudo nano saywd.sh
と打って、ファイルに下のスクリプトを記入します。
#!/bin/sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay --quiet $TMP
rm -f $TMP
Ctrl+X --> y を押してEnterキーを押して保存します。
次に、実行ファイルに実行権限を付与します。
$ chmod 755 saywd.sh
これでしゃべらせるための実行ファイルの準備はOKです。
$ ./saywd.sh 何かしゃべってみて
と書いてEnterを押すとしゃべります。
ここでしゃべらない場合は、ここまでのステップをもう一回確認してみてください。
あと、スピーカーがちゃんとなるかどうかも
いつ何をしゃべらせるかの実行ファイルを作成する
では次に、人感センサーの前を通りかかった時に設定した言葉をしゃべらせる内容の実行ファイルをpythonという言語で作成します。
$ sudo nano nichan_supporter.py
と打ってEnterキーを押します。
開いた画面で、以下のスクリプトを貼り付けます。
#turns on and off a light emitting diode(LED) depending on motion sensor
# coding: utf-8
import RPi.GPIO as GPIO #importing the RPi.GPIO module
import time #importing the time module
import subprocess
import datetime as dt
GPIO.cleanup() #to clean up at the end of your script
led_pin =37 #select the pin for the LED
motion_pin = 35 #select the pin for the motion sensor
target1 = "Sさん"
# トーク内容
CMD1 = "./custom_jtalk.sh " + target1 + "、制服に着替えましたか。靴下は履きましたか。"
CMD2 = "./custom_jtalk.sh " + target1 + "、トイレは、もう済ませましたか。もう7時30分過ぎたから、そろそろ行っておかないと、50分に間に合わないよ。"
CMD3 = "./custom_jtalk.sh " + target1 + "、お弁当と水筒は入れてもらいましたか。まだだったら、すぐに入れましょう。"
CMD4 = "./custom_jtalk.sh " + target1 + "、おかえり。制服はハンガーにかけましたか?着替えた服は洗濯物置にもっていきましたか?"
CMD5 = "./custom_jtalk.sh " + target1 + "、宿題とかやらなあかんことはもう終わりましたか。ゲームや工作は、やらないといけないことを済ませてからやりましょう。やらないといけないことが残って後でしんどくなります。"
CMD6 = "./custom_jtalk.sh " + target1 + "、玄関の教科書を2階に片付けましょう。教科書が悲しんでいますよ。"
CMD7 = "./custom_jtalk.sh " + target1 + "、そろそろ晩ご飯ですよ。"
CMD8 = "./custom_jtalk.sh " + target1 + "、9時30分までにお風呂に入りましょう。"
CMD9 = "./custom_jtalk.sh " + target1 + "、そろそろ10時です。寝る準備をしよう。明日の準備は終わってますか。まだならすぐにやりましょう。"
def init():
GPIO.setmode(GPIO.BOARD) #to specify which pin numbering
GPIO.setwarnings(False)
GPIO.setup(led_pin,GPIO.OUT) #declare the led_poin as an output
GPIO.setup(motion_pin,GPIO.IN,pull_up_down=GPIO.PUD_UP) #declare the motion_pin as an input
print("----------------------------------------------------------")
def main():
while True:
value=GPIO.input(motion_pin)
dt_now=dt.datetime.now(); # to get time of now
dt_now_str= "今は" + dt.datetime.strftime(dt_now,'%H時%M分') + "です。"
if value!=0: #to read the value of a GPIO
GPIO.output(led_pin,GPIO.HIGH) #turn on led
time.sleep(2) #delay 2ms
else:
GPIO.output(led_pin,GPIO.LOW) #turn off led
time.sleep(2)
if GPIO.input(led_pin)==GPIO.HIGH:
subprocess.call("./custom_jtalk.sh " + dt_now_str,shell=True)
if dt_now > dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,0,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,30,0,0) :
subprocess.call(CMD1,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,30,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,45,0,0) :
subprocess.call(CMD2,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,45,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,7,50,0,0) :
subprocess.call(CMD3,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,16,0,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,17,00,0,0) :
subprocess.call(CMD4,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,17,0,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,18,00,0,0) :
subprocess.call(CMD5,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,18,00,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,19,0,0,0) :
subprocess.call(CMD6,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,19,0,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,19,30,0,0) :
subprocess.call(CMD7,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,19,30,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,21,30,0,0) :
subprocess.call(CMD8,shell=True)
elif dt_now >= dt.datetime(dt_now.year,dt_now.month,dt_now.day,21,30,0,0) \
and dt_now < dt.datetime(dt_now.year,dt_now.month,dt_now.day,22,40,0,0) :
subprocess.call(CMD9,shell=True)
else:
print "out of range"
time.sleep(2)
init()
main()
GPIO.cleanup()
貼り付けたら、Ctrl+X、続いて y そのあとにEnterを押して実行ファイルを保存してください。
一応これで準備は整いました。
動かしてみる
では、実際に動かしてみましょう。
$ sudo python nichan_supporter.py
ーーーーーーーが出てきたら成功です。センサーに手を近づけて、しゃべらせてみてください。
なお、今回使用したラズパイと部品はAmazonで購入させていただいたものです。
あ、ちなみにチャレンジ中にエラーなどでできないことがあればコメントください。そんなに頻繁に見ていないこともありますが、見たら必ずお返事しますので!
本日も最後まで読んでいただき、ありがとうございました。
ブログランキングに参加しています。
もしよろしければ応援よろしくお願いします。
にほんブログ村
【このカテゴリーの最新記事】
- no image