こんにちは。大阪オフィスの桶谷です。
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
簡単な構成図はこちら。
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通知が出来ないのもかなり苦しいです。ということで現時点で出来る構成に絞ってみたのがこちらです。
途端にシンプルになりましたね。
- Snowballは入手難易度が高すぎるので使わない
- AlexaはVoice DrivenでASK(Alexa Skills Kit)、Lambdaを使って待ち受ける
- SQSで繋ぐ
ということで構成が決まったので実装です。
AWS IoT Button→AWS IoT→SNS→SQS
この部分は特に新しいことはありません。とてもシンプルです。
- AWS IoT Buttonは ここ からActivate & pre-Config
- SNSからPublishされるQueueをSQSで作成
- 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」を選択します。
Configure event sourcesでは何も変更せずにNextします。Event source typeが「Alexa Skills Kit」になっていると思います。
functionの名前は適当につけましょう。RoleはBasic Execution Roleを割り当てます。後は通知待ちを行うのでAdvanced settingsのTimeoutを5minにしてみました。CodeはSample CodeをベースにSQSのロングポーリングを行う内容にします。Sample Codeは
- Sessionの管理(Sessionの状態ごとの処理)
- IntentTypeごとの処理
- Responseの返却、必要に応じてSessionの終了
と、とてもシンプルなので後述するASK側の設定を見ながら実装しました。
という感じでLambda Functionの作成完了です。作成が終わったら作成したLambda FunctionのARNをコピーしておきます。
次にAlexa Skillの作成です。 ここ を参考にします。ということでAmazon Developer ConsoleのASKの「Add a New Skill」から始めます。
名前を適当につけます。Invocation NameはこのSkillの起動トリガーとなる単語です。出来るだけ会話で使いやすい内容にしておくとAlexaと自然な会話が出来ます。Endpointには先に作成したLambda FunctionのARNを指定します。
次はSkillの心臓部、Intent SchemaとSample Utterancesの設定です。
今回はそれぞれ以下のようにしました。
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とのやり取りをテキストでエミュレート出来る感じです。
Testが上手くいったらPublishing Informationの設定です。必須項目に入力してSaveします。
Saveが完了するとAmazon Echoで実行することが出来ます。alexa.amazon.comに接続し、Skillsを見ると作成したAlexa Skillが表示されています。初期状態はDisableになっているのでクリックしてEnableにしましょう。
ここまで来たら後はAlexaとIoT Buttonを使って実機テストです。Alexaに話し掛けて待ち受け状態にし、IoT Buttonを押下すると、Alexaが「ボタンが押されたよ!」と教えてくれます。
まとめ
Snowball Dash Buttonは実現出来ませんでしたが、簡単にAlexaとIoT Buttonを繋ぐことが出来ました。この辺りはASKのLambdaカスタマイズ、AWS IoT / SQSの疎結合な仕組みのおかげな気がします。今後もAmazon Echo & Alexaをどんどん触っていきたいと思います。