🌊

Google Home をミュージックジュークボックスにする

2022/09/27に公開

Google Home をミュージックジュークボックスにする

Google Home を手に入れてしばらく使ってみると、そのうち大抵の人がジュークボックスにしたいと思い始めると思います。この記事では、どうにかして Google Home に手持ちの MP3 ファイルを再生させて、ミュージックジュークボックスにする方法について書いておきます。

案1: YouTube Music Premium を契約する

YouTube Music の有料プランを契約すると、手持ちの音楽ファイルをクラウドのプライベート領域にアップロードしておき、そのライブラリから再生させることが出来ます。

お金で解決というダメな大人の手段です。

案2: go-chromecast

Go言語で作られた go-chromecast を使うと、ローカルにある MP3 ファイルを Google Home などの chromecast に送り付けて再生することが出来ます。まさにこれが求めていたソリューションですね。

ただ、音声コマンドで再生開始出来るわけではなく、 cli でコマンドラインからの操作になります。

$ go-chromecast load MP3/

というわけで、このコマンドをどうやって音声で操作するか、ということを考えていきます。

案3: IFTTT を使う

IFTTT を使用すると、 Google Home から音声コマンドで Web API を叩くことが出来ます。

例えば、以下のサイトでは、 Google Home から IFTTT 経由で一度 Slack にキーワードを投稿し、 Slack からそのキーワードを見つけると、 MP3 ファイルの再生を開始させる方法が解説されています。

https://www.littlelab.jp/2021/02/06/google-home-system-01/

最終案: go-chromecast

案2で使用した go-chromecast が持っている watch コマンドで、 Google Home などの chromecast が音楽を再生しているかどうかの状態を取得することが出来ます。この状態を監視して、また go-chromecast で音楽の再生を開始してしまえば、目的達成です。

では設置していきましょう。今回は Debian 11 を使用しましたが、大した CPU パワーは使わないはずなので、 Raspberry Pi とかを利用するといいと思います。

まずは、 go-chromecast が MP3 を転送するときに、 ffmpeg が必要らしいので、 ffmepg をインストールします。

$ apt-get install ffmpeg

そして、 go-chromecast と以下のスクリプトを設置します。

#!/bin/sh

uuid="[YOUR_GOOGLE_HOME_UUID]"

go-chromecast watch -u "${uuid}" |
        (\
        while read line
        do
                status=`echo $line | sed 's/^.*,"playerState":"//g' | sed 's/".*$//g'`
                if [ "$status" = "PLAYING" ] || [ "$status" = "BUFFERING" ]; then
                        echo "START!"
                        go-chromecast playlist -u "${uuid}" MP3/
                elif [ "$status" = "PAUSED" ]; then
                        echo "STOP!"
                fi
        done
        )

[YOUR_GOOGLE_HOME_UUID] の部分は、 Chromecast デバイスが複数あった場合への対処として入れておきました。以下のコマンドを実行すると表示されますので、ご自身の環境に置き換えてください。

$ go-chromecast ls

これで、 Google Home に向かって "音楽を再生して" などとして、何か音楽を再生しようとすると、勝手にローカルの MP3 フォルダの曲を再生し始めます。

ただ、 MP3 ファイルを Google Home が再生できるように変換する時間があるらしく、実際に再生が始まるまで 20秒くらい待たされます。ちと残念ですね。

Discussion