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

この記事は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」無料トライアルはこちらから

COMMENT ON FACEBOOK