赤ちゃんが泣くと、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を返信しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
{ "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
1 2 3 |
[{"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を用意して、中身を下記にしています。
1 |
<?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のライブラリを使います。
下記をインストールする必要があります。
1 2 3 4 5 6 7 |
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を確認して、再生する音楽を選びます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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を使って再生。
1 2 3 4 5 6 7 8 |
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は
色々活用の幅は広がると思います。