ラズパイに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をアンインストール
$ sudo apt-get autoremove nodejs
パッケージを最新化
$ sudo apt-get update
$ sudo apt-get upgrade
nvmのインストール
nvmをインストールするためのディレクトリ作成
$ sudo mkdir ~/.nvm
$ sudo chmod 777 ~/.nvm
gitからnvmを取得
$ git clone https://github.com/creationix/nvm.git ~/.nvm
nvmを使えるようにする
$ source ~/.nvm/nvm.sh
$ nvm --version
起動時に読み込むようにする
$ vi ~/.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
then source ~/.nvm/nvm.sh
fi
Node.js のインストール
nvmでインストールできるNode.jsのバージョンのリストを確認
$ nvm ls-remote
この中で、LTS(安定版)バージョンをインストール
2018-09-16時点でv8.12.0
$ nvm install v8.12.0
Node.jsがインストールされたかどうかバージョンを確認
$ node --version
v8.12.0
$ npm --version
6.4.1
google-home-notifierのインストール
ここを参考にgoogle-home-notifierをインストール。
$ 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箇所)
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を起動する。これで待ち受け状態になる。
$ node example.js
喋らせる
リモート側からPOSTする。
curl -X POST -d "text=日本語でこんにちは" http://pi@raspberrypi.local:8091/google-home-notifier
これでGoogle Homeが喋りだすはず。