【RaspberryPi】Google Homeに何か喋らせるようにしてみた


Google Homeでいろいろ遊びたいと思い、ちょっと `Raspberry Pi` の環境を構築して遊んでみることにした。

以下の記事を参考にやってみる。
[Raspberry PiからGoogle Homeを喋らせる](https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09#_reference-b3451397a773d14859e2)

---

##1. 使用する環境

- MacBook Air (11-inch, Early 2015)(10.13.2（17C88）)
- 2016-12-13-pixel-x86-jessie
- VirtualBox(ver:5.0.10 r104061)

---
##2. 古いNode.jsを削除

```
$ sudo apt-get autoremove nodejs
``` 

<!--
【実行ログ】
pi@raspberrypi:~ $ sudo apt-get autoremove nodejs
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ 'nodejs' はインストールされていないため、削除もされません
以下のパッケージは「削除」されます:
  libpci3 libspeechd2 linux-image-3.16.0-4-586 pix-icons pix-plym-splash pixel-wallpaper
アップグレード: 0 個、新規インストール: 0 個、削除: 6 個、保留: 0 個。
この操作後に 120 MB のディスク容量が解放されます。
続行しますか? [Y/n] Y
(データベースを読み込んでいます ... 現在 125439 個のファイルとディレクトリがインストールされています。)
libpci3:i386 (1:3.2.1-3) を削除しています ...
libspeechd2:i386 (0.8-7) を削除しています ...
linux-image-3.16.0-4-586 (3.16.51-3) を削除しています ...
/etc/kernel/postrm.d/initramfs-tools:
I: update-initramfs is disabled (live system is running without media mounted on /lib/live/mount/medium).
The link /initrd.img is a damaged link
Removing symbolic link initrd.img 
You may need to re-run your boot loader
The link /initrd.img.old is a damaged link
Removing symbolic link initrd.img.old 
You may need to re-run your boot loader
pix-icons (0.8) を削除しています ...
pix-plym-splash (0.11) を削除しています ...
pixel-wallpaper (0.4) を削除しています ...
libc-bin (2.19-18+deb8u10) のトリガを処理しています ...
pi@raspberrypi:~ $ 
-->

---
##3. nvmのインストール

```
$ sudo mkdir ~/.nvm
$ sudo chmod 777 ~/.nvm
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm --version
```

<!--
【実行ログ】
pi@raspberrypi:~ $ sudo mkdir ~/.nvm
pi@raspberrypi:~ $ sudo chmod 777 ~/.nvm
pi@raspberrypi:~ $ git clone https://github.com/creationix/nvm.git ~/.nvm
Cloning into '/home/pi/.nvm'...
remote: Counting objects: 6699, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 6699 (delta 4), reused 11 (delta 4), pack-reused 6684
Receiving objects: 100% (6699/6699), 2.07 MiB | 727.00 KiB/s, done.
Resolving deltas: 100% (4156/4156), done.
Checking connectivity... done.
pi@raspberrypi:~ $ source ~/.nvm/nvm.sh
pi@raspberrypi:~ $ nvm --version
0.33.8
pi@raspberrypi:~ $ 

-->

---
##4. Node.js のインストール

```
$ nvm ls-remote
$ nvm install v8.9.4
$ node --version
$ npm --version
```

<!--
【実行ログ】
pi@raspberrypi:~ $ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
        v0.1.19
        v0.1.20
        v0.1.21
        v0.1.22
        v0.1.23
        v0.1.24
        v0.1.25
        v0.1.26
        v0.1.27
        v0.1.28
        v0.1.29
        v0.1.30
        v0.1.31
        v0.1.32
        v0.1.33
        v0.1.90
        v0.1.91
        v0.1.92
        v0.1.93
        v0.1.94
        v0.1.95
        v0.1.96
        v0.1.97
        v0.1.98
        v0.1.99
       v0.1.100
       v0.1.101
       v0.1.102
       v0.1.103
       v0.1.104
         v0.2.0
         v0.2.1
         v0.2.2
         v0.2.3
         v0.2.4
         v0.2.5
         v0.2.6
         v0.3.0
         v0.3.1
         v0.3.2
         v0.3.3
         v0.3.4
         v0.3.5
         v0.3.6
         v0.3.7
         v0.3.8
         v0.4.0
         v0.4.1
         v0.4.2
         v0.4.3
         v0.4.4
         v0.4.5
         v0.4.6
         v0.4.7
         v0.4.8
         v0.4.9
        v0.4.10
        v0.4.11
        v0.4.12
         v0.5.0
         v0.5.1
         v0.5.2
         v0.5.3
         v0.5.4
         v0.5.5
         v0.5.6
         v0.5.7
         v0.5.8
         v0.5.9
        v0.5.10
         v0.6.0
         v0.6.1
         v0.6.2
         v0.6.3
         v0.6.4
         v0.6.5
         v0.6.6
         v0.6.7
         v0.6.8
         v0.6.9
        v0.6.10
        v0.6.11
        v0.6.12
        v0.6.13
        v0.6.14
        v0.6.15
        v0.6.16
        v0.6.17
        v0.6.18
        v0.6.19
        v0.6.20
        v0.6.21
         v0.7.0
         v0.7.1
         v0.7.2
         v0.7.3
         v0.7.4
         v0.7.5
         v0.7.6
         v0.7.7
         v0.7.8
         v0.7.9
        v0.7.10
        v0.7.11
        v0.7.12
         v0.8.0
         v0.8.1
         v0.8.2
         v0.8.3
         v0.8.4
         v0.8.5
         v0.8.6
         v0.8.7
         v0.8.8
         v0.8.9
        v0.8.10
        v0.8.11
        v0.8.12
        v0.8.13
        v0.8.14
        v0.8.15
        v0.8.16
        v0.8.17
        v0.8.18
        v0.8.19
        v0.8.20
        v0.8.21
        v0.8.22
        v0.8.23
        v0.8.24
        v0.8.25
        v0.8.26
        v0.8.27
        v0.8.28
         v0.9.0
         v0.9.1
         v0.9.2
         v0.9.3
         v0.9.4
         v0.9.5
         v0.9.6
         v0.9.7
         v0.9.8
         v0.9.9
        v0.9.10
        v0.9.11
        v0.9.12
        v0.10.0
        v0.10.1
        v0.10.2
        v0.10.3
        v0.10.4
        v0.10.5
        v0.10.6
        v0.10.7
        v0.10.8
        v0.10.9
       v0.10.10
       v0.10.11
       v0.10.12
       v0.10.13
       v0.10.14
       v0.10.15
       v0.10.16
       v0.10.17
       v0.10.18
       v0.10.19
       v0.10.20
       v0.10.21
       v0.10.22
       v0.10.23
       v0.10.24
       v0.10.25
       v0.10.26
       v0.10.27
       v0.10.28
       v0.10.29
       v0.10.30
       v0.10.31
       v0.10.32
       v0.10.33
       v0.10.34
       v0.10.35
       v0.10.36
       v0.10.37
       v0.10.38
       v0.10.39
       v0.10.40
       v0.10.41
       v0.10.42
       v0.10.43
       v0.10.44
       v0.10.45
       v0.10.46
       v0.10.47
       v0.10.48
        v0.11.0
        v0.11.1
        v0.11.2
        v0.11.3
        v0.11.4
        v0.11.5
        v0.11.6
        v0.11.7
        v0.11.8
        v0.11.9
       v0.11.10
       v0.11.11
       v0.11.12
       v0.11.13
       v0.11.14
       v0.11.15
       v0.11.16
        v0.12.0
        v0.12.1
        v0.12.2
        v0.12.3
        v0.12.4
        v0.12.5
        v0.12.6
        v0.12.7
        v0.12.8
        v0.12.9
       v0.12.10
       v0.12.11
       v0.12.12
       v0.12.13
       v0.12.14
       v0.12.15
       v0.12.16
       v0.12.17
       v0.12.18
    iojs-v1.0.0
    iojs-v1.0.1
    iojs-v1.0.2
    iojs-v1.0.3
    iojs-v1.0.4
    iojs-v1.1.0
    iojs-v1.2.0
    iojs-v1.3.0
    iojs-v1.4.1
    iojs-v1.4.2
    iojs-v1.4.3
    iojs-v1.5.0
    iojs-v1.5.1
    iojs-v1.6.0
    iojs-v1.6.1
    iojs-v1.6.2
    iojs-v1.6.3
    iojs-v1.6.4
    iojs-v1.7.1
    iojs-v1.8.1
    iojs-v1.8.2
    iojs-v1.8.3
    iojs-v1.8.4
    iojs-v2.0.0
    iojs-v2.0.1
    iojs-v2.0.2
    iojs-v2.1.0
    iojs-v2.2.0
    iojs-v2.2.1
    iojs-v2.3.0
    iojs-v2.3.1
    iojs-v2.3.2
    iojs-v2.3.3
    iojs-v2.3.4
    iojs-v2.4.0
    iojs-v2.5.0
    iojs-v3.0.0
    iojs-v3.1.0
    iojs-v3.2.0
    iojs-v3.3.0
    iojs-v3.3.1
         v4.0.0
         v4.1.0
         v4.1.1
         v4.1.2
         v4.2.0   (LTS: Argon)
         v4.2.1   (LTS: Argon)
         v4.2.2   (LTS: Argon)
         v4.2.3   (LTS: Argon)
         v4.2.4   (LTS: Argon)
         v4.2.5   (LTS: Argon)
         v4.2.6   (LTS: Argon)
         v4.3.0   (LTS: Argon)
         v4.3.1   (LTS: Argon)
         v4.3.2   (LTS: Argon)
         v4.4.0   (LTS: Argon)
         v4.4.1   (LTS: Argon)
         v4.4.2   (LTS: Argon)
         v4.4.3   (LTS: Argon)
         v4.4.4   (LTS: Argon)
         v4.4.5   (LTS: Argon)
         v4.4.6   (LTS: Argon)
         v4.4.7   (LTS: Argon)
         v4.5.0   (LTS: Argon)
         v4.6.0   (LTS: Argon)
         v4.6.1   (LTS: Argon)
         v4.6.2   (LTS: Argon)
         v4.7.0   (LTS: Argon)
         v4.7.1   (LTS: Argon)
         v4.7.2   (LTS: Argon)
         v4.7.3   (LTS: Argon)
         v4.8.0   (LTS: Argon)
         v4.8.1   (LTS: Argon)
         v4.8.2   (LTS: Argon)
         v4.8.3   (LTS: Argon)
         v4.8.4   (LTS: Argon)
         v4.8.5   (LTS: Argon)
         v4.8.6   (LTS: Argon)
         v4.8.7   (Latest LTS: Argon)
         v5.0.0
         v5.1.0
         v5.1.1
         v5.2.0
         v5.3.0
         v5.4.0
         v5.4.1
         v5.5.0
         v5.6.0
         v5.7.0
         v5.7.1
         v5.8.0
         v5.9.0
         v5.9.1
        v5.10.0
        v5.10.1
        v5.11.0
        v5.11.1
        v5.12.0
         v6.0.0
         v6.1.0
         v6.2.0
         v6.2.1
         v6.2.2
         v6.3.0
         v6.3.1
         v6.4.0
         v6.5.0
         v6.6.0
         v6.7.0
         v6.8.0
         v6.8.1
         v6.9.0   (LTS: Boron)
         v6.9.1   (LTS: Boron)
         v6.9.2   (LTS: Boron)
         v6.9.3   (LTS: Boron)
         v6.9.4   (LTS: Boron)
         v6.9.5   (LTS: Boron)
        v6.10.0   (LTS: Boron)
        v6.10.1   (LTS: Boron)
        v6.10.2   (LTS: Boron)
        v6.10.3   (LTS: Boron)
        v6.11.0   (LTS: Boron)
        v6.11.1   (LTS: Boron)
        v6.11.2   (LTS: Boron)
        v6.11.3   (LTS: Boron)
        v6.11.4   (LTS: Boron)
        v6.11.5   (LTS: Boron)
        v6.12.0   (LTS: Boron)
        v6.12.1   (LTS: Boron)
        v6.12.2   (LTS: Boron)
        v6.12.3   (Latest LTS: Boron)
         v7.0.0
         v7.1.0
         v7.2.0
         v7.2.1
         v7.3.0
         v7.4.0
         v7.5.0
         v7.6.0
         v7.7.0
         v7.7.1
         v7.7.2
         v7.7.3
         v7.7.4
         v7.8.0
         v7.9.0
        v7.10.0
        v7.10.1
         v8.0.0
         v8.1.0
         v8.1.1
         v8.1.2
         v8.1.3
         v8.1.4
         v8.2.0
         v8.2.1
         v8.3.0
         v8.4.0
         v8.5.0
         v8.6.0
         v8.7.0
         v8.8.0
         v8.8.1
         v8.9.0   (LTS: Carbon)
         v8.9.1   (LTS: Carbon)
         v8.9.2   (LTS: Carbon)
         v8.9.3   (LTS: Carbon)
         v8.9.4   (Latest LTS: Carbon)
         v9.0.0
         v9.1.0
         v9.2.0
         v9.2.1
         v9.3.0
         v9.4.0
pi@raspberrypi:~ $ nvm install v8.9.4
Downloading and installing node v8.9.4...
Downloading https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x86.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v8.9.4 (npm v5.6.0)
Creating default alias: default -> v8.9.4
pi@raspberrypi:~ $ node --version
v8.9.4
pi@raspberrypi:~ $ npm --version
5.6.0
pi@raspberrypi:~ $ 

-->

##5. google-home-notifierのインストール

```
$ cd ~
$ mkdir googlehome
$ cd googlehome
$ npm init
	★デフォルトのまま作成

$ sudo apt-get install libavahi-compat-libdnssd-dev
$ npm install google-home-notifier

```

<!--
【実行ログ】
pi@raspberrypi:~ $ cd ~
pi@raspberrypi:~ $ mkdir googlehome
pi@raspberrypi:~ $ cd googlehome
pi@raspberrypi:~/googlehome $ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (googlehome) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /home/pi/googlehome/package.json:

{
  "name": "googlehome",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) 
pi@raspberrypi:~/googlehome $ ls -la
合計 12
drwxr-xr-x  2 pi pi 4096  1月 21 00:50 .
drwxr-xr-x 23 pi pi 4096  1月 21 00:50 ..
-rw-r--r--  1 pi pi  206  1月 21 00:50 package.json
pi@raspberrypi:~/googlehome $ sudo apt-get install libavahi-compat-libdnssd-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libavahi-client-dev libavahi-common-dev libavahi-compat-libdnssd1 libdbus-1-dev
以下のパッケージが新たにインストールされます:
  libavahi-client-dev libavahi-common-dev libavahi-compat-libdnssd-dev libavahi-compat-libdnssd1 libdbus-1-dev
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
448 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,289 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://httpredir.debian.org/debian/ jessie/main libavahi-compat-libdnssd1 i386 0.6.31-5 [45.7 kB]
取得:2 http://httpredir.debian.org/debian/ jessie/main libavahi-common-dev i386 0.6.31-5 [65.9 kB]
取得:3 http://httpredir.debian.org/debian/ jessie/main libdbus-1-dev i386 1.8.22-0+deb8u1 [216 kB]
取得:4 http://httpredir.debian.org/debian/ jessie/main libavahi-client-dev i386 0.6.31-5 [60.3 kB]
取得:5 http://httpredir.debian.org/debian/ jessie/main libavahi-compat-libdnssd-dev i386 0.6.31-5 [60.2 kB]
448 kB を 1秒 で取得しました (276 kB/s)            
以前に未選択のパッケージ libavahi-compat-libdnssd1:i386 を選択しています。
(データベースを読み込んでいます ... 現在 121431 個のファイルとディレクトリがインストールされています。)
.../libavahi-compat-libdnssd1_0.6.31-5_i386.deb を展開する準備をしています ...
libavahi-compat-libdnssd1:i386 (0.6.31-5) を展開しています...
以前に未選択のパッケージ libavahi-common-dev を選択しています。
.../libavahi-common-dev_0.6.31-5_i386.deb を展開する準備をしています ...
libavahi-common-dev (0.6.31-5) を展開しています...
以前に未選択のパッケージ libdbus-1-dev:i386 を選択しています。
.../libdbus-1-dev_1.8.22-0+deb8u1_i386.deb を展開する準備をしています ...
libdbus-1-dev:i386 (1.8.22-0+deb8u1) を展開しています...
以前に未選択のパッケージ libavahi-client-dev を選択しています。
.../libavahi-client-dev_0.6.31-5_i386.deb を展開する準備をしています ...
libavahi-client-dev (0.6.31-5) を展開しています...
以前に未選択のパッケージ libavahi-compat-libdnssd-dev を選択しています。
.../libavahi-compat-libdnssd-dev_0.6.31-5_i386.deb を展開する準備をしています ...
libavahi-compat-libdnssd-dev (0.6.31-5) を展開しています...
libavahi-compat-libdnssd1:i386 (0.6.31-5) を設定しています ...
libavahi-common-dev (0.6.31-5) を設定しています ...
libdbus-1-dev:i386 (1.8.22-0+deb8u1) を設定しています ...
libavahi-client-dev (0.6.31-5) を設定しています ...
libavahi-compat-libdnssd-dev (0.6.31-5) を設定しています ...
libc-bin (2.19-18+deb8u10) のトリガを処理しています ...
pi@raspberrypi:~/googlehome $ npm install google-home-notifier

> mdns@2.3.4 install /home/pi/googlehome/node_modules/mdns
> node-gyp rebuild

make: Entering directory '/home/pi/googlehome/node_modules/mdns/build'
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_browse.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_enumerate_domains.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_get_addr_info.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_process_result.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref_deallocate.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref_sock_fd.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_register.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_resolve.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_update_record.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/mdns_utils.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/network_interface.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/socket_watcher.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_ref.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_create.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_deallocate.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_set_value.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_get_length.o
  CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_buffer_to_object.o
  SOLINK_MODULE(target) Release/obj.target/dns_sd_bindings.node
  COPY Release/dns_sd_bindings.node
make: Leaving directory '/home/pi/googlehome/node_modules/mdns/build'

> ngrok@2.2.25 postinstall /home/pi/googlehome/node_modules/ngrok
> node ./postinstall.js

ngrok - downloading binary https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-386.zip
ngrok - downloading progress: 5128043/5128043
ngrok - binary downloaded to /home/pi/.ngrok/aHR0cHM6Ly9iaW4uZXF1aW5veC5pby9jLzRWbUR6QTdpYUhiL25ncm9rLXN0YWJsZS1saW51eC0zODYuemlw.zip
ngrok - unpacking binary
ngrok - binary unpacked to /home/pi/googlehome/node_modules/ngrok/bin/ngrok
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN googlehome@1.0.0 No description
npm WARN googlehome@1.0.0 No repository field.

+ google-home-notifier@1.2.0
added 139 packages in 96.783s
pi@raspberrypi:~/googlehome $ 

-->


##6. テスト

```main.js
const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.2.113");
googlehome.notify('テストテスト。こんにちは。私はグーグルホームです。', function(res) {
  console.log(res);
});
```

<!--
【実行ログ】
pi@raspberrypi:~/googlehome $ node main.js 
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
Device notified
pi@raspberrypi:~/googlehome $ 

-->

##7. 結果
- 成功！！