【RaspberryPi】Amazon Echoを使った音声認識でNode-REDの処理を行う

以前のエントリーの続きになります。今回はAmazon Echo音声認識を使用してNode-REDの処理を行います。

Node-REDAmazon Echoを使用するノードは実は80番ポートでしか待機ができないようになっています(昔は別ポートでもできたみたいな感じ?)そのため、ポート80を別のプロセスで使用していると使用できないという状況のようです。そのため、もし80番ポートを使用しているプロセスが既にあるようであれば、そちらの使用ポートを変更することが妥当かと思います。(最近はhttpsでなければ公開できないことが多いですが、ローカルのプログラムでは割とhttpをつかっていることもあるのでそのための対応と思ってください。)

以下のエントリも参考にさせていただいております。

参考

AmazonEchoからRaspberryPiのコマンドを実行する(node-red-contrib-amazon-echo): パソコン鳥のブログ

uepon.hatenadiary.com

f:id:ueponx:20200817221506p:plain

そこで、以前行ったネットワークインターフェースに複数のIPアドレスを設定し、さらにポートフォワードを行うことで対応を行っていきます。ポート80番が使用できるのであればこんな方法を使用する必要はないです。

今回の手順

かなり手順が多いので先に手順をまとめておきます。

  • ネットワークの設定
  • Node-REDの拡張をインストール
  • フローを作成
  • Amazon Echo側の設定
  • 動作テスト

では、この順番に設定を行っていきます。

ネットワークの設定(セカンダリーIPの設定)

先ほどの参考エントリーを使って、セカンダリIPを無線ネットワークのインターフェースに設定をしていくようにします。 今回使用するIPアドレスのレンジは192.168.0.*/24です。その中の192.168.0.100セカンダリIPとして使用します。 もし、参考にされる場合には適宜IPアドレスを読み替えて行ってください。

ネットワークの設定スクリプトを以下のように記述します。node-red-contrib-amazon-echoというのは後述する、Amazon Echoを使用するNode-REDのパッケージ名になります。

設定スクリプト…【start_node-red-contrib-amazon-echo.sh】

#!/bin/bash

## IPが含まれるかどうか調べる
if [ "`hostname -I | grep '192.168.0.100'`" ]; then
        echo "設定済のため処理終了"
else
        echo "未設定のため設定実行"
        sudo /sbin/ip addr add 192.168.0.100/24 dev wlan0
        sudo /usr/sbin/iptables -A PREROUTING -t nat -p tcp -m tcp -d 192.168.0.100 --dport 80 -j REDIRECT --to-port 8000
fi

スクリプトができたら、実行権限を与えます。個人的な好みで権限は数値で指定しています。

設定スクリプトに実行権限を与える

$ chmod 755 start_node-red-contrib-amazon-echo.sh

Node-REDの使用前に以下を実行

$ ./start_node-red-contrib-amazon-echo.sh

または.bashrcなどに以下のような処理を追加してもよいのですが、設定したIPがセカンダリ側にならないようなので、手動で起動するほうが安心かもしれません。

.bashrcに追加する処理

#!/bin/bash
if [ -f ~/start_node-red-contrib-amazon-echo.sh ]; then
        ./start_node-red-contrib-amazon-echo.sh
fi

これでネットワーク部分の設定ができました。

Amazon EchoからのアクセスはセカンダリIPである192.168.0.100:80でアクセス待ちをします。

Node-REDの拡張をインストール

続いてはNode-REDからAmazon Echo音声認識を使用するための拡張ノードのインストールになります。拡張ノードのインストールはこれまでのものを大きくは変わりません。インストールする拡張ノードの名前はnode-red-contrib-amazon-echoとなります。

では拡張ノードをインストールしていきます。フローエディタの右上にある【三】ボタンをクリックしてプルダウンメニューを開き【パレットの管理】を選択します。

f:id:ueponx:20201013003128p:plain

ユーザ設定のウインドウが開いたら、【ノードを追加】タブをクリックします。

f:id:ueponx:20201013003132p:plain

追加するノードを検索する表示になるので

f:id:ueponx:20201013003135p:plain

検索の入力ボックスにamazon-echoと入力すると、今回インストールするnode-red-contrib-amazon-echoが候補として表示されます。表示を確認して、【ノードを追加】ボタンをクリックします。

f:id:ueponx:20201013003138p:plain

インストールを確認するダイアログが表示されるので、さらに【追加】ボタンをクリックして作業を進めます。

f:id:ueponx:20201013003142p:plain

するとインストール作業が進みます。途中経過が気になるようであれば、【ログを確認】ボタンをクリックするとインストール作業の様子を確認することもできます。

f:id:ueponx:20201013003145p:plain

インストールが完了すると以下のような表示が行われます。正常にインストールが行われパレットに拡張ノードが追加されました。作業が終わったら、【閉じる】ボタンをクリックして終了します。

f:id:ueponx:20201013003149p:plain

パレットの一覧の入力カテゴリーの中にamazon echo hubamazon echo deviceの2つが追加されていれば正常にインストールは行われています。

f:id:ueponx:20201013003152p:plain

フローを作成

では、node-red-contrib-amazon-echoを使用したフローを作成してみます。

Amazon Echo HubノードAmazon Echoデバイスからのアクセスを担い、

f:id:ueponx:20201013002726p:plain

Amazon Echo DeviceノードAmazon Echoデバイスから来た入力の処理を行います。

f:id:ueponx:20201013002742p:plain

単純なフローは以下のような形式になると思います。各ノードをマウスを使ってドラッグ&ドロップして、端子を接続してフローを作っていきます。最後はAmazon Echoデバイスから得られた状態を表示するためにdebugノードをフローの最後に配置しておきます。

f:id:ueponx:20201013002825p:plain

続いては配置したノードのプロパティを編集していきます。amazon-echo-hubノードをダブルクリックしてプロパティ画面を開きます。ここで編集するのはPortの値となります。今回は、セカンダリIPからルーティングされてきた8000番ポートの設定します。値としては8000を入力します。入力が終わったら【完了】ボタンをクリックします。

f:id:ueponx:20201013002851p:plain

次にamazon-echo-deviceノードをダブルクリックしてプロパティ画面を開きます。ここで編集するのはNameの値となります。これはAmazon Echoデバイスで呼びかけられたデバイス名になります。好きな名前にすればよいのですが、今回は処理とすることにしました。値としては処理を入力します。入力が終わったら【完了】ボタンをクリックします。

Echoデバイスへ話かける際は「アレクサ、処理をONにして」「アレクサ、処理をOFF」などといえば反応をしてくれます。

f:id:ueponx:20201013002854p:plain

これでシンプルなフローの設定ができました。あとは【デプロイ】ボタンをクリックしてフローを完成させます。

f:id:ueponx:20201013002857p:plain

解説

この拡張ノードはプロパティで指定したIPアドレスの8000番ポートに来たデータをトリガーとして処理するようになります。

Amazon Echoバイスはネットワーク内の80番ポートにブロードキャストして、見つかったデバイスを使用するようになっています。今回の例ではブロードキャストされたデータは先ほど設定したRaspberry PiセカンダリIPである192.168.0.10080番が受信することになります。受信されたデータはルーティングされて、オリジナルのIPアドレスである192.168.0.7にの8000番ポートで受信待ちをしているNode-REDAmazon-Echo-Hubノードにデータが送られて処理が行われます。

データの流れ

Amazon EchoバイスRaspberry Pi(192.168.0.100:80)→ (ルーティング)→Raspberry Pi(192.168.0.7:8000)→ Node-RED(Amazon Echo Hubノード)→後続のフロー処理

Node-REDの処理部分は1つの連携した(連携可能なPhilips Hueなどと同様の)デバイスとして扱われると思えば簡単かもしれません。

Amazon Echoアプリの設定

制御されるデバイスNode-REDの処理)ができたので後はAmazon Echo側の連携を行っていきます。この設定を行わないと先ほどのフローは動作しませんのであしからず。

設定はスマートフォンのアプリを使用します。自分はAndroidを使用しているのでそちらのアプリで設定しますが、基本的にはiPhoneでも大きくは変わらないと思いますが、アプリのバージョンによって表示が少し変わっている可能性もありますので、ご注意ください。

※以降の画面表示は2020年10月13日現在(バージョンは2.2.367265.0)のものになるので、今後同じ表示ではないかもしれません。

まずは、Amazon Alexaアプリをインストールしておいてください。その後、アプリを起動します。起動後に画面の下にあるデバイスアイコンをタッチし、

f:id:ueponx:20201014003646p:plain

バイス画面に表示が変わったら、画面上方にある+ボタンをタッチします。

f:id:ueponx:20201014003649p:plain

すると、画面下部から以下のように表示が伸びてきます。ここで、【デバイスの追加】をタッチします。

f:id:ueponx:20201014003654p:plain

セットアップするデバイスの種類が表示されるのですが、もちろん今回Node-REDで作成したデバイスは一覧には表示されません。そこで、デバイスの検出を行っていきます。デバイスリストをスクロールしていき

f:id:ueponx:20201014003657p:plain

【その他】をタッチして選択します。

f:id:ueponx:20201014003700p:plain

すると、デバイスの検出して、Alexaに接続する画面に切り替わります。ここで【デバイスを検出】ボタンをタッチします。

f:id:ueponx:20201014003703p:plain

すると、デバイス検出の処理が行われます。

f:id:ueponx:20201014003706p:plain

すると以下のような表示が行われます。照明?と思うかもしれませんがこれで問題はありません。Node-REDで作成されたデバイスは照明デバイスをエミュレーションしたものになるので、このような表示になります。 あとは【デバイスをセットアップ】ボタンをタッチして、セットアップ処理を行います。

f:id:ueponx:20201014003709p:plain

セットアップ処理が終わるとデバイスをグループに追加するかどうか尋ねられます。今回はグループに追加するのはスキップするので、【スキップ】をタッチします。グループに登録する場合は【グループを選択】ボタン側をタッチしていってください。

f:id:ueponx:20201014003712p:plain

これで設定は完了するのですが、デバイス名が文字化けしています。実はこのままではNode-REDとの連携はうまくいきません。そこで、一度処理を完了して、デバイス名を変更していきます。【完了】ボタンをタッチします。

f:id:ueponx:20201014003716p:plain

【完了】ボタンを押すとデバイスの画面になります。検出直後は検出したデバイスの表示ができるので【表示】をタッチしますが、【すべてのデバイス】ボタンをタッチしても同じ画面に移動できます。

f:id:ueponx:20201014003720p:plain

移動すると、文字化けしたデバイスが見つかるので、それをタッチします。(照明デバイスなので照明のアイコンのものになっているかも確認するといいかもしれません)

f:id:ueponx:20201014003724p:plain

タッチするとデバイスの画面に移動します。そこで画面の右上にある歯車のアイコンをタッチします。このアイコンで設定画面に移動します。

f:id:ueponx:20201014003728p:plain

一番上にデバイス名が表示されていますが、見事に文字化けしています。下にある【名前の編集】をタッチして名前を変更します。

f:id:ueponx:20201014003731p:plain

Node-RED側で処理としているのでこちらも同じ名前にします。

f:id:ueponx:20201014003734p:plain

これでアプリ側の設定も変更して、Node-REDと連携ができるようになりました。

動作テスト

では、動画を行ってみます。文字化けのまま進めたのが以下になります。デバイスが見つからないというエラーが発生してしまいます。


【Node-RED】デバイス名が文字化け状態での実行…失敗(node-red-contrib-amazon-echo)

バイスの名前を修正すると以下のようになります。


【Node-RED】デバイス名を正常にして実行…成功(node-red-contrib-amazon-echo)

f:id:ueponx:20201014235619p:plain

f:id:ueponx:20201014235534p:plain

Node-RED側はデバイス名のあとの言葉であるONやOFFなどをdebugノードで取得できます。例えばこれをGPIOのピンに設定することができればLEDのON/OFFを行えます。(ONを1とし、OFFを0にするなどの変化は必要になります)

おわりに

いろいろありましたが、Node-REDからAmazon Echo音声認識を使用してノードなど(プログラム)実行できるようになりました。基本的にはNode-REDで使用できる処理は使用できます。 音声認識時に本当に処理をするかの確認をさせられるので、一瞬で起動できるわけではないのでそのあたりは少し思ったのとは違うかなという印象です。

ただお手軽に音声認識を使用して、処理を行えるのは楽しいと思います。ただ、リレーのON/OFFぐらいであればスマートプラグを使用するほうがいいかなとは思いますが、音声認識REST API、判断、処理というような一連の処理があるのであればこの方法が向いているかなと思います。

参考 vogel.at.webry.info

uepon.hatenadiary.com

f:id:ueponx:20201015000045p:plain

/* -----codeの行番号----- */