さやかちゃんドットネット

とある情報系学生のブログです。

ブログ移転しました→blog.sayakachan.net

Google HomeとChinachuで"今日のアニメ"アシスタントを作った

自分が追っているアニメの放送時間がパッと分かるような仕組みがあったらいいな~と思ったのでGoogle Homeのアシスタントを作りました。

できること

番組情報はChinachuの予約済み/録画中/録画済みから抽出しています。

「OK Google, (一昨|昨|今|明|明後)日のアニメ」
あるとき
->「 (一昨|昨|今|明|明後)日は${番組情報リスト.map(e => `${e.時刻}から${e.チャンネル名}で${e.番組名}`).join('、')}です。」
ないとき
->「(一昨|昨|今|明|明後)日の番組が見つかりませんでした。」

youtu.be

構成

f:id:shira7867:20190224194612p:plain

①Chinachu γ

ありがたいことにREST APIが用意されています。予約済み/録画中/録画済みリストを取得するには/reserves/recording/recordedが使えます。

REST API · Chinachu/Chinachu Wiki · GitHub

②Nginx

ローカルのChinachuをリバースプロキシで外に出しています。Basic認証を設定しています。

AWS Lambda

Dialogflowから飛んできたリクエストを捌いて、Google Homeに喋らせるメッセージを作ります。Dialogflowから飛んでくるリクエストと返すべきレスポンスは以下のドキュメントページを参照しました。expectUserResponse: falseにすることでGoogle Homeに喋らせたらそのままアプリを終了させることが出来ます。(そうしないと「キャンセル」とか言わないと自作アプリから抜けられない)

developers.google.com

メッセージを作る際にはLambdaからChinachuに先のREST APIを用いて問い合わせて得られた番組情報リストをDialogflowで飛んできた日付でフィルタリングして残った番組情報を使っています。深夜番組特有の25時があるので朝の5時を日付の変更線にしています。ソースコードGitHubに上げています。

github.com

Lambdaの環境変数タブに認証等に必要な情報を入れています。(パスワードを平文で入れて大丈夫なんだろうか...)

f:id:shira7867:20190224181826p:plain

Amazon API Gateway

リソース

  • POST/chinachu-linkage
  • 認証なし
  • APIキー必須
  • 統合タイプLambdaファンクション

こちらの記事でも言及されているようにメソッドレスポンスのコンテンツタイプをapplication/json; charset=UTF-8にしないとGoogle Assistantで日本語が文字化けしてしまいました。

ステージ

devを作成しました。

APIキー

my_apiを作成しました。

使用量プラン

ロットリングとクォータを無効にしてbasicを作成し、関連付けられた API ステージにchinachu-linkagedevを追加し、my_apiを使用量プランに追加しました。

⑤Dialogflow

1. Entities

daywordというエンティティを作りました。 f:id:shira7867:20190224190832p:plain

2. Fulfillment

Webhookを有効にしてRLをdevステージのものにし、Headerにx-api-key: my_apiのキーを追加しました。

3. Intents

「今日のアニメ」というIntentsを作成し、Training phrasesタブに「今日のアニメ」と入力しました。するとGoogleは賢くて「@daywordのアニメ」という文章に反応してくれるようになります。

f:id:shira7867:20190224192926p:plain

またFulfillmentタブでこのインテントに対するWebhookを有効にしました。

f:id:shira7867:20190224193034p:plain

4. Integrations

Google Assistantを選択します。

Google Assistant

DialogflowとGoogle Assistantを連携した時点で自動的に実機でも作ったアプリが起動できるようになりました。またInvocationでDisplay Nameを「今日のアニメ」にしました。

ルーティン(ショートカット)の作成

現状までで「OK Google, 今日のアニメにつないで(一昨|昨|今|明|明後)日のアニメを聞いて」が可能になりましたが、かなりまどろっこしいのでルーティンという機能を使って簡単にしました。モバイルのGoogle Assistantアプリから設定できました。

f:id:shira7867:20190224193632j:plain

画像は「今日」のものですが同様に他の日も設定しました。(これもエンティティみたいにひとまとめにできたらいいのに)

完成

やったぜ。

気になること

developers.google.com

これを見る限りPublishしてないテストアプリは30日立ったら失効してしまうらしい。30日立ったらもっかいシミュレータにアクセスすればいいのだろうけど、それは面倒。どうしよう。