やりたいこと
こういうのを自分でもやってみたい!
このページについて
やりたいことにも書きましたが、せっかくある Google home で、家族とやりとりしたい!と思ったので、その環境整備の備忘録です。例によって、これに類する記事はいっぱいあるんですが、微妙に古くて現状に合わないケースもあったので、書き起こしました。この記事も数ヶ月もすれば、古くなりますねー
使ったもの
- 先人たちの共有知
- Google home mini
- Raspberry pi3 model B
- slack
- nodejs
- npm
- n
- hubot
- google-home-notifier
slack から Google home mini を喋らせる
ひとまず、slack から Raspberry Pi で動かす bot 経由で、Google home mini を喋らせるところまでを目指します。
nodejs 環境を整備
nをインストール
今回、Raspbian Buster を使っているので、nodejs の version 的には別段不満はないのですが、そのうち別のバージョンの nodejs をインストールしたくなるかもしれないので、ひとまず n をインストールします(n……ググラビリティが低い……)
$ sudo npm install -g n
sudo n stable
stable版の nodejs をインストール
$ sudo n stable
installing : node-v10.16.3
mkdir : /usr/local/n/versions/node/10.16.3
fetch : https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-armv7l.tar.gz
installed : v10.16.3 (with npm 6.9.0)
nodejsのversionを確認
$ node -v
v10.15.2
おっと、システム側の nodejs を参照してますね。消しておきましょう。
$ sudo apt purge -y nodejs npm
Bot作成環境の整備
yo と generator-hubot をインストール
$ sudo npm install -g yo generator-hubot
これ、sudo つけないと
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
みたいなエラーが出たんだけど、安易に sudo つけずに、
npmでpermission deniedになった時の対処法[mac]
の記事を参考に、npm config set prefix
で回避した方がいいのかな?まぁ困ったらやり直す方向で。
slack から hubot を追加する。
hubot と slack を連携させるには、HUBOT_SLACK_TOKEN が必要となる。このため、slack の管理者メニューから、Manage apps
に飛ぶ。

で、hubot を検索して追加します。

bot の名前はさておき xoxb- から始まる HUBOT_SLACK_TOKEN を控えておきましょう。
bot の作成
google-home-notifier を使いたいので、先人の教えに従って、事前に
$ sudo apt-get install libnss-mdns libavahi-compat-libdnssd-dev
をインストールします。
$ mkdir -p ~/hubot/myhubot
$ cd ~/hubot/myhubot
$ npm install google-home-notifier --save
$ npm install multicast-dns --save
ここまでで
$ HUBOT_SLACK_TOKEN=xorb-ないしょ bin/hubot -a slack
して bot が動作することを確認しておきます。うまく動作すれば、bot がオンラインになるはずです。

google-home-notifier が動作するように微調整
発話させるまで、あと少し。このままだと、google-home-notifier が利用している google-tts-api が古いので、
get key failed from
みたいなエラーが出て、うまく動きません。このため、最新版に上げます。
を見ると、最新版は 0.0.4
$ cd node_modules/google-home-notifier
このディレクトリにある package.json に
"google-tts-api": "https://github.com/darrencruse/google-tts/tarball/british-voice",
という行があるので、
"google-tts-api": "0.0.4"
と書き換えて
$ npm update google-tts-api
を実行。また、このままだと、mDNS がうまく動作せず、同一LAN上にいる Google home が検知できません。このため
google-home-notifierの「Error: getaddrinfo -3008」に対処する
を参考に
- node_modules/mdns/lib/browser.js
- node_modules/google-home-notifier/google-home-notifier.js
を書き換えておきます。このページには本当に助けられました。ありがとうございます!
あとは
# Description:
#
# Commands:
# hubot say <content> - Say something via Google home.
#
home = require 'google-home-notifier'
lang = 'ja'
module.exports = (robot) ->
robot.respond /say (.*)$/i, (msg) ->
content = msg.match[1]
home.device('', lang);
home.notify(content, (res) => console.log('said '+ content));
こんなコード書けば動作するかと思います。
とりあえずこれで

hubot を自動起動させる
Raspberry Pi を再起動しても動作するように、systemctl用のファイルを用意してやります。
[Unit]
After=network-online.target
Description = hubot for google home
[Service]
WorkingDirectory=/home/pi/hubot/myhubot
ExecStart=/home/pi/hubot/myhubot/bin/hubot -a slack
Restart=always
Type=simple
User=pi
Group=pi
[Install]
WantedBy=multi-user.target
あと、 bin/hubot にも
export HUBOT_SLACK_TOKEN=xoxb-ないしょ
を追記しておきます。
これで
$ sudo systemctl daemon-reload
$ systemctl start hubot
$ systemctl enable hubot
とかしておけばOKなはず。
Google home mini から、slack に投稿
今度は逆方向。IFTTT が一番簡単そうなので、これで試してみます。基本的には
に書いてある通りですね。意外にも?ピッタリのレシピはなさそうなので、作っていきます。

Get more
をクリックして表示される上記メニューから、ifThisThenThat
をクリック。

まずは、This
から。クリックして、Google Assistant を選択。トリガーはいくつか選択できますが、ここでは Say a phrase with a text ingredient
を選択します。

こんな感じでトリガーに内容を埋めていきいます。ちなみに
お父さんに 「$」って伝えたよ
は、実はNGで。$ の前後にスペースが必要とのこと。
お父さんに 「 $ 」って伝えたよ
に修正。で、

で、投稿する slack の channel をしてして、メッセージを記載します。上の図だと分かりづらいですが、Message には
お父さん、「{{TextField}}」
と記載しています。このあたりも、上記のリンクに有る通りですね。
あとは実際に Google ホームに話しかけてみます。
実際に話してみる
実際に Google home に話しかけてみると……
slack と IFTTT のアプリに通知が来ました。
slackへの通知

IFTTTアプリからの通知

最後に
で、子どもたちが使ってくれるかどうかはさておき、こんなこともできるんだよーというデモとしては面白いかな?
ただね……家のGoogle home は、ほとんど電源Off 、電源OnでもマイクOff にしてあるんだよねー日の目を見る日は来るのか。