OBONO’s Diary

へっぽこプログラマの戯言

スマートスピーカー

これの具体的な実現方法は、google 先生に聞けば、「ラズパイに node.js 入れて google-home-notifier を使う」という記事がたくさん出てくるので、基本的にはその通りにやれば良い…のだが、ちょっとハマったので記事にしておく。

  • LF-S50G の場合は、deviceName = 'LF-S50G' とする必要がある
  • 日本語の場合、langage は 'jp' ではなく 'ja' (凡ミス…)
  • IFTTT 連携でメールの本文を喋らせようとしたら、引用の部分とかまで全部喋ってしまうので、最初の一行だけ喋らせるようにした
  • 自分の場合は ngrok は不要なので、使わないようにした
  • URL はランダム文字列で多少は複雑にした


出来上がったスクリプトはこんな感じ。

var express = require('express');
var googlehome = require('google-home-notifier');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 12345; // Listen port
const deviceName = 'LF-S50G';
const ip = '192.168.xxx.xxx'; // IP address of the device
const language = 'ja'; // language code
const path = '/NTfGjgXl9QKSYNURqW837ipMFmAreHVF9ZejGrJEaufaQJtLb8jkMC1102VtMzyG';

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

app.post(path, urlencodedParser, function (req, res) {

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

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

  var from = req.body.f;
  var message = req.body.m;
  if (from && message) {
    message = message.replace(/\r\n/g, '\n').replace(/^\n+/g, '').replace(/\n[\s\S]*$/, '');
    var text = from + 'からメール。' + message;
    try {
      googlehome.notify(text, function(notifyRes) {
        console.log(notifyRes);
        res.sendStatus(204);
      });
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
    }
  } else {
    res.sendStatus(400);
  }
});

app.listen(serverPort, function () {
  console.log('Endpoints:');
  console.log('    http://localhost:' + serverPort + path);
  console.log('Example:');
  console.log('    curl -X POST -d "f=Somebody&m=Hello" localhost:' + serverPort + path);
});

ちなみに、実際の serverPort や path の値は、この例とは違うものにしているのであしからず。
あとは、スクリプトのサービス化手段として forever なるものを導入して、ラズパイ起動時に自動的にサービスが始まるようにした。これにて作業終了。