Google Home にプッシュ通知&雪予告を実装する

概要

東京で4年ぶりに大雪 が降ったため、Google Home (mini) に雪が降る前のプッシュ通知機能を実装しました。

www.youtube.com

声がいつもと違うのは仕様です。


以下の3つに分けて機能を実装しました。

  • Google Home をプッシュ通知に対応させる
  • 外部から叩けるようにする
  • IFTTT で天気予報と連動させる


必要なもの

  • Google Home (mini)
  • LAN 内に立てられるサーバ(RaspberryPi や VM など)
  • (簡単な)Node.js の読み書き力


プッシュ通知の実現方法

Google Home はユーザが話しかけることをトリガーとして起動するため、(通常では)勝手に喋りだすことができません。

そこで、google-home-notifier を使うことでプッシュ通知を実現します。

github.com

仕組みとしては、

  1. 任意のテキストを Google 翻訳に送信
  2. 読み上げ用の音声データを取得
  3. Chromecast のプロトコルを使い、Google Home から再生

という流れで実現しているようです。そのため、普段とは違う声になるのですね。


環境構築

適当なサーバに構築していきます。今回は、先日作った Amazon Linux 2 を活用します。

blog.yuu26.com

必要パッケージ追加

yum で3つほどインストール。git も入っていなかったとは。。。

# yum install git gcc-c++ avahi-compat-libdns_sd-devel

Node.js 追加

セットアップ用スクリプト からリポジトリを追加、yum でインストールします。

# curl -sL https://rpm.nodesource.com/setup_8.x | bash
# yum install nodejs
# node -v

google-home-notifier 追加

git clone 後に npm install を実行するだけです。

$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier
$ npm install

root ユーザで実行すると上手くいかない場合があります。


IP アドレスを確認

実装に入る前に、Google Home の IP アドレスを確認します。

Google Home アプリからデバイス設定を開くと、画面の一番下に記載されています。

f:id:yuu2634:20180122192429j:plain


プッシュ通知サンプル

ライブラリ内の example.js を参考に、簡単なサンプルを作成しました。

deviceName には Google Home に設定している名称、ipAddress には先ほど確認したアドレスを記載します。

ちなみに「雪が降る」と書くと ゆきがおりる と読まれてしまったため、ひらがなで表記しています。


このプログラムを実行すると、突然 Google Home が喋りだします。

$ node snow.js


Webhook 化する

次は、このプログラムを外から呼べるようにします。ngrok を使いました。

GET リクエストを受信した場合に、先ほどと同じ発声処理が走ります。


起動するとエンドポイントが表示され、この URL にアクセスすることで Google Home が喋るようになります。

$ node getServer.js
Endpoints: https://xxxxxxxx.ngrok.io


天気予報と連動させる

IFTTT を使用して、天気予報と先ほどのエンドポイントを紐付けます。

Weather モジュールで、明日の天気が雪の場合 のトリガーを作成。天気の場所は Settings から登録できます。

f:id:yuu2634:20180122194901p:plain

Webhook モジュールで、先ほどの ngrok エンドポイントを指定します。

f:id:yuu2634:20180122194912p:plain

これで完成です。


プッシュ通知の内容を動的生成

完成はしましたが、汎用性を高めるためにもう少し修正を加えます。

リクエストを GET ではなく POST で受け付け、text に定義された内容を喋るように書き換えました。

起動時には、POST リクエストの例を表示しています。

$ node postServer.js
POST example:
curl -X POST -d "text=明日は雪がふるそうですよ。" https://xxxxxxxx.ngrok.io

IFTTT の Webhook も POST に変更しておきます。

f:id:yuu2634:20180122202223p:plain

これで雪の前日に Google Home が教えてくれるため安心です。(何時に動作するのかは知りませんが)


参考リンク

GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます - Qiita

Google Home開発入門 / google-home-notifier解説 - Qiita

node.js 8.x をyumでインストールする(centos7.x) - Qiita

【IFTTTでレシピ作成】雨が振りそうになったらLINEに通知するレシピを作ろう | Free Style

情報的備忘録 : 【Google Home】話しかけたキーワードの検索結果をPCに表示させる


まとめ

  • Google Home にプッシュ通知を実装しました
  • ngrok 経由で外から呼べるようにしました
  • 喋る内容は POST で動的に指定できます
  • IFTTT の天気情報と連動させ、雪予告の機能を実装しました

一つ課題として、エンドポイントが分かると誰でも叩けてしまう状態のため、IFTTT からのリクエストに認証用パラメータを追加するなど対策すると安心です。


Webhook を一つ作りさえすれば他にも応用が効くため、ぜひお試しください。