Amazon EchoとAWS IoT Buttonを繋いでみる

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

こんにちは。大阪オフィスの桶谷です。

re:Invent 2015が終わって約3週間。各地で色々なre:Invent 2015報告会が開催されています。

私も サバソニ #007 と JAWS-UG 大阪 Special re:Invent 2015報告会 でお話させていただきました。

両方とも、私がre:Invent 2015で一番気になったAmazon Echo & Alexaについて、概要とか仕組みとかをお話したのですが、せっかくなので何か作りたいなーと思って閃いたのが「re:Invent 2015で見た物理デバイス全部つながらないかな?」でした。そこで妄想したのが「Snowball Dash Button & Alexa Notification」です。

Snowball Dash Button & Alexa Notification

簡単な構成図はこちら。

SnowballDashButton

AWS Iot Buttonを押すとAWS IoTのactionでLambda Functionを呼び出し、AWS Import / Export SnowballのAPIを実行してSnowballを依頼、Snowballの状態・追跡についてはSNSに通知されるので、その通知をAmazon Echo(Alexa)で音声化、です。

妄想が整理された後は実現可能性の確認です。色々調査したところこの仕組みには以下の課題がありました。

  • Amazon EchoとAWS IoT Buttonに技適マークがない
  • 現状、AWS Import / Export SnowballがTokyo Regionにない
  • AlexaがVoice Driven

技適マークはいいとして(よくない)、Snowballを調達出来ないのは致命的です。また現在はAlexaがVoice Drivenのみで外部からのPush通知が出来ないのもかなり苦しいです。ということで現時点で出来る構成に絞ってみたのがこちらです。

IoTButtonAndAlexa

途端にシンプルになりましたね。

  • Snowballは入手難易度が高すぎるので使わない
  • AlexaはVoice DrivenでASK(Alexa Skills Kit)、Lambdaを使って待ち受ける
  • SQSで繋ぐ

ということで構成が決まったので実装です。

AWS IoT Button→AWS IoT→SNS→SQS

この部分は特に新しいことはありません。とてもシンプルです。

  1. AWS IoT Buttonは ここ からActivate & pre-Config
  2. SNSからPublishされるQueueをSQSで作成
  3. 1で自動的に作成されるSNSのTopicのSubscriptionに2で作成したQueueを登録する

サラッとやってしまいましょう。QueueのPermissionsはEverybodyにAll SQL ActionsをAllowしました。

Amazon Echo(Alexa)→ASK→Lambda→SQS

ここではAlexa Skillの作成、Lambda Functionの作成が必要です。

先にLambda Functionから作ります。LambdaにASK用のblueprintが用意されているのでそれをベースにします。

Lambda Functionの最初のblueprint選択でFilterに「alexa」と入れると2つ出てくるので「alexa-skills-kit-color-export」を選択します。

alexa-lambda1

Configure event sourcesでは何も変更せずにNextします。Event source typeが「Alexa Skills Kit」になっていると思います。

alexa-lambda2

functionの名前は適当につけましょう。RoleはBasic Execution Roleを割り当てます。後は通知待ちを行うのでAdvanced settingsのTimeoutを5minにしてみました。CodeはSample CodeをベースにSQSのロングポーリングを行う内容にします。Sample Codeは

  1. Sessionの管理(Sessionの状態ごとの処理)
  2. IntentTypeごとの処理
  3. Responseの返却、必要に応じてSessionの終了

​と、とてもシンプルなので後述するASK側の設定を見ながら実装しました。

alexa-lambda3

という感じでLambda Functionの作成完了です。作成が終わったら作成したLambda FunctionのARNをコピーしておきます。

alexa-lambda4

 

次にAlexa Skillの作成です。 ここ を参考にします。ということでAmazon Developer ConsoleのASKの「Add a New Skill」から始めます。

alexa-ask1

名前を適当につけます。Invocation NameはこのSkillの起動トリガーとなる単語です。出来るだけ会話で使いやすい内容にしておくとAlexaと自然な会話が出来ます。Endpointには先に作成したLambda FunctionのARNを指定します。

alexa-ask2-1

次はSkillの心臓部、Intent SchemaとSample Utterancesの設定です。

alexa-ask3

今回はそれぞれ以下のようにしました。

Intent Schema

{
  "intents": [
    {
      "intent": "WaitforNotificationIntent",
      "slots": []
    },
    {
      "intent": "HelpIntent",
      "slots": []
    }
  ]
}

Sample Utterances

WaitforNotificationIntent yes please
WaitforNotificationIntent yes
WaitforNotificationIntent sure
HelpIntent help
HelpIntent help me
HelpIntent what can I ask you
HelpIntent get help
HelpIntent what commands can I ask
HelpIntent what commands can I say
HelpIntent what can I do
HelpIntent what can I use this for
HelpIntent what questions can I ask
HelpIntent what can you do
HelpIntent what do you do
HelpIntent how do I use you
HelpIntent how can I use you
HelpIntent what can you tell me

Alexaとの会話イメージは

  • 人「Alexa, 通知を待ってね」
  • Alexa「わかったよ。始めてもいい?」
  • 人「いいよ」

みたいな感じです。特にAlexaに伝える必要がある項目(引数、変数)は無いのでSlotsは設定しません。

次はTestです。このTestがかなり便利です。作ったAlexa Skillをテスト出来るのですが、入出力をテキストで入力することが出来ます。Enter Utteranceに人が話すフレーズをそのまま入れてボタンをクリックするとSkillを実行してLambda Functionも実行してResponseが表示されます。Sessionの管理も出来るのでAlexaとのやり取りをテキストでエミュレート出来る感じです。

alexa-ask4

Testが上手くいったらPublishing Informationの設定です。必須項目に入力してSaveします。

alexa-ask5

Saveが完了するとAmazon Echoで実行することが出来ます。alexa.amazon.comに接続し、Skillsを見ると作成したAlexa Skillが表示されています。初期状態はDisableになっているのでクリックしてEnableにしましょう。

alexa-dev

ここまで来たら後はAlexaとIoT Buttonを使って実機テストです。Alexaに話し掛けて待ち受け状態にし、IoT Buttonを押下すると、Alexaが「ボタンが押されたよ!」と教えてくれます。

まとめ

Snowball Dash Buttonは実現出来ませんでしたが、簡単にAlexaとIoT Buttonを繋ぐことが出来ました。この辺りはASKのLambdaカスタマイズ、AWS IoT / SQSの疎結合な仕組みのおかげな気がします。今後もAmazon Echo & Alexaをどんどん触っていきたいと思います。

 

AWS運用自動化サービス「Cloud Automator」