8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Error解析&Node.js&google-home-notifierでGoogle Homeに喋らせよう

Last updated at Posted at 2019-09-29

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でサンプルコードを書く

sample.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のソースコードを確認してみる事にしました。

気になるところを発見!

node_modules/google-tts-api/lib/key.js
var match = html.match("TKK='(\\d+.\\d+)';");
if(!match) throw new Error('get key failed from google');

htmlが何かのhtmlを読んでmatchさせているが失敗している。
そして、恐らく、それが、

node_modules/google-tts-api/lib/key.js
var host = 'https://translate.google.com';

というわけで、
https://translate.google.com/

のhtmlを解析していきます。
スクリーンショット 2019-09-29 22.09.46.png

1.右クリックで**「ページのソースを表示」**
2.command+fで「TKK」検索
3.気になる内容が引っかかる。

view-source:https://translate.google.com/
tkk:'436044.375069185'
TKK = mobileWebapp.tkk

そして、ソースコードと照らし合わせてみると、

node_modules/google-tts-api/lib/key.js
var match = html.match("TKK='(\\d+.\\d+)';");

恐らく以前は、
TKK='(\d+.\d+)'; //つまり、TKK=436044.375069185;数字は任意

と書いてあったけど、
今は、
https://translate.google.com/ 
のhtmlコードが変わってしまい

view-source:https://translate.google.com/
tkk:'436044.375069185',
TKK = mobileWebapp.tkk

となり、TKK='(\d+.\d+)';にmatchしなくなった。
そのため、tkk:'436044.375069185',にmatchするように修正。

node_modules/google-tts-api/lib/key.js

//var match = html.match("TKK='(\\d+.\\d+)';");
var match = html.match("tkk:'(\\d+.\\d+)',");

動きました!

ちなみにソースコードはこちらにupしています。

###これで喋らせる事ができましたが...
日本語を喋るけど、発音が英語っぽい日本語になる問題が発生。
修正方法:https://qiita.com/sohsatoh/items/69bcad398ffae11359f0

この部分を

google-home-notifier.js
var ip = function(ip) {
    deviceAddress = ip;
    return this;
}

こう直すと直るようです。

google-home-notifier.js
var ip = function(ip, lang = 'ja') {
    deviceAddress = ip;
    language = lang;
    return this;
}

完成!

8
8
3

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
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?