Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ラズパイにgoogle-home-notifierをインストールしたときの自分メモです。
LINEからGoogle Homeを喋らせるための下準備)

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

事前作業

古いNode.jsをアンインストール

Raspbian
$ sudo apt-get autoremove nodejs

パッケージを最新化

Raspbian
$ sudo apt-get update
$ sudo apt-get upgrade

nvmのインストール

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

Raspbian
$ sudo mkdir ~/.nvm
$ sudo chmod 777 ~/.nvm

gitからnvmを取得

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

nvmを使えるようにする

Raspbian
$ source ~/.nvm/nvm.sh
$ nvm --version

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

Raspbian
$ vi ~/.bash_profile
.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi

Node.js のインストール

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

Raspbian
$ nvm ls-remote

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

Raspbian
$ nvm install v8.12.0

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

Raspbian
$ node --version
v8.12.0

$ npm --version
6.4.1

google-home-notifierのインストール

ここを参考にgoogle-home-notifierをインストール。

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アドレスに変更する
    Google HomeのIPアドレスはスマホのGoogle Homeで調べることができる。
  • languageを'ja'に変更する(2箇所)
~/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を起動する。これで待ち受け状態になる。

Raspbian
$ node example.js

喋らせる

リモート側からPOSTする。

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

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

参考にしたサイト

yuppejp
とりあえずやってみます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away