LoginSignup
8
7

More than 5 years have passed since last update.

Raspberry Piを使ってGoogle Homeを自発的に喋らせる

Last updated at Posted at 2018-03-06

Google Homeは話しかけると喋ってくれますが、自発的に喋るのは苦手なようです。僕みたいですね。そこでRaspberry Piを使って、内気なGoogle Homeくんを自ら喋らせてみました。

使用したもの

  • Google Home mini
  • Raspberry Pi 3

使用した環境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:    8.0
Codename:   jessie
$ node -v
v9.6.1
$ npm -v
5.6.0

Google Homeを自発的に喋らせる方法

Google Homeに通知を送ることのできるgoogle-home-notifierを使います。これをRaspberry Pi上で動作させ、Google Homeに通知を送ってやることで、Google Homeが喋ります。

以下コマンドで、Node.jsとnpmの最新版をインストールします。

sudo apt-get update
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n stable

以下コマンドで、必要なパッケージをインストールします。

$ sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev

以下コマンドで、google-home-notifierをダウンロードし、必要なパッケージをインストールします。

$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier
$ npm install

以下コマンドで、設定ファイルを編集します。コメント行を適宜修正してください。

$ vi 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; // リスナーポートです。必要であれば変更してください。

var deviceName = 'Google Home';
var ip = '192.168.1.20'; // Google HomeのIPアドレスを設定します。

var 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 = 'ja'; // Google Homeに喋らせたい言語を設定します。今回は日本語なので「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 = 'ja'; // Google Homeに喋らせたい言語を設定します。今回は日本語なので「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');
  });
})

もうひとつ、設定ファイルを編集します。

$ vi node_modules/mdns/lib/browser.js

# before
Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
, rst.makeAddressesUnique()
];

#after
Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
, rst.makeAddressesUnique()
];

以下コマンドで、google-home-notifierを起動します。コマンドの後ろに&をつけるとバックグラウンド実行できます。

$ node example.js
or
// バックグラウンド実行
$ node example.js &

以下コマンドで、Google Homeに喋ってもらいます。

$ curl -X POST -d "text=はじめまして。" http://(RaspberryPiのIP):8091/google-home-notifier

まとめ

あの内気なGoogle Homeくんが喋った!

参考リンク

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7