見出し画像

Google Homeでプッシュ通知 (HTTP経由でメッセージを送りAmazon Pollyの声で自発的に喋らせる)

スマートスピーカーが流行って数年経つも、自分が必要な時に空気を読んで一声掛けてくれるようなスマートなものはまだ見たことがない。どうしても自分で話しかけて、適切な質問をしないと答えてくれない。まして任意の何かへの問い合わせを口語でしようとすると、その仕組みを組み立てるのも、良い質問を手短にするのもなかなか難しい。

背景

前職で自分はData Technologistとして所謂ビッグデータを扱う仕組みを作ったり、そのデータに基づいて施策や組織をどうするかみたいなことをやっていた。このとき、何十分もかかる処理を始めると、まだかまだかと終わるのを待ちつつ進捗を確認することがあった。しかしこの、チラチラ進捗を見るというのは作業時間が断片化するし、いちいち何かを開いたりコマンドを打ったりと、時間の無駄でもあった。

その後、CI/CDの世界に関わるようになり、これもやはりビルドやテストがどうなっているか、終わるのを待つとか進捗を確認するといった作業がある。もちろんSlack連携でステータスをプッシュ通知にすることはできるが、チャネルに新着通知が来るかとか、スマホに通知が来たらロック解除して確認するとか、プッシュといいつつプル的な作業は無くならないように思う。

この確認というのはなぜか視覚的な入力に頼っているように思う。人間には五感があるのに、1つの経路に全て詰め込まなくたっていいじゃないか。というか、普通に人間がやるように、終わったら一声掛けてね、という運用がしたかった。

解決策

ということで、汎用的になんでもかんでも声でお知らせしてくれる仕組みを作ろうと思い立って、色々調べて組み立てたのが、Google Home - Amazon Polly bridge 。(castv2-clientの依存関係で脆弱性アラート出てるのは把握している…)

機能としては、3つのパートがあり、
1. HTTPサーバーでテキストデータを受け取る
2. Amazon Polly にテキストデータその他を送り音声合成をする
3. Google Homeデバイスを検知し、合成した音声を再生する

使い方

GitHubに簡単に説明している通りで、コード一式を手元に揃えたら、パッケージのインストールをしてindex.jsを動かせば準備完了。

まずはGitHubからコード一式を持ってくる。
Google Home - Amazon Polly bridge

Mac で Docker を使っているような場合だと、

docker build -t googlehome-polly-bridge .
docker run --net=host \
-e "AWS_ACCESS_KEY_ID=ABCDEFG" \
-e "AWS_SECRET_ACCESS_KEY=zxcvbnm1234567789asdfghjkl" \
-e "AWS_REGION=ap-northeast-1" \
-e "POLLY_LANG=ja-JP" \
-e "POLLY_VOICE=Takumi" \
-e "POLLY_TYPE=text" \
-e "POLLY_SAMPLE_RATE=22050" \
-e "HTTP_PORT=8080" \
-e "HTTP_HOST=192.168.0.2" \
-e "GOOGLE_HOME=Kitchen" \
--restart=on-failure
googlehome-polly-bridge

で準備OK。

Raspberry Pi で最小限動かしたい場合は、環境変数を設定するか `.env` ファイルをテンプレートを元に組み立てた上で、

npm install
npm start

でできるはず。(Raspberry PiだとIPアドレスは自動取得できるはずなので環境変数で渡さなくてもOK)

環境ができたら、あとはGoogle Homeに喋らせたい言葉を送るだけ。

curl localhost:8080 -X POST -d '夢を見られるなら、実現できる'

みたいに、curlでPOSTリクエストを送り、リクエストボディに喋らせたい言葉を入れれば、こちらが話しかけなくてもピロンの音の後に話し始める。

GETパラメータを通じて音声と喋らせる端末を変えられる。

curl -X POST http://localhost:8080/?lang=ja-JP\&voice=Takumi\&type=ssml -d '<speak>夢は、<break time="200ms"/><emphasis>叶う</emphasis></speak>'


どんなことに使っているか?

自分の場合、主に2つの使い方をしている。

1. Slackボットを使って特定のSlackメッセージを検知したら、Google Homeに読み上げてもらう(CI/CDツール → WebHook → Slackボット → Google Home)
2. ウェブのスクレイピングで、更新があったら通知してもらう (ニュースサイトの一部カテゴリとか、何かのグループのイベント情報とか)

まとめ

音声で通知してくれると、何か作業していても勝手に聞こえてくるので「確認する」プロセスを削減できた気がする。気のせいかもしれない。



この記事が気に入ったらサポートをしてみませんか?