Google home であんなこといいな

# ■ はじめに

Google home を使ってみました。この記事ではあまり細かな設定や実装には触れませんが、こんな使い方できるよっていうアイディアを書いておきます。

# ■ 購入に至った背景

Amazon echo が発売された当初、スマートスピーカーでできることはスマホで操作すればこと足りるものが多く(しかもそのほうが柔軟に利用できる)、わざわざ買って使いたいと思いませんでした。

- スマートスピーカーの主な機能
 - 天気、ニュース、予定を教えてくれる
 - 曲を再生してくれる
 - 注文できる

そんななか Google home が子供の遊び道具や子供とのコミュニケーションツールとして使えそうだと思って購入しました。

# ■ 我が家での使い方
Google home 単体の標準的な機能で子供が実際に利用して気に入っているものは下記の機能です。

- 時刻(今何時？)
- 天気予報(今日の天気は？)
- 動物の鳴き声(犬の鳴き声は？)
- 計算(1+1は？)
- 翻訳(犬を英語で言うと？)

スマホやPCで調べ物ができない幼児向けにはとてもよい知育的なおもちゃになっています。
声で誰が話しかけたかを認識して名前を添えたりしてくれるので、それがうれしい側面もあるようですね。

とはいえ上記機能だけではインパクトはありませんでしたが、
外部機器や外部サービスと連携していろいろ掘り下げてみたので以下に紹介していきたいと思います。





## ◎Chromecast との連携

テレビに Chromecast を刺しておいて google home から「テレビでプラレールの動画を再生して」などと言うと youtube で「プラレール」を検索した結果が再生されます。HDMIの連携機能でテレビが消えていても付けてくれますし入力切替もやってくれます。消す操作だけもできます。これがけっこう便利なのですが、寝る時間になると子供と on/off の言い合いや、ギャーギャー騒いで相手の命令を妨害する応酬が毎夜繰り広げられてなかなか寝ないという諸刃の剣だったりします(^^;

また、google photoと連携して、スライドショーを表示することが出来ます。これが、非常に便利です。

Google Photo は写真の中から顔を認識してその人ごとのアルバムにまとめる機能があるので、認識された顔にその人の名前をつけておきます。そして Google home に「〜〜ちゃんの写真を表示して」とその名前を言うと、その人物が写った写真をテレビに表示してスライドショーしてくれます。

Google photo を知らない/使っていない人は少ないと勝手に思っているのですが、使っていない人がいればぜひ使ってみてください。撮った写真を自動でアップしてくれて枚数無制限でサーバに保管できるうえに無料なのでめちゃくちゃ便利です。なぜこんなことが無料で使えるのか不思議なぐらいです。。。今まではスライドショーをしようと思ったら、カメラからパソコンに写真を取り込んで、サーバーにアップロードして、スライドショーを作って、それをダウンロードして、、、なんてことをやっていましたが、パシャパシャ撮って「表示して」って言うだけでいいんです。これは感動的に便利でした。

アルバム名を指定してテレビでスライドショーとかやってくれるようになったらおじいいちゃんおばあちゃんの家にも Google home と Chromecast のセットを置くのは間違いないんですけど、現時点(2017・12)ではまだできないようです、




## ◎外出先から子供と会話

我が家では子供が小さく、まだスマホがさわれません。かねてより、職場や外出先から家の子供と会話ができたらいいなと思っていました。Google home を買う以前に Slack で一部その機能を実現させていました。我が家専用の Slack ワークスペースを作って、あるチャンネルに書き込むと slack API の Outgoing Webhooks がその内容を添えて我が家内のサーバー(mac mini) の API をコールし、mac の say コマンドでその内容をしゃべらすところまで実現していました。

家のサーバの処理はたったこれだけです。
https://github.com/vanx2/say-slack

家のネットワークが固定のグローバルIPを持っていない場合は `ngrok` が便利です。
https://ngrok.com/ 

他の方法としては、家のルーターでとあるポートにに飛んできたパケットをそのサーバへ転送する設定をしたうえで、ダイナミックDNSなどで自分のドメインを用意し、定期的にIPアドレスを更新します。

例えば myDNS https://www.mydns.jp/
の場合、自分のドメインを登録した上で下記のコマンドを launchd などで定期的に叩けばドメインの向き先が自宅のIPアドレスに更新されます。

```
/usr/bin/curl -u username:password http://www.mydns.jp/login.html
```



---
(脱線)
なお、家庭用のサーバとして mac mini は抜群におすすめです。話が長くなるので別記事にしました(笑)
https://qiita.com/vanx2/private/bc138c7a4903e53e015e

----

というわけで、これで外出先から何かを子供に伝えるところまでは実現できていましたが、子供から外出先にメッセージを送る方法がありませんでした。そこで Google home の出番です。

Google home に独自の処理を組み込もうと思ったら Dialogflow で実現してもいいのですが、いちいち「ねぇグーグル。〜〜につないで」と言わないといけないのがわずらわしいので、今回は IFTTT と連携させてみました。

Google home では、内部的に Google assistant が動いています。IFTTT の if で、Google assistant の `Say a phrase with a text ingredient` を選び、「お父さん」で始まるフレーズを受け取った時に trigger が発生するようにします(だいぶはしょった)。そして then で webhook を選び、Slack の Incoming webhook の URL を設定します。あらかじめ Slack で Incoming webhook を登録しておいてください(だいぶはしょった)。

これで双方向の会話ができるようになりました。Slack の Incoming webhook が家から送られてきた発言を書き込むチャンネルと、書かれた発言を Outgoing webhook で家におくるチャンネルを一緒にしてしまうと、家で発言した内容が slack　に書かれた後また家で発話されてしまうので別のチャンネルにする必要があります。また、Slack の outgoing webhook が発言者によって挙動を変えることができないので、メッセージを送ったのがお父さんなのかお母さんなのかわかるようにするためにはチャンネルを分けたりする必要があります。つまり、発言された内容を書き込むチャンネルと、お父さんが発言するチャンネル、お母さんが発言するチャンネルは全て別にする必要があるのでもう少し改善したいなと思っています。

なお、同じ IFTTT の機能でメールやSMSやLineを介することもできます。しかし、メールは送られてきたメールのfromアドレスとtrigger用の送り先アドレスが違うので、送られてきたメールに返信しても届きません。また、SMSは日本語に対応していませんし、Lineはメッセージを受けることができても送ることができません。

何かうまい方法を知っている方がいらっしゃれば教えてください。

Voxer みたいにボイスで送りあえるようなこともしてみたいと思っています。






## ◎アラーム

特定の時間になったら Google home にしゃべらせたり音楽を鳴らしたいと思っていました。朝幼稚園に行く時間になったら「出かける準備をしましょう」としゃべらせたり、寝る時間になったら蛍の光を流したりしたいのです。

標準のアラーム機能では規定のアラーム音がなるだけでの機能しかありません。Google home は他の機器から bluetooth 接続で音を鳴らせるようなので、まずはそれを利用してみました(結局うまくいかず断念します)。

家のサーバーの macmini で、特定の時間になったら say コマンドでしゃべらせたり afplay コマンドで音楽を再生させます。普段は HDMI でテレビにつないで動画を見ているので、音声の出力先が HDMI になっているので、都度都度出力先を Google home に変える必要があります。

mac os 標準のコマンドでは音声出力先の切り替えはできないし Apple script を書くのは面倒なので、これを使いました。
https://github.com/deweller/switchaudio-osx

ただ、ある一定の時間が経つと Google home への Bluetooth 接続が切れてしまうのでサウンドを切り替える前に切断されていたら繋いでやる必要がありました。これまた標準のコマンドでは Bluetooth 接続するものがなかったので、これを使いました。
https://github.com/lapfelix/BluetoothConnector

しかし、Bluetooth の接続に時間がかかったり失敗したりするので、この方法は断念しました。

他にいい方法がないか調べたところ、google home は Chromecast と同様に castv2 のプロトコル(去年の Advent calender の記事で紹介)で音声ファイルを投げつけると再生してくれるようです。github を眺めたところ `google-home-notifier` という Node.js 実装がありました。音声ファイルだけでなく、texet to speech を介してテキストも音声に変換して投げてくれます。

ソースを眺めたところまだ実装が中途半端だったので、私はそこから folk された `google-cast-public-address` を使っています。
https://github.com/watusi/google-cast-public-address

上記を macmini にインストールし、特定の時間になったら下記のようなコマンドを実行しています。

```
curl -X POST -d "file=HOTARU_NO_HIKARI.mp3" http://localhost:8081/google-cast-public-address
```

```
curl -X POST -d "text=`date +'%-l時%-M'`分です。幼稚園に行く準備をしましょう" http://localhost:8081/google-cast-public-address
```

URLの `google-cast-public-address` ってのが無駄に長いので短くしたり、実際にはいろいろカスタマイズして使っています。

特定の時間になったら叩く方法として、 `cron` や `launchd` に登録するのもいいですが、`webcron` というサービスを利用してもいいですね。
https://www.webcron.org/ja






## ◎雨の通知

Google home では「今日の天気は？」などと聞くと天気を教えてくれますが、もうすぐ雨が降りそうな時に教えてくれる機能はありません。

天気情報を公開しているサービスから予報を定期的に取得し、晴れや曇りから雨に変わる時に「そろそろ雨が降りそうです」としゃべらせてみようと思います。

天気情報のサービスはいろいろあるのですが、日本のものは時間単位での予報がありません。海外のものは精度がバラバラなのですが、いろいろ使ってみたところ私は openweathermap が一番精度が高いように思えました。

まだ実装中ですが、リポジトリ貼っときます。
https://github.com/vanx2/rain-notifier

openweathermap のAPIはけっこうハマりどころが多かったのでまた別の記事で紹介したいと思います(だいぶはしょった)。


## ◎カレンダー との連携

我が家では家族用のカレンダーを用意しておき、みんなで予定を書き込んでいます。朝 google home に「おはよう」と伝えると、その日の家族の予定を読み上げてくれます(だいぶはしょった)。



# ■まとめ

子供のおもちゃや子育てアシスタントとしては非常に良い買い物だったと思います。これから機能も増えていくと思うので、そのうち子育て以外の面でも便利になっていくのではないでしょうか。

- 個人的に早く実現して欲しい機能
 - 上記で書いた、外部のメッセンジャーサービスとうまく連携する機能
 - Google photo との連携で、人物ではなくアルバムや日付を指定してスライドショーを表示する機能
 - タイマーでテレビを消す機能(あと30分でテレビ消してって言いたい)

コマンドラインでの操作ができればガリガリのエンジニアでなくともこのようなことができるのでぜひ皆さんもチャレンジしてみてください。
細かな設定方法はだいぶはしょったので、設定方法がわからない場合はコメント欄でお知らせください。
 
そのうち echo dot も使ってみようと思います！