赤ちゃんが泣くと、LINEで通知来るようにしたので
通知が来たら音楽をかけてあげれるようにしたいと思います
家にいる嫁は迷惑かもしれませんが(笑)
目次
システム構成
システム構成は下記図になります。まだWatson Assistantは使わないです。
Node Redから音楽再生指示をするときは、XSERVERを経由せず、直接Jetson nanoに指示できればスマートだと思いますが、とりあえずこの方法で
- LINEからかけたい音楽を指定します
- 指示された音楽の種類をNodeRedからXSERVERにファイル保存します
- Jetson nanoが定期的(数秒)にXSERVERに音楽指示ないか確認
- 指示があれば、対象の音楽再生
参照
LINEとNodeRedでチャットボット作る記事は、下記参照ください。
LINEのリッチメニュー
LINE Official Account Managerのホーム>リッチメニューから設定します。
今回だと、下記のように設定しています。
メニューのアクションは3つ
- 今:写真で今の様子を見る
- 音楽:音楽の再生(今回)
- モニタ:動画で今の様子を見る
Node Redの設定
リッチメニューで音楽を押した場合
メニューの音楽を押すといったん、音楽の種類リストを表示させます。
Node Red側で音楽と受け取ったら、下記のJSONを返信しています。
{
"type": "bubble",
"body": {
"type": "box",
"layout": "vertical",
"spacing": "sm",
"contents": [
{
"type": "text",
"text": "音楽リスト",
"wrap": true,
"weight": "bold",
"size": "xl"
}
]
},
"footer": {
"type": "box",
"layout": "vertical",
"contents": [
{
"type": "button",
"height": "sm",
"action": {
"type": "message",
"label": "楽しい",
"text": "楽しい"
}
},
{
"type": "button",
"height": "sm",
"action": {
"type": "message",
"label": "眠り",
"text": "眠り"
}
}
]
}
}
LINEから受け取ったメッセージが「楽しい」「眠り」
しっかり作るなら、要求が「音楽再生」+「楽しい」OR「眠り」ですが、
とりあえずは、メッセージが「楽しい」OR「眠り」を受け取った場合、
XSERVERにリクエストを送るようにします。
http://***/music.php?type=1みたいに、パラメータのtypeで音楽の種類を指定しています。
1:楽しい
2:眠る
switchのNodeの部分で「楽しい」OR「眠り」で分けて、リクエストを変更しています。
上記、フローのJSON
[{"id":"77743746.003b18","type":"http request","z":"9dcd2848.01a3e","name":"楽しい音楽","method":"GET","ret":"txt","paytoqs":false,"url":"http://***/music.php?type=1","tls":"","proxy":"","authType":"","x":790,"y":380,"wires":[[]]},
{"id":"dd20bf42.b1646","type":"switch","z":"9dcd2848.01a3e","name":"音楽","property":"getMessage","propertyType":"flow","rules":[{"t":"eq","v":"楽しい","vt":"str"},{"t":"eq","v":"眠り","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":630,"y":420,"wires":[["77743746.003b18"],["b0e33210.140398"]]},
{"id":"b0e33210.140398","type":"http request","z":"9dcd2848.01a3e","name":"眠る音楽","method":"GET","ret":"txt","paytoqs":false,"url":"http://***/music.php?type=2","tls":"","proxy":"","authType":"","x":780,"y":440,"wires":[[]]}]
音楽再生要求をXSERVERに保存
Node RedからXSERVERがhttp://***/music.php?type=1のリクエストを受けたら、
単純にファイルに音楽の種類を保存します。
XSERVERにmusic.phpを用意して、中身を下記にしています。
<?php file_put_contents("music.txt", $_GET['type']); ?>
music.txtというファイルを作って、中身をtype=1 or 2で書き込んでいるだけになります。
Jetson nanoで再生
Jetson Nanoでは、定期的にXSERVER上にmusic.txtがないか確認して、
ファイルがあれば、中身の数字で流す音楽を決めます。
Jetson nanoでUSBスピーカーで再生する方法が不明だったので、HDMIで再生しています。
Jetson Nano にpygameをインストール
mp3を再生するのにpygameのライブラリを使います。
下記をインストールする必要があります。
sudo apt-get update
sudo apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
sudo apt-get install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libportmidi-dev
sudo apt-get install python3-pip
pip3 install pygame
再生要求確認
FTPでXSERVER上のmusic.txtを確認して、再生する音楽を選びます。
import pygame.mixer
##FTPでファイル確認
ret = list()
items = ftp.nlst('./{music.txt保存先ディレクトリ}')
##ファイルあれば読み込み
if ('./{music.txt保存先ディレクトリ}/music.txt' in items):
ftp.retrlines('RETR /{music.txt保存先ディレクトリ}/music.txt', ret.append)
ftp.delete('/{music.txt保存先ディレクトリ}/music.txt')
else:
ret.append(0)
fileName = ''
##音楽の種類を確認して、再生する音楽ファイルを選択
#楽しい
if ret[0] == '1':
fileName = '/fun.mp3'
#眠り
elif ret[0] == '2':
fileName = '/sleepy.mp3'
再生
再生する音楽のファイルが確認できれば、pygameを使って再生。
if len(fileName) > 0:
#音楽再生
pygame.mixer.init()
pygame.mixer.music.load(fileName)
pygame.mixer.music.play(-1)
time.sleep(60)
pygame.mixer.music.stop()
最後に
AIで状態(赤ちゃんが泣く)を検知して、遠隔で操作(音楽再生)することができました。
エッジAIを活用できてきているのではないでしょうか?
状態を検知できているなら、それを集計して見える化するのも良いと思いますし、エッジAIは
色々活用の幅は広がると思います。