なかなか来てくれなかった Amazon Echo Dot の招待がようやく来たので、早速買ってみました。
ある日、テレビでたまたま、平井堅のノンフィクションという曲に合わせて踊る平手友梨奈さんを観て衝撃を受けて以来、欅坂46 の事ばっかり考えているし CD や雑誌をすごい勢いで買って COUNTDOWN JAPAN ではライブも観て来ました。避雷針すごく良かったです。
というわけで題材は欅坂46 です。
作ったもの
今のところ 2 つの機能があります。
- 特定の日にちのスケジュールを読み上げる
- 特定の日にちまたは月が誕生日のメンバーを読み上げる。
なお、データについては欅坂46公式サイトから勝手にスクレイピングしているので、公式のストア (?) には登録していないですしそのつもりもありません。ベータテスト機能で自分をテスターとして登録しています。
自分でデプロイできる人はそれでやってみてもいいですし、ちょっと使ってみたい、という方は Twitter に声かけてもらえればベータテスターとして招待することもできます。
ソースコード
GitHub に MIT License で公開しています。
また、Alexa Skill の Intent とかの設定は以下のようになっています。
構成
仕組み
先にも書いた通り、スケジュール・誕生日のいずれも公式サイトのスケジュールページからスクレイピングしてます。
誕生日については、事前にデータだけ用意をしておけばスクレイピングは必要ないですし、メンバー名から誕生日を読み上げる事も実装できるので、そういう感じに作り変えるかもしれません。
必要な情報を元に読み上げる文言を組み立てて、alexa-sdk を使ってレスポンスを返してます。
リクエストを受けて動作するプログラムは AWS Lambda 上で動作しており、Alexa Skill としては基本的な構成だと思います。
作ってみて思ったこと
タイムゾーンは基本的に考えなくて良い
これはもちろん Skill の性質にもよるんですが、今回のケースでいうとタイムゾーンのことを考慮する必要はありませんでした。
今回でいうと「今日」とか「あさって」とか「来週の金曜日」といった感じに日付を指定しますが、これらはリクエストの中に Slot として含まれます。まぁ平たくいうとパラメータです。これは事前に定義したものを受け取れます。
これらの日付については Amazon Echo 側のタイムゾーンに基づいて送られてくるようで、例えば日本時間 12 月 31 日の午前 4 時は UTC ではまだ 12 月 30 の 19 時ですが、Lambda には「2017-12-31」という文字列で受け取れます。
開発中にハマったのが、Service Simulator から「今日」と送ると前日の日付が送られて来て、おそらく UTC の日付が送られて来ていたんですが、Amazon Echo Dot 実機からだと JST と思われる日付で受け取れていました。
今回は日付ベースの処理しかなかったのでこういう結論になりましたが、例えば時刻の計算を行うようなアプリとかだと当然タイムゾーンは考慮する必要があると思います。
開発中はフィードバックのループを回すのが大変
作る前から想像していましたが、やはり試行錯誤を繰り返すのに時間がかかります。
今回は CircleCI で AWS Lambda へのデプロイを自動化したところで効率よく回せるようになって来ました。
本番用とテスト用二つの Alexa Skill を登録しておいて、機能ブランチへの push ごとにテスト用のアプリを更新、master にマージすると本番を更新、としています。
今のところ awscli のインストールに時間がかかってしまっていて、あらかじめインストールした Docker Image を作っておけば短縮できると思いますが、まぁその辺は後回しで。
あとはスケジュールの取得とか誕生日の取得とかの部分は独立してテストできるようにしておくと細かくテストできて良かったです。
手軽にハックできて楽しい!
先に Google Home も買っていて、そっちは Nature Remo と IFTTT を組み合わせて照明、テレビ、エアコンの操作に毎日使っていますが、まだアプリの開発には手を出していません。
一方 Alexa は Lambda に Node.js のコードをちょっとデプロイするだけで簡単に動かせてお手軽なので、購入初日から手をつけていました。
事前に AWS のアカウントを持っているかとか、Lambda を触ったことがあるかによっても変わってくるとは思いますが、その辺を仕事で触っている人には本当に簡単だと思います。