Alexaを喋らせるだけならGCPの永久無料枠を使うのも良いなと思ったけどGoogle Home Miniしか置いていない部屋もあるのでChromecastによる発話も対応するためにRaspberry PiでNode-RED環境を構築します。ちょっと長くなるので全4回の予定。
- 前回
- Slack Botを作成して設定
- Slackからのリクエストを受けるためのノードnode-red-contrib-chatbotを追加
- ngrokでSlackからのリクエストを受け付ける
- Slackの特定チャンネルへの投稿のみをAlexaに読んでもらう
前回
前回はAlexaを喋らせるためのモジュール「node-red-contrib-alexa-remote2」をインストール、設定、喋らせてみるところまでを行いました。
今回はSlackの特定チャンネルに投稿したらAlexaが読み上げるという状態にするため、Slack Botの作成、ngrokで公開するところまでを進めていきます。
Slack Botを作成して設定
英語だしちょこちょこ仕様変更されるので迷うこともありますが、今回必要な設定は割と少ないです。
https://api.slack.com/apps にアクセスして「Create App」からアプリを作成
OAuth & Permissionsに移動して必要な権限を付与してインストール
User Token Scopes で channels:history を追加
Slackからのリクエストを受けるためのノードnode-red-contrib-chatbotを追加
かなり多くのノードが追加されますが今回使うのはSlack Inのみ
フローに追加してダブルクリックするとこのようなメニューが表示されるのでBot configuration (development)に設定を追加
Bot Name、Bot Token、Signing Secretを入力
Bot User OAuth Access TokenはOAuth & Permissions内
Signing SecretはBasic Information内にあります
ngrokでSlackからのリクエストを受け付ける
Slack Botの認証設定は完了しましたがインターネット経由でRaspberry Piが情報を受け取るために ウェブ上へ公開する必要がありますが自宅のネットワークを公開しておくのは危ないのでngrokというVPNトンネルサービスを使います。
以前までは別途ngrokをインストールしていましたが、どうやらNode-REDのモジュールも存在しているようなので活用しましょう。
※アカウントがない場合は登録しておくこと
node-red-contrib-ngrok パッケージをインストール・設定
ngrokノードを追加して認証情報を設定
Slackのときと同様にauthtokenの編集マークからアカウントの追加画面へ移動し ngrok - secure introspectable tunnels to localhostで確認できる自分のトークンを入力
その他の情報はPort:3001
、Region:Japan
、Protocol:HTTP
と設定して完了
injectを2つ追加
injectの1つはmsg.payload=on
、もう一つはmsg.payload=off
にしてngrokノードに接続
onをクリックしてngrokのURLを生成
生成されたURLをコピーしておいてからデプロイ
Slack Botの設定画面に戻ってEvent Subscriptionを設定
まずはコピーしたngrokのアドレス末尾に「/test」を追加してアクセスして「ok」と表示されるか確認
https://XXXXXXXX.jp.ngrok.io/test
アドレス末尾に「/events」を追加したものをSlack botの設定画面 Event Subscriptions の Request URL に設定
https://XXXXXXXX.jp.ngrok.io/events
Subscribe to events on behalf of users に message.channelsを追加
忘れずにSave Changesを押して保存。チャンネルに投稿されたメッセージをNode-REDに対して送信する設定が完了しました。
Slack InノードにDebugノードを接続して正常にデータが転送されているか確認
Debugノードを接続してデプロイ
Slackのチャンネルで何かしら投稿してみてデバッグウィンドウにデータが表示されるか確認
Slackの特定チャンネルへの投稿のみをAlexaに読んでもらう
switchノードによるチャンネル条件分岐
間にswitchノードを追加して条件分岐することで特定チャンネルだけ処理させます
チャンネル情報はmsg.payload.chatId
に格納されているのでmsg.payload.chatId == <対象のchatId>
のように設定
Alexa Routineの設定
Alexaに喋ってもらう内容はmsg.payload.content
に格納されているのでTextの値として設定
忘れずデプロイしてからSlackにメッセージを投げてみましょう
あとは色々喋らせてあそぶだけーーー。
Slack→ngrok→Node-RED→家中のAlexaデバイスが読み上げ。ノーコードで出来ました。あとで構築記事を上げます。Raspberry Piのイントネーションw#アレクサ #Alexa #NodeRED pic.twitter.com/r9fXA92VFi
— marumo (@marumo0014) 2020年9月24日
次回はGoogle Home miniたちも同時に喋らせるように設定していきます。