AI Cloud DeepLearning IBM Cloud Jetson LINE Node Red Python チャットボット プログラミング

赤ちゃんをJetson NanoのエッジAIにも見守ってもらう④ - LINEからJetson Nano操作 -

ai baby monitor system

赤ちゃんが泣くと、LINEで通知来るようにしたので

通知が来たら音楽をかけてあげれるようにしたいと思います

家にいる嫁は迷惑かもしれませんが(笑)

スポンサーリンク

システム構成

システム構成は下記図になります。まだWatson Assistantは使わないです。

Node Redから音楽再生指示をするときは、XSERVERを経由せず、直接Jetson nanoに指示できればスマートだと思いますが、とりあえずこの方法で

  1. LINEからかけたい音楽を指定します
  2. 指示された音楽の種類をNodeRedからXSERVERにファイル保存します
  3. Jetson nanoが定期的(数秒)にXSERVERに音楽指示ないか確認
  4. 指示があれば、対象の音楽再生

参照

LINEとNodeRedでチャットボット作る記事は、下記参照ください。

http://hituji-ws.com/ai/line-watson-chatbot/

 

http://hituji-ws.com/ai/line-watson-chatbot-1/

 

http://hituji-ws.com/ai/line-watson-chatbot-2/

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は
色々活用の幅は広がると思います。

-AI, Cloud, DeepLearning, IBM Cloud, Jetson, LINE, Node Red, Python, チャットボット, プログラミング
-, , ,