Google HomeとSlackで「開け、ゴマ!」
2018.08.13
こんにちは。ユニトラストの白石です。
弊社は去年の11月に神田美倉町ビルへ引っ越しました。
このビルは平日午後7時以降、及び休日は施錠されています。
またセキュリティ上の問題で外から開錠できる人は限られています。
そのため、自由に入れない時間帯に用事があって出社するときには
中にいる人に連絡を取って中から開錠してもらう必要があります。
弊社ではSlack上に#open_sesameという鍵を開けてもらうためのチャンネルを設けています。
このチャンネルに「セサミ。」「開けてください。」等のメッセージを投稿して中にいる人に出社したことを伝えます。
この通知が誰にも気づかれずにビルの入り口の前で待ちぼうけになってしまった人がいました。
そのため、今回は#open_sesameへメッセージがあった場合に
GoogleHomeにメッセージをしゃべってもらうシステムを構築しました。
動作環境
このシステムはセサミボットと名付けました。
セサミボットはGoで作成したプログラムです。
Raspberry Pi上でSlackの監視とGoogle Homeへのメッセージの送信を行っています。
Slackメッセージの監視と加工
セサミボットはSlackの自身が参加しているチャンネルのメッセージを常に監視しています。
nlopes/slackのフレームワークを使うことで
例えば、#open_sesameにメッセージが飛んでくると
メッセージやメッセージが送られたチャンネル、送ったユーザーの情報が取得できます。
今回はメッセージだけをつかいます。このメッセージにはメンションや絵文字が含まれているので
それらを除外したテキストに変換する必要がありました。
GoogleHomeでメッセージを再生
Google Homeにテキストを送れば、あとはGoogle Homeが読み上げてくれると思うかもしれませんが、
残念ながらGoogle Homeにテキストを渡せば、メッセージをGoogle Homeが読み上げてくれるわけではありません。
Google Homeは音声ファイルを再生してくれるだけです。
なので、テキストから音声ファイルを作成する仕組みをセサミボットで組み上げる必要がありました。
一見難しそうなことですがevalphobia/google-home-client-goのフレームワークを使うと簡単にできます。
このフレームワークだけで、テキストから音声ファイルを作成してGoogle Homeへ転送することを数行で実現できます。
ただし、このフレームワークをそのまま使うと
漢字が含まれた場合、無音の音声ファイルがGoogleHomeで再生されます。
フレームワークを解析した結果、
evalphobia/google-tts-go/tts.goの中に
params.Set("textlen", opt.getTextLength())
テキストの長さをGoogle Speech APIに渡している箇所がありました。
ひらがなだけの場合は音声ファイルは正常に再生されたので、
入力したテキストと音声ファイルのために漢字からカタカナへ翻訳したテキストの文字数が異なっていたときに
このパラメータをセットされていると不具合が発生するのではないか?と当たりをつけて
この1行をコメントアウトすることで漢字が含まれても期待通りの音声ファイルを再生することができました。
落ちても再起動するシステム
弊社では土曜日にも個人学習や新人研修(弊社の新人研修は火〜土)のために出社する人がいるため、
休日にセサミボットが動いていないということは致命的です。
そのため、セサミボットが動いているかどうかをプロセスで確認して、プロセス上に確認できなかったら
プログラムを再起動するプログラムをGoで作成して、cronで定期的に実行しています。
最後に
最初は私物のGoogle HomeとRaspberry Piで組んでいたシステムでしたが、有用性とユニークさが認められて
会社費用で執務室、ラウンジ、社長室の3カ所にGoogle Homeが設置されました。
これらのGoogle Homeが1台のRaspberry Piから同時にメッセージが読み上げられるようになったことで、
社内全体で「誰かが来た」ことを確認できるようになりました。
※この記事で使用しているGopherくんはtenntennさん著のイラストです。
CONTACT
お問い合わせ
あなたの「想い」に挑戦します。
どうぞお気軽にお問い合わせください。
受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く