Node.jsを使って、Google Homeに喋らせました。
その際詰まったところなどを解説します。
こちらのサイトを参考にnode.js作成
https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066
###0.node.jsのバージョン
$ npm -v
6.9.0
$ node -v
v10.16.0
###1.google-home-notifierをインストール
$ npm init
$ npm install google-home-notifier
※npm initはデフォルトでいい場合は全てEnterする。
###2.node.jsでサンプルコードを書く
//ライブラリ参照
var googlehome = require('./node_modules/google-home-notifier');
// 言語設定
var language = 'ja';
// GoogleHomeのIPアドレスに書き換えてくださいね
googlehome.ip('0.0.0.0',language);
// 第一引数を自分のもっているGoogleHomeの名前に書き換えてくださいね
//googlehome.device('googlehome', language);
// Google Homeにしゃべって欲しい文章をここに記入してくださいね
var text = 'こんにちは';
// メイン処理
try {
googlehome.notify(text, function(notifyRes) {
console.log(notifyRes);
});
} catch(err) {
console.log(err);
};
###3.実行
$ node sample.js
これでいけるはず...
Error: get key failed from google
###はまりました...orz
色々調べてこちらの対策を発見:[pull request](https://github.com/zlargon/google-tts/pull/14/commits/b5d1b8561fc1a34fac1e66bb280cd153d1a31044"pull request")
修正するも、動かない...。
調べても解決に至らずだったので、
※現在はnode_modules/google-home-notifier/package.jsonの
google-tts-apiのバージョンを上げる事で対応可能なようです。
詳細は下記コメント参照。
sienoriさんありがとうございました。
仕組み的な意味で意味で記事はそのまま残します。
###google-home-notifierのソースコードを確認してみる事にしました。
気になるところを発見!
var match = html.match("TKK='(\\d+.\\d+)';");
if(!match) throw new Error('get key failed from google');
htmlが何かのhtmlを読んでmatchさせているが失敗している。
そして、恐らく、それが、
var host = 'https://translate.google.com';
というわけで、
https://translate.google.com/
1.右クリックで**「ページのソースを表示」**
2.command+fで「TKK」検索
3.気になる内容が引っかかる。
tkk:'436044.375069185'
TKK = mobileWebapp.tkk
そして、ソースコードと照らし合わせてみると、
var match = html.match("TKK='(\\d+.\\d+)';");
恐らく以前は、
TKK='(\d+.\d+)'; //つまり、TKK=436044.375069185;数字は任意
と書いてあったけど、
今は、
https://translate.google.com/
のhtmlコードが変わってしまい
tkk:'436044.375069185',
TKK = mobileWebapp.tkk
となり、TKK='(\d+.\d+)';にmatchしなくなった。
そのため、tkk:'436044.375069185',にmatchするように修正。
//var match = html.match("TKK='(\\d+.\\d+)';");
var match = html.match("tkk:'(\\d+.\\d+)',");
動きました!
ちなみにソースコードはこちらにupしています。
###これで喋らせる事ができましたが...
日本語を喋るけど、発音が英語っぽい日本語になる問題が発生。
修正方法:https://qiita.com/sohsatoh/items/69bcad398ffae11359f0
この部分を
var ip = function(ip) {
deviceAddress = ip;
return this;
}
こう直すと直るようです。
var ip = function(ip, lang = 'ja') {
deviceAddress = ip;
language = lang;
return this;
}
完成!