見出し画像

【hamee AC 2020】RustでGoogle Homeに喋ってもらうコマンドを作る

$ cast-gtts -i 192.168.1.4 --text "来たか、諸兄、諸姉。この記事は、2020年、Hamee、アドベントカレンダー二日目の記事である。刮目せよ。驚天せよ。我が名はまさくに。割けろ、蒼天。開け、地獄の門。来たれ、エンジニア。約束の地、小田原へ。フハハハッハッハッハッハ。"

初めまして。

自分のnoteで「初めまして」っつーのもアレなんですが、転職後初めての記事なので、初めましての人のが多いのかもしれない。小田原のHamee株式会社でエンジニアリングマネージャーをしております正訓(まさくに)と申します。

そして、そうなんです。なんとご覧の記事はHamee Advent Calendar 2020、2日目の記事なんです。ありがとうございます。Hameeは皆さんお持ちかもしれない握りやすいiPhoneのスマホケース iFace などを販売している会社です。ぜひお手にとってみてくださいね。僕のスマホはGoogle Pixelなんですけれども。

アドベントカレンダー何書こう問題

さて、2日目の記事なんですデデンみたいなこと言いましたが、毎年アドベントカレンダーは何を書こうか迷います。たぶんみんなそうですよね。

年の終わりに考えをまとめたり、今年一年できなかったことを一念発起して触れてみたり、いい風物詩だと感じるようになってきました。これを世間ではアドベントカレンダー・ドリヴン・デベロップメント、略してACDDと呼ぶんだと思います。嘘です。

で、今年もご多分に漏れず迷いました。いや何か思い返せば書けるようなことも色々あったんですけど。例えば以前こんなことを

書いているにも関わらず転職した瞬間から完全リモートワークで遅効性の毒をがぶ飲みしているみたいな気持ちを書いても面白いなぁとも思ったんですけれど、何かそれは今年全員書いてそうだし、Rust前々から触ってみたかったので、普通にRust書いて遊ぶことにしました。

ちなみにこの記事も本当はQiitaに書きたかったのですが、QiitaにはYoutubeを埋め込む術がないみたいなので、やむなくnoteに書くことにしました。そのため、この記事にはコードを載せずGithubに置いてあります

Google Homeを喋らせられるのかな?

Rust初めて触るにあたって何作ろっかなーと考えて、よく聞くのはCLI作るの楽だよーって聞いた気がするし、exaripgrep(rg)もRust製だと聞いていたので、だったらコマンド作っちゃろうと思い立ちます。

Google Homeをリビングに置いてあって、今はほとんどが在宅ですし、自分の部屋から家族へ「そろそろ昼食べる」とかコマンドで伝えられたら、正直結果的に全然便利ではないとは分かってはいるものの、それも一つのロマンだと考え、Rustを使ってGoogle Homeを喋らせる方法を探しました。

同じようなもの作ってる人たくさんいるだろって思ってたけれど、世界の皆さんが作っているものは、僕にとってあまりにオーバースペックでした。ラズパイをWebサーバにして、公開して、それ経由してローカル内のGoogle Home叩く、みたいなのがほとんどでした。

そこまでじゃなくて全然いい。ローカルネットワーク内のGoogle Homeを何ならcurlで叩いて喋ってくれればそれでいいんだけど、そこまでお手軽なのは、みんな作ってなかった。凄いね。

初めてのRustで作ったもの

そんなこんなで、できたクソコードはこちらです。

結局、rust_castという先人の偉大なライブラリを使い、ローカルのIPでGoogle Homeに向けてメディアのURLを投げればWebサーバなどは不要で喋ってくれると分かりました。

あとそのライブラリのサンプルであるrust_casterというコードがほぼやりたいことと合致したので、それを参考に、文字列から音声ファイルを作ってくれるGoogleのText to Speech(gTTS)をくっつけて、冒頭の動画が出来上がりです。

何てことないスクリプトなんですけど、やっぱコード書くのは楽しい。

試しに歌わせてみる

$ cast-gtts -i 192.168.1.4 --text "ほ、ほ、ほけきょ。ほほほけきょ。ほ、ほ、ほけきょ。ほほほけきょ。うぐいすの好きな魚、ホッケだよ、ほけきょ、ほけきょ。"

ご唱和ください。

歌は僕が中学生のときに考えた歌、「うぐいすの歌」です。今Google Homeを通して聞いてみたら、薄い狂気を孕んでいることに気づくことができました。

今回は簡便のために、gTTSはベーシックなものしか使っていないのですが、APIを駆使するともっと人間のエモーショナルな部分を表現できるWaveNetというオプションが使えるようなので、もっと聞き取りやすくなると思います。

いずれにせよ、Google Home側からするとオーディオファイルを置いてあるURLを読み込むだけなので、アイディア次第で様々なことができるでしょう。

Rustの所感

Rust書いててまず困ったのは、単純にまだドキュメントやナレッジやライブラリがほんのり少ない感じはしました。困ったときにGoogleでヒットする情報はまだまだ少ない感じ。まだ日本語も少なかったかな。ほとんどPHP比で考えちゃってるので、それはそうかもしれないけれど。

逆にRustすっげぇ楽、って思ったのはやっぱコンパイルで事細かにエラーやらサジェストやらをやってくれること、パッケージマネージャーのcargoでインストールからビルド、テストまで何となくできることでしょうか。

あとはcrates.ioのエコシステム、githubとの関わり方、テストの書き方、型などには違和感を感じませんでした。ただnull安全だとかエラー処理だとか(unwrap多いな、とか)、Rustの特徴としてよく挙げられているものには、まだ全然本質的なところに触れられてないと思う。

書いていてフィット感はあったので、トータルで見て、ちょっとした使い捨てのツールを書くときにRustという選択でコマンド作っちゃうのもアリな気がしています。

追伸、From 2020

2020も最後ということで、実は、冒頭の動画は往年の有名Flash達のセリフでも喋らせて過去を振り返ってみようかと思ってたんですけど、著作権云々を引用って形で乗り越えたとしても、今の時代だとびっくりするぐらいアウトなセリフばかりだったので断念しました。

2020は暗い話は多かったけれど、時代や情勢、常識すらも流れていることを、かつての有名Flashから感じ取りました。ありがとう、Flash。お前がいなかったら僕は今の仕事をしてなかったかもしれないぜ。

今年もあと一ヶ月ということに衝撃を受けていますが、踏ん張っていきたいと思います。皆さん、筆舌に尽くしがたい2020、お疲れさまでした。少しでもいい方に流れていけるよう、2020以後も、尽力を重ねたいと思います。

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