Google Home にプッシュ通知機能を実装する

Google HomeTech

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

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

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

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

必要なもの

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

Google Home でプッシュ通知の実現方法

Google Home はユーザが話しかけることをトリガーとして起動するため、(通常では)勝手に喋りだすことができません。
そこで、google-home-notifier を使うことでプッシュ通知を実現します。

仕組みとしては、

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

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

環境構築

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

必要パッケージ追加

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 アプリからデバイス設定を開くと、画面の一番下に記載されています。

Google Homeのデバイス設定

プッシュ通知サンプル

ライブラリ内の 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 から登録できます。

IFTTTのWeather設定

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

IFTTTのWebhook設定

これで完成です。

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

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

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

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

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

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

IFTTTのWebhookをPOSTに変更

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

参考リンク

まとめ

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

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

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