GoogleHome
smartspeaker

自宅で動いているubuntu-server経由で任意の文字列をGoogle Homeに喋らせてみた

背景

グーグルホームを半額セールで購入しましたが
1日1回お天気を教えてくれるだけの存在になってしまいました。
いまのところ活用法がいまいち思い付きません。
そこで、グーグルホームに話しかけるではなく、例えば下記の使い方ができないかなと思い色々試すことにしました
1. スマホを持っていない子供に対して帰るコールを音声で送る
2. IFTTTと組み合わせて音声でnotificationを送ってもらう

やりたいこと

HTTP経由で任意の文字列を与えたら、自宅にある指定したグーグルホーム端末がその文字を読み上げる

構成

自宅の環境をざっくり説明するとこんな感じで考えています。
Google Homeに喋らせてみた.png

後述しますが、
1.まずはコマンドラインでGoogle Homeを喋らせるコマンドを作り。
2.できたら、HTTP経由でアクセスできるように、nginxでリクエストを受取り
アクセスログを監視するデーモンを作り、GET /command/arg1/arg2 HTTP...のようなログを

command arg1 arg2 

というような形式に変換して実行するような環境を考えました

最初にやったこと

GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます こちらを参考に
https://github.com/noelportugal/google-home-notifier を試しましたが、
どうも自分の環境だとmdnsがインストールできませんでした

google-home-speaker

なので、参考にしつつ自作して対処しました
google-home-speaker
npm 経由でインストール可能で

インストール方法

npm i -g google-home-speaker

使い方

下記のようにすると グーグルホームが"Hello world"と喋ります。
cldというライブラリで言語の自動判別ができるようにしましたので
Google HomeのIPアドレスと喋らせたい文字列を与えるだけでOKです

google-home-speaker 192.168.1.3 "Hello World" # en
google-home-speaker 192.168.1.3 "こんにちは世界" # ja
google-home-speaker 192.168.1.3 "مرحبا العالم" # ar
google-home-speaker 192.168.1.3 "안녕하세요 세계" # kr

altd

次に、nginxのアクセスログを監視して、リクエストパスをコマンド実行するようなデーモンを作りました
altd

インストール方法

npm i -g altd

使い方

下記のようにすると /var/log/nginx/access_logを
google-home-speakerとlsコマンドだけ許可した状況で監視しはじめます

altd /var/log/nginx/access_log -w google-home-speaker,ls

例えば
http://example.com/ls/-lh/%2Ftmp
にアクセスすると

ls -lh /tmp

に変換され

total 680K                                                                                                                                                                     
-rw-rw-r-- 1 user group 595K Dec 16 11:35 node-build.20171216113508.3603.log                                                                                            
drwxrwxr-x 2 user group 4.0K Dec 16 11:43 npm-10087-2d389e9e                                                                                                            
drwxrwxr-x 2 user group 4.0K Dec 16 11:48 npm-10607-a29bdecf                

のようなアウトプットがコンソールに表示されます

注意事項

今の構成だと、セキュリティ的な防御はまったくなく、誰でも自宅のグーグルホームにアクセス出来てしまいます。
また、altdもホワイトリスト方式でコマンドを制限してますが、なんか怖いですよね^^;
今後nginxに何か入れて誰でもアクセス出来てしまわないようにしようと思います。
あと、試してないですが みなさんが試されているようにRaspberry Piでも同じ構成で実現できるんじゃないかと思います。
また、下記どちらも何か有りましたらpull requestでFBいただけると幸いです
- google-home-speaker
- altd

最後まで読んで頂きありがとうございました。