ラズパイでgoogle-home-notifierのセットアップ方法

ラズパイにgoogle-home-notifierをインストールしたときの自分メモです。
（[LINEからGoogle Homeを喋らせる](https://qiita.com/yuppejp/items/64f7769015c8245ee451)ための下準備）

2018/9/24追記：
google-home-notifierが「Error: get key failed from google」で動作しなくなってしまっいました。解決された方がいたので、参考にさせていただきました。
[google-home-notifierが「Error: get key failed from google」を吐いたので対策してみた](https://qiita.com/ezmscrap/items/24b3a9a8548da0ab9ff5)

# 事前作業
古いNode.jsをアンインストール

```bash:Raspbian
$ sudo apt-get autoremove nodejs
```

パッケージを最新化

```bash:Raspbian
$ sudo apt-get update
$ sudo apt-get upgrade
```

## nvmのインストール

nvmをインストールするためのディレクトリ作成

```bash:Raspbian
$ sudo mkdir ~/.nvm
$ sudo chmod 777 ~/.nvm
```

gitからnvmを取得

```bash:Raspbian
$ git clone https://github.com/creationix/nvm.git ~/.nvm
```

nvmを使えるようにする

```bash:Raspbian
$ source ~/.nvm/nvm.sh
$ nvm --version
```

起動時に読み込むようにする

```bash:Raspbian
$ vi ~/.bash_profile
```



```bash:.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

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

nvmでインストールできるNode.jsのバージョンのリストを確認

```bash:Raspbian
$ nvm ls-remote
```

この中で、LTS（安定版）バージョンをインストール
2018-09-16時点でv8.12.0

```bash:Raspbian
$ nvm install v8.12.0
```

Node.jsがインストールされたかどうかバージョンを確認

```bash:Raspbian
$ node --version
ｖ８．12．0

$ npm --version
6.4.1
```


## google-home-notifierのインストール
[ここ](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac)を参考にgoogle-home-notifierをインストール。

```bash:Raspbian
$ sudo apt-get install libavahi-compat-libdnssd-dev
$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier
$ npm install
```

わんさか警告が吐かられるが、エラーが出ていなければ、無視して先に進む。

# example.jsを環境に合わせて修正する

- ipをGoogle HomeのIPアドレスに変更する<br>Google HomeのIPアドレスはスマホのGoogle Homeで調べることができる。
- languageを'ja'に変更する（2箇所)

```javascript:~/google-home-notifier/example.js
var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8091; // default port

var deviceName = 'Google Home';
var ip = '192.168.1.20'; // default IP ← Google HomeのIPアドレスに変更

ar urlencodedParser = bodyParser.urlencoded({ extended: false });

app.post('/google-home-notifier', urlencodedParser, function (req, res) {

  if (!req.body) return res.sendStatus(400)
  console.log(req.body);

  var text = req.body.text;

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'pl'; // default language code ←jaに変更
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language);

  if (text){
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello Google Home"');
  }
})

app.get('/google-home-notifier', function (req, res) {

  console.log(req.query);

  var text = req.query.text;

  if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'pl'; // default language code  ← jaに変更
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language);

  if (text) {
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
  }else{
    res.send('Please GET "text=Hello+Google+Home"');
  }
})

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
    console.log('    ' + url + '/google-home-notifier');
    console.log('GET example:');
    console.log('curl -X GET ' + url + '/google-home-notifier?text=Hello+Google+Home');
        console.log('POST example:');
        console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
})
```

## google-home-notifierの起動
google-home-notifierを起動する。これで待ち受け状態になる。

```bash:Raspbian
$ node example.js
```

# 喋らせる
リモート側からPOSTする。

```:macOS
curl -X POST -d "text=日本語でこんにちは" http://pi@raspberrypi.local:8091/google-home-notifier
```

これでGoogle Homeが喋りだすはず。

# 参考にしたサイト
- [Raspberry PiからGoogle Homeを喋らせる - Qiita](https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09)
- [GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます - Qiita](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac)