google-home-notifierでGoogle Nestを喋らせてみました。これまでの流れをまとめてみました。
発端はこのような形でした:
というわけで、以下のようにコマンドを実行すると、
次のようにGoogle Homeを喋らせることができました。
Node.js
を利用できるようにしておきましょう。ここでは詳しくは解説しません。また、Ubuntuの場合は、以下のパッケージをインストールしておきます:
libnss-mdns
libavahi-compat-libdnssd-dev
オフィシャルなGithubリポジトリはメンテナンスがされておらず、うまく動作しなかったため、プルリクが来ていたリポジトリからインストールする必要があるようでした。
Support [email protected] by TomPenguin · Pull Request #55 · noelportugal/google-home-notifier · GitHubを参考にして、以下のコマンドを実行して、リポジトリからインストールします:
1
2
3
| % git clone https://github.com/TomPenguin/google-home-notifier.git
% cd google-home-notifier
% git checkout origin/feature/support-new-google-tts-api
|
以下のコマンドを実行して、必要なライブラリをダウンロードします:
修正が必要ということなので、以下を修正します:
項目 | 値 |
---|
修正対象 | node_modules/mdns/lib/browser.js |
修正前:
1
2
3
4
| Browser.defaultResolverSequence = [
rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
, rst.makeAddressesUnique()
];
|
修正後:
1
2
3
4
| Browser.defaultResolverSequence = [
rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
, rst.makeAddressesUnique()
];
|
調べてみた限り、以下の二通りの方法があるようでした:
- example.jsを利用する
- 自分でコードを作成する
git cloneしたディレクトリにあるexample.js
を以下のように修正します。修正前はngrok
を利用したり、ポルトガル語前提だったりするため。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| 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 Mini';
var ip = '192.168.10.50'; // default 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'; // default language code
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'; // default language code
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 () {
})
|
なお、Google HomeのIPアドレスはアプリから調べることができます:
![https://farm66.staticflickr.com/65535/51160371155_3b1420c44e_c.jpg]()
修正後、以下のコマンドを実行します:
1
2
3
4
5
6
7
| % node example.js
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/blog/projects/avahi-compat.html>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/blog/projects/avahi-compat.html>
|
別なターミナルを立ち上げて、以下のようにするとGoogle Homeを喋らせることができました:
1
| % curl -X POST -d "text=ゴールデンウィークが終わろうとしていて、サザエさんシンドロームにかかりつつあります。" http://localhost:8091/google-home-notifier
|
もしくは、GET
リクエストでも大丈夫みたい:
1
| % curl "http://localhost:8091/google-home-notifier?text=Hello+Google+home"
|
自分でコードを作成する場合は、このようなソースコードを作ればいいみたいです。
1
2
3
4
5
6
7
8
9
10
| var googlehome = require('./google-home-notifier');
var language = 'ja'; // if not set 'us' language will be used
// googlehome.device('Google Home Mini', language); // Change to your Google Home name
// or if you know your Google Home IP
googlehome.ip('192.168.10.50', language);
googlehome.notify('ゴールデンウィークが終わろうとしていて、サザエさんシンドロームにかかりつつあります。', function(res) {
console.log(res);
});
|
これをtest.js
などとして保存し、以下のようにすると、Google Homeを喋らせることができました:
1
2
3
4
5
6
7
8
| % node test.js
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/blog/projects/avahi-compat.html>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/blog/projects/avahi-compat.html>
Device notified
|