Alexa献立発表スキル作ってみた
僕は寮生なので毎日のご飯は寮食堂で食べています。給食みたいなもんです。そこで寮食堂の献立を発表するAlexaスキルを作ってみました。製作期間は大体3週間くらいです。この記事は思った事の殴り書きです。あまり技術的なことは書いていないですぜよ
Alexaスキルとは
Alexaスキルは、Alexa搭載端末に機能を追加する音声起動アプリです。
スキルを使用して機能を追加することで、Alexaでの新しい体験が可能になります。スキルには次のようなさまざまなカテゴリーがあります。
とのことでAlexaに追加できる拡張機能のようなものですな
作ろう
大まかな流れを書き留めておくだけなので詳しい説明は飛ばします。Alexaスキルについて、ほかの方が公開している記事や公式によるクイックスタートも充実しているので作りやすいかと思います。
見通し
寮食堂を運営する会社が毎週Googleドライブに献立のPDFをアップロードしています。生徒はそのファイルを自由に閲覧することができるので、それを使用します。
具体的な構成図はこんな感じです。
サービスは主にAWSを使用しています。Alexaは発句された内容をAlexa Voice Serviceが処理しますが、そこからさらにレスポンスを生成するAlexaのホストが必要です。僕は都合がありself-HostedとしてAWS Lambdaを使用しましたが、Alexa-Hostedを使用すると、AmazonがAWS無料枠を提供しているので、基本無料で開発ができます。S3やDynamo DBのストレージも提供しているようです。さらにAWSを使用することがない(つまりはAlexa Consoleで開発が完結する)のでちょっとしたスキルを作成するならAlexa-Hostedを使用する方が簡単で早いですねー
今回は
- 献立のダウンロードから処理を行うLambdaを一週間に一度実行
- その献立をまとめたJsonをS3にアップロード
- Alexaスキルが呼び出されるたびにアップロードしたJsonを読み取り
- Alexaがしゃべる
という流れです。
Alexaスキルの登録
スキルを作成するにあたってまず初めにAlexa developerに登録します。
アカウントが作成できたら早速スキルを作成します。
写真右にSkill buildingのチェックマークがあり、それを解決していくとSkillが完成します。
呼び出し名、インテント、スロットを作成します。今回は呼び出しフレーズは「献立」、トリガーはwhenとdate、それぞれカスタムトリガー(朝、昼、夜、夕)とAMAZON.DATE、インテントはとりあえず「{date}の{when}ご飯を教えて」としました。使うのは自分だけなのでいったんこれだけとします。
さらにAWS LambdaのARNをバックエンドとして登録します。AlexaAlexa-Hostedを使うとここは必要ないです。リージョンって何なんですかね?僕はシドニーを使いました。
ARNの他にはHTTPSも選択できるので、RenderとかHerokuでAPI作れば多分できます。
GCPの登録、設定
kondate-backendはGoogleドライブからファイルを取ってくるのでGoogle Drive APIを使います。
APIとサービス->認証情報からサービスアカウントを新規作成、サービスアカウントの編集画面からキーのタブがあるので新規作成し、Jsonをダウンロード、実行ファイルと同じディレクトリに配置します。ここで言う実行ファイルは次のLambda関数のハンドラと同じディレクトリを指します。
僕は初めローカルでユーザアカウントのOAuth2認証をして、JsonをLambdaにアップロードしてましたが、どうやら他ファイルの書き込みができないらしく(IAMかも)、トークンが変更できないのでサービスアカウントにしました。
Lambdaの設定
構成図からもわかる通り、AWS Lambdaはkondate-backendとalexa_hostの2つ用意しています。kondate-backendはGoogleドライブから献立をまとめたJsonを生成、S3に保存する関数で、トリガーはEventBridgeによるCron式で毎週土曜日に実行されます。
Alexa_hostはその名の通り、Alexaからのリクエストを処理、S3からJsonを取得し、レスポンスを生成する関数です。トリガーはAlexaです。
Lambdaはpipのインストールとかの機能ありません。レイヤーを作成する必要があります。
ローカルのpipでダウンロードし、zipファイルにまとめ、一旦S3にアップします。そのあとレイヤーから持ってきます。
numpyのimportでハマったした話は、また別の記事にまとめておきます。
EventBridgeの設定
あとはkondate-backendのトリガーをEventBridgeに登録するだけです。
EventBridgeにもいろいろ種類ありますが、今回Saasに流用するということでPub/Subのルールを使います。Cron式は 毎日0時に動くようにしました。cron(0 15 * * ? *)です。*いつ更新されるかわからないためです。なんか傾いてる。。。。cron(0 0 ? * 7 *)
として登録しました。毎週土曜日に働きます。
なんか曜日と月は同時に「**」にできないらしいです。一方を決めるときはもう一方は「?」である必要があります。
そんでターゲットとLmabdaのトリガーを両方EventBridgeに登録して終わりです。
結果
うまくできました。AMAZON.DATEを使用しているので、日付についてはある程度のブレがあっても許容されます。
おわり
今回始めてAWSを使用しました。何となく倦厭してましたが、使ってみると意外と敷居も低くて使いやすかったです。S3やEventBridgeなんかはサーバの考えも不要で、ノーコードで使えるので結構いいですね。
今回本当にざっくりとしか書いていないですが、読んでくださりありがとうございました。
ソースコード
貼っときます
Discussion