はじめに
「スマートスピーカーを遊びたおす会 Vol.5」
https://kotodama.connpass.com/event/120483/
呼んでいただいてありがとうございます。
Attention
本日のスライドはQiitaのスライドモードで作っており、説明の中で画面が下スクロールします。
本日のゴール
今日は時間も短いので、AIとAlexa って なんか楽しそうで、なんかできそうだなと思ってもらえることがゴールです。
Who are you?
Tomoharu Itoh(オランダ在住)
https://hugtech.io
- Alexa Champion.
- Assisted By Alexa Certified Skill Builder as Subject Matter Expert.
コミュニティ AAJUG(えーじゃぐ)
https://aajug.connpass.com/
(開発してるひともそうでないひとも、機会と話したいひと、みなさん Welcome です)
鯖を監視するに至った背景
- 海外在住だと日本食が恋しい。
- 幸いなことに毎週土曜、家の近くに市場が出て、新鮮なお魚が買える。
- 1週間保存がきくように、干物にしておきたい。
そしてあいつがやってきた。
Version1 自作物干し機(ボール+網)
流石に無防備すぎた。
Version2(オランダでよく見る自転車のカゴ)
匂いは防ぎようがなく、あいつがやってきた。
鯖の天敵
そして、うみねことの戦いが始まった。
鯖を安全に見守るために必要な課題を整理しよう
- 干してる間、カゴを見とくの辛い。
- あいつが来たら呼んで欲しい。
- ちょっと僕を焦らせて欲しい。(SNSで通知来るだけでは私は性格的にスルーする可能性がある)
実現できそうか考えてみよう。
1. そこにあったの。Deeplens。
AWSの提供するAIカメラ。あくまで初心者用。トレーニングすみのモデルが用意されているので、簡単にAIのパワーを体感できる。

もちろん、ラズパイとかObnizとか、サードパーティのマイコンにカメラくっつけて、オリジナルのモデルを動かしてもOKです。
(これはまた機会があれば、、、)
2. ころがるスマートスピーカーの山
焦らせてくれそうな声で話してくれれば、、、
3. ワタシAWSチョットデキル
AWS Lambdaでだいたいなんでもつながるでしょ。。
設計
アクティビティ図
使うもの的にはこう
さあ、作ってみよう。
Deeplens Object Detection Model
Deeplens にはすでに定義されたモデルがあります。Object Detectionモデルを使ってデプロイします。

証明書を入れ込んだりするのが多少面倒ですが、チュートリアルとドキュメントを読んでがんばりましょう。
MQTT
MQTTはデバイス間でメッセージを軽量にやり取りするサブスリプション型のしくみです。
Deeplensにプロジェクトがデプロイされると、MQTTのメッセージバッファ(トピックといいます)も勝手にデプロイされます。

鳥(ではないかもしれないが)を検知すると、以下のようなメッセージが飛びます。
{ bird: <percent of confidence> }
AWS IoT Rules
デプロイしたモデルはその他にも、Person(人間)とか、Dining(テーブル)とか、いろいろなものを通知してくるので、鳥だけフィルタしたいのです。そういうときには、AWS IoT Rules が使えます。
先ほどのメッセージをSQLクエリでフィルタできます。今回は 「80%くらいの自信があって鳥だって言ってるなら」 と、設定しました。
そして、クエリにマッチした場合Lambda関数を呼ぶということも同じ画面でポチポチ設定できます。

AWS Lambda
AWS IoT Rules から呼ばれるLambda関数です。
後述のAlexa Proactive API をCallするコードです。Callするには、このAPIが許可されたスキルのClientIdとClientSecretが必要です。これは後述します。

コードはこちら
https://github.com/haruharuharuby/bird-detect-message-handler
Alexa Proactive API
Proactive APIは、定型句(スキーマといいます) をAlexaデバイスに通知できる機能です。
「荷物が届きました」 とか 「今日はXXXゴミの回収日です」 とか。
定義済みスキーマの一覧
https://developer.amazon.com/ja/docs/smapi/schemas-for-proactive-events.html
Proactive APIでは、通知をカスタマイズできないので、今回は 嵐 が来たことにします。
AMAZON.WeatherAlert.Activated
なければここからリクエストを送りましょう。みんなが希望していれば届くかもしれません。
https://alexa.uservoice.com/forums/906892-alexa-skills-developer-voice-and-vote
Alexa Skill
Alexa Skill で、Proactive API を使うように構成します。
Alexaのデベロッパーコンソールで、「アクセス権限」 のところに、ClientIdとClientSecretがあります。
前の章で出てきたLambdaのコードで利用します。

一回何かしらの情報取得を有効にしないとメッセージングの項目が出て来ないことがあります。
Skill Manifest
通知は、SkillのマニフェストにPermissionブロックとEventsブロックを記載して、許可してあげる必要があります。

後日談として、当初 AWS CodeStarというサービスの中にAlexa Skillのテンプレートがあり、それでスキルを作ろうとしていたのですが、Manifest がデプロイされないので、やむなくASK CLIでやっています)
Note:
JAWS DAYS 2019 において 「CodeStarでアレクサ スキルでTwillioで電話かけてお金を払わせる」 ハンズオンの資料があります。 CodeStarに興味があればどうぞ。
https://qiita.com/motchi0214/items/a95335679ee7e9d0b660
Alexa App
Alexa の DeveloperConsoleでの作業を終えて、Skillをデプロイして、Alexa Appを見ると、「設定」→「通知」のところに該当するスキルが出てきます。 通知を有効にします。 (開発中だったので、名前がhello nodeになってます)


モバイルアプリでは、画面遷移しないことがあります。そのときは、Webブラウザからアクセスします。
スキルで通知を許可
最後にスキル側でも、通知を許可します。(開発中だったので、名前がhello nodeになってます)

コードはこちら
https://github.com/haruharuharuby/server-room
実際の映像はこちら
テストように、フィルタのパラメータを以下としています。
select person from '<<topic-filter>>' where person > 0.400
実際はこうです。
select bird from '<<topic-filter>>' where bird > 0.800
英語で試していますが、もちろん日本語でもできます。
Alexa Day 2019
それでは4月6日に神戸でお会いしましょう!(ちがうって)
https://alexaday2019.aajug.jp/
