ふへへへ。スマートスピーカーから任意の文章を喋らせることができるようになったぜ。さて、ここからどう発展させるかな。
これの具体的な実現方法は、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 なるものを導入して、ラズパイ起動時に自動的にサービスが始まるようにした。これにて作業終了。