google-home-notifierで"Error: get key failed from google"とエラーが出る問題の対処法

# 更新情報

2018/12/01
2018年11月29日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。。対策を追記。
2020/11/09
2020年11月7日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。。対策を追記。
2020/12/10
2020年12月7日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。。対策を追記。 



# 経緯

[Raspberry PiからGoogle Homeを喋らせる](https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09)　などで、google-home-notifierでGoogle Homeを喋らせていたが、9月末ごろから

```
Error: get key failed from google
    at /home/pi/work/googlehome/node_modules/google-tts-api/lib/key.js:27:13
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
```

などとエラーが出て喋らなくなってしまった。
軽く調べたところ [google-home-notifierが「Error: get key failed from google」を吐いたので対策してみた](https://qiita.com/ezmscrap/items/24b3a9a8548da0ab9ff5) などがひっかかったが、対策しないまま日が経ってしまった。

# 調査

上記記事にもある通り、GoogleのText-To-Speech(TTS)のAPIの仕様変更により、戻り値が変わり、エラーが出ている模様。
上記記事ではライブラリのコードを書き換えているが、
[google-ttsのChangeLog](https://github.com/zlargon/google-tts/blob/master/CHANGELOG.md) を見たところ、Google TTSのNode.jsライブラリは修正されているので、その変更を取り込むことにした。

# 対処

[google-home-notifierへのプルリクエスト](https://github.com/noelportugal/google-home-notifier/pull/47) が、2018-10-13時点でまだマージされていない。
対処法としては、google-tts-apiを0.0.3にバージョンアップすれば良いが、下記2通りの方法を思いついた。

## 対処1: google-home-notifierの書き換え

node_modules/google-home-notifier/package.jsonを [google-home-notifierへのプルリクエスト](https://github.com/noelportugal/google-home-notifier/pull/47) の通りに修正を行う。

```json:node_modules/google-home-notifier/package.json
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.3", // ここを0.0.3に書き換える
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },
```

その後、google-home-notifierに移動し、npm updateにてgoogle-tts-apiをアップデートする。

```bash:
cd node_modules/google-home-notifier
npm update google-tts-api
```

これで、node_modules/google-tts-apiが0.0.3にアップデートされる。

google-home-notifierのpackage.jsonを変更せずにアップデートしたかったが、npm update google-tts-api@0.0.3などとやってもアップデートできなかったので、仕方なくgoogle-home-notifierの方を変更した。npmのしくみがいまいちわかっていない…。

## 対処2: google-home-notifierのインストール元変更

[Use forked package · shiratsuchi/home-hack@86944c8](https://github.com/shiratsuchi/home-hack/commit/86944c838b96efdc83816fbd2c948a920933e6c7)
を参考に、フォークされたgoogle-home-notifierパッケージを再インストールする。

google-home-notifierを一旦アンインストール

```bash:
npm uninstall google-home-notifier
```

フォークされたリポジトリから再インストール

```bash:
$ npm install https://github.com/kei-s/google-home-notifier/tarball/update-google-tts-api
```

再インストールしたので、[After npm install](https://github.com/noelportugal/google-home-notifier#after-npm-install) に記載のnode_modules/mdns/lib/browser.jsの修正を再度行わないといけないのに注意。

## まとめ

上記どちらの方法でも、喋ってくれるようになった。
（なんか喋りが早くなったような…気のせいか？）

## 追記(2018/12/01)

11月29日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。。
ここに対処法があったので、実施したら治った。
https://github.com/zlargon/google-tts/issues/22
上記「対処1」で、0.0.3に変えるところを0.0.4に変えるだけ。

```json:node_modules/google-home-notifier/package.json
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.4", // ここを0.0.4に書き換える
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },
```

## 追記(2020/11/09)

11月7日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。
下記によるとgoogle-tts-api v0.0.5で対応されているとのこと
https://github.com/zlargon/google-tts/issues/33#issuecomment-723548451
上記「対処1」で、0.0.3に変えるところを0.0.5に変えるだけ。

```json:node_modules/google-home-notifier/package.json
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.5", // ここを0.0.5に書き換える
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },
```

google-home-notifierの更新、完全に止まってますね…。

## 追記(2020/12/10)

12月7日頃にまたGoogleTTSの仕様変更があり、喋らなくなってしまった。
@kaerugekogeko さんの情報によると、google-tts-api v0.0.6で対応されているとのこと。
情報ありがとうございました！
上記「対処1」で、0.0.3に変えるところを0.0.6に変えるだけ。

```json:node_modules/google-home-notifier/package.json
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.5", // ここを0.0.6に書き換える
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  },
```