OK,Google Alexaに今日のニュースを聞いておいて

スマートスピーカー、いいですよね。
Google Homeはセールのときに買って持ってますよね。Echoはそろそろ当選しましたよね。
もしかして、結局片方しか使ってない？それはもったいない。

この記事では、Google HomeとAlexaを一度にフル活用する方法を説明します。

## TL;DR

こんな構成のシステムを、コーディングなしで作っていきます。

![firestarter (2).png](https://qiita-image-store.s3.amazonaws.com/0/69350/cc1b49de-b992-8afd-3bd5-6d9e4ab06a88.png)


## 必要なもの


* Google Home
* Alexa
* IFTTT
* Slack
* Docker

## Google HomeからSlackにメッセージを投稿する

[IFTTT](https://ifttt.com/)を使います。設定した言葉に反応して、固定のメッセージをSlackに投稿できるようにしておきます。応答は、何か適当な言葉をセットしておきましょう。[^1]
[^1]: ここでResponseに、「Alexa 今日のニュースは？」 とやってしまうと、この記事が短くなってしまいます。やめましょう。

まず、試しにGoogleHomeに喋りかけて、どんな感じの反応をするか見ましょう。[Google - マイ アクティビティ](https://myactivity.google.com/myactivity)から、喋った言葉がどのように認識されたのか確認できます。
既存のコマンドに被らなくて、誤認識されにくい文言がよいです。今回は`今日のニュースを聞いておいて`にしておきます。[^2]
[^2]: タイトル通り「Alexaに」を入れてしまうと、このタイミングでAlexaがニュースを喋りだすので、やめましょう。

![Screenshot from 2018-03-21 21-46-15.png](https://qiita-image-store.s3.amazonaws.com/0/69350/b20758d1-f876-9517-e8b1-f93287c77a3a.png)

Slackにメッセージを投稿する設定です。こういう中継目的のメッセージは、botが全員詰め込まれた専用部屋を作ってミュートすると便利です。

![Screenshot from 2018-03-21 21-47-31.png](https://qiita-image-store.s3.amazonaws.com/0/69350/e329a449-60dc-6fce-900a-8a53c9b25666.png)



## SlackのメッセージををBotで拾う

次に、IFTTTからのメッセージで動くBotを作ります。[juntaki/firestarter](https://github.com/juntaki/firestarter)を使います。
firestarterは、簡単な設定だけで機能を追加していけるSlack用のbotです。GoとVue.jsで書いてます。
どんなことができるかは下記のスライドで紹介しています。

[<img src="https://speakerd.s3.amazonaws.com/presentations/2e7ee7949f234546be0841f7a91560ba/slide_0.jpg" width=400px>](https://speakerdeck.com/juntaki/configurable-slack-bot-firestarterfalsetukaikata)


### Slackの設定

まずは、Slackに対してBotの設定をします。firestarterはアプリとしてデプロイしたほうが後々フル機能が使えて便利なので、SlackAppにしておきます。
https://api.slack.com/apps の、`Create New App`から、Bot Userを適当な名前で作ります。
`Basic Information`から、`Verification Token`を、`OAuth & Permissions`から、`Bot User OAuth Access Token`を、コピーしておきます。

### firestarterのデプロイ

Dockerにfirestarterをデプロイします。
先程入手したトークンは環境変数にセットして起動します。

~~~
docker run \
 -v /path/to/config:/app/config \
 -p 3000:3000 -p 8080:8080 \
 -e SLACK_TOKEN=xoxb-xxxxxxxxxxxxxx \
 -e SLACK_VERIFICATION_TOKEN=xxxxxxxxxxxxxx \
 juntaki/firestarter
~~~

Slackの画面でfirestarterのボットがアクティブになっていることを確認しましょう。

![Screenshot from 2018-03-21 13-36-01.png](https://qiita-image-store.s3.amazonaws.com/0/69350/5548de6a-76c6-1dfd-064f-1afa5d684239.png)


設定は次のgoogle-home-notifier-goの環境構築が終わったあとに行います。

## Google Homeに喋らせるには

Alexaにニュースを読んでもらうには、音声でお願いしないといけないので、Google Homeに喋ってもらう必要があります。
そこで、[juntaki/google-home-notifier-go](https://github.com/juntaki/google-home-notifier-go)を使います。これは、google-home-notifierをGoで書き直して、WebAPIサーバにしたものです。
喋ってもらいたい言葉をPOSTすると、Google Homeを見つけて喋らせます。

firestarterと同じく、Dockerでデプロイしておきます。Google Homeを見つけるためにmDNSを利用するので、`--net=host`オプションが必要です。

~~~
docker run -d --name ghn -e GHN_PORT=8081 --net=host juntaki/google-home-notifier-go
~~~

試しに、何か喋らせてみます。curlコマンドで、メッセージを送ります。
以下、`<docker host>`のところは自分のDockerホストマシンのIPアドレスなどに読み替えてください。

~~~
curl -XPOST "http://<docker host>:8081?text=てすと&lang=ja"
~~~

Google Homeが2台以上ある豪邸にお住まいの方は、次のようにすることで、特定のGoogle Homeだけに喋らせることが可能です。

~~~
curl -XPOST "<docker host>:8081?text=てすと&lang=ja&device=Google-Home-xxxxxxx"
~~~

`Google-Home-xxxxxxx`に入る文字列は、google-home-notifier-goのログに出ています。

~~~
$ docker log ghn
...
2018/03/21 12:04:27.789476 Device Google-Home-xxxxx._googlecast._tcp.local. at ...
...
~~~

## firestarterからGoogle Homeが喋るようにする

firestarterの設定でgoole-home-notifier-goにPOSTリクエストを送るようにしましょう。
firestarterの設定画面(`http://<docker host>:8080`)にアクセスして、次のような設定を追加します。
これだけで、Botの設定はおしまいです。

![Screenshot from 2018-03-21 21-56-38.png](https://qiita-image-store.s3.amazonaws.com/0/69350/74eee555-2699-bc25-4510-1a2cad7d6827.png)

## まとめ

こうなるわけです。
[![まとめ](http://img.youtube.com/vi/bXLle0zMFW0/0.jpg)](http://www.youtube.com/watch?v=bXLle0zMFW0)