🔊

google-tts-api を使わない google-home-notifier

2 min read

こんにちは! bvlion と申します<(_ _)>
この記事は、スマートスピーカー Advent Calendar 2020 の 9日目です!

はじめに

google-home-notifier を長く愛用してきたのですが、google-tts-api が更新されないと喋ってくれないことが増えてきました。。。
この記事作成の直近だと 2020/12/01 の 10時頃から Error: get key failed from google とエラーが出てしゃべててくれなくなってしまいました…

Web を徘徊していると多くの方がローカルの package.json をアップデートして使っているようで、大元の更新はもう長いことされていないようです。
人によっては google-home-notifier の再生する機能だけを利用されている方もいらっしゃるようですが、ライブラリも古くなっていたため、タイトルの通り google-tts-api を使わない google-home-notifier を作りましたので紹介させていただければと思います!

リポジトリ

https://github.com/bvlion/google-home-notifier-2

開発の流れ

もうリポジトリを見ていただければそれで終わりなんですが、ただの宣伝にならないよう簡単に開発の流れなど書かせていただければと思います。

方法の検討

google-home-notifier のソースを見てみると、castv2-client を使ってデバイスに再生する mp3 等の URL を渡すことで喋ったり音楽を再生してくれていそうだということが分かります。
文字列を喋らせる場合、google-tts-api を使うことで合成された音声ファイルの URL がが返ってくるようなので、この部分を置き換えられれば google-tts-api を利用しない google-home-notifier が作れそうです。

音声合成

Watson や Azure にもありますが、せっかく Google Home に喋らせるので Google Cloud を利用することにしました。
既に npm に @google-cloud/text-to-speech があったのも Google Cloud を選んだ理由の 1つです。

基本的な利用方法は https://cloud.google.com/text-to-speech/?hl=ja を見ていただければ分かりますが、json のキーファイルを設定して @google-cloud/text-to-speech を利用すれば synthesizeSpeech を呼び出すだけで row データが返ってくきます。
返ってきたデータをローカルに保存すれば音声合成は完了です。

音声合成ファイルを公開状態にする

もしかしたら castv2-client でバイナリを直接渡すこともできるのかもしれませんが、ngrok を使うことで簡単に公開 URL を作成でき、既存ソースを大きく変える必要もなくなるのでこちらを利用します。
express でローカルサーバーを立て、その内部で ngrok に接続することで URL が作成されます。
生成された URL を exports function を介して contentId に設定し、castv2-client に渡してあげれば無事に喋ってくれます。

その他

google-tts-api のソースを追ってないので分かりませんが、再生される音声が異なるようです。
少しだけ慣れるまでに時間がかかりそうですね…
私は ja-JP-Wavenet-B を利用しています。

最後に…

無料枠だと Cloud Text-to-Speech の利用に制限がありますが、個人で利用する分には無料枠で十分だと思います。
私の個人的な使い方としては、朝の時報とちょっとしたスクレイピングの情報を喋らせていますが、大きな違和感もなく、今のところ順調に使えています。
使い方も元の google-home-notifier とは大きく変えていないので、多くの方にご利用いただけたら嬉しいです!