Go
ifttt
Slack
Alexa
GoogleHome

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

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

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

TL;DR

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

firestarter (2).png

必要なもの

  • Google Home
  • Alexa
  • IFTTT
  • Slack
  • Docker

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

IFTTTを使います。設定した言葉に反応して、固定のメッセージをSlackに投稿できるようにしておきます。応答は、何か適当な言葉をセットしておきましょう。1
まず、試しにGoogleHomeに喋りかけて、どんな感じの反応をするか見ましょう。Google - マイ アクティビティから、喋った言葉がどのように認識されたのか確認できます。
既存のコマンドに被らなくて、誤認識されにくい文言がよいです。今回は今日のニュースを聞いておいてにしておきます。2
Screenshot from 2018-03-21 21-46-15.png

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

Screenshot from 2018-03-21 21-47-31.png

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

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

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

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

Google Homeに喋らせるには

Alexaにニュースを読んでもらうには、音声でお願いしないといけないので、Google Homeに喋ってもらう必要があります。
そこで、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

まとめ

こうなるわけです。
まとめ


  1. ここでResponseに、「Alexa 今日のニュースは?」 とやってしまうと、この記事が短くなってしまいます。やめましょう。 

  2. タイトル通り「Alexaに」を入れてしまうと、このタイミングでAlexaがニュースを喋りだすので、やめましょう。