Google Homeで音楽アラーム

テックポエム

0803未提出_鈴木章

はじめに

Google Homeが発売が発売されてそろそろ一年がたちます。
皆様はスマートスピーカーを使っていますか?

我が家ではテレビのChromeCastの操作やアラームなど、いろいろな用途で活躍しています。
が、気に入らない点が一つあります。
それはアラーム音がプリセットのみで選択できないことです。

できないのなら作ればいい。
今回はPCからGoogleHomeを操作し、指定時間に音楽を鳴らしてみたいと思います。

環境

Windows 10 x64

準備

Google Homeで音楽を鳴らすために必要な開発環境・ミドルウェアをセットアップします。

Node.js

Nodistを使ってNode.jsの最新版をインストールします。

C:\Users\xxxxx> nodist dist C:\Users\xxxxx>nodist + 10.7.0 C:\Users\xxxxx>nodist 10.7.0 C:\Users\xxxxx>nodist npm match 
Python

python2.7をインストール。
https://www.python.org/downloads/

node-gyp

ネイティブ拡張を利用するためのパッケージをnpmから取得します。

# 要管理者権限 C:\Users\xxxxx>npm install -g windows-build-tools C:\Users\xxxxx>npm install -g node-gyp 
Bonjour SDK

以下からダウンロードしてインストールします。
https://developer.apple.com/download/more/?=Bonjour+SDK+for+Windows

Bonjour Print Service

以下からダウンロードしてセットアップ。
https://support.apple.com/kb/DL999?locale=ja_JP&viewlocale=ja_JP

google-home-notifier

今回の肝。
Google Homeを操作するためのパッケージを取得します。

C:\Users\xxxxx>git clone https://github.com/noelportugal/google-home-notifier C:\Users\xxxxx>cd google-home-notifier C:\Users\xxxxx>npm install 

以上で準備完了です。

Google Homeと繋ぐ

google-home-notifierに付属する example.js を修正して手元のGoole Homeスピーカーを喋らせてみます。

example.jsの設定変更

スマホのHomeアプリからGoogle HomeのIPアドレスを確認してexample.jsを書き換え。

var app = express();
const serverPort = 8091; // default port

var deviceName = 'Google Home';
var ip = '192.168.1.20'; // ここを書き換え

そのままだとパラメータで指定した言語が反映されない問題があるようなので修正しておく。

var language = 'pl'; // default language code
if (req.query.language) {
    // language;
    language = req.query.language;
}

example.jsを実行

C:\Users\xxxxx> node example.js Endpoints: http://xxxxx:8091/google-home-notifier https://xxxxx.ngrok.io/google-home-notifier GET example: curl -X GET https://xxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home POST example: curl -X POST -d "text=Hello Google Home" https://xxxxx.ngrok.io/google-home-notifier 

実行するとGoogle HomeにアクセスするためのURLが表示されるので、
ブラウザなどでアクセスする。

exampleを素直に実行
https://xxxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home

日本語で喋らせてみる。
https://xxxxxx.ngrok.io/google-home-notifier?text=こんばんは&language=ja

正しく設定できていればGoogle Homeが喋りだします。

音楽ファイルを再生する。

google-home-notifier.jsをみるとmp3を呼び出すための処理が用意されています。

var play = function(mp3_url, callback) {
  if (!deviceAddress){
    browser.start();
    browser.on('serviceUp', function(service) {
      console.log('Device "%s" at %s:%d', service.name, service.addresses[0], service.port);
      if (service.name.includes(device.replace(' ', '-'))){
        deviceAddress = service.addresses[0];
        getPlayUrl(mp3_url, deviceAddress, function(res) {
          callback(res);
        });
      }
      browser.stop();
    });
  }else {
    getPlayUrl(mp3_url, deviceAddress, function(res) {
      callback(res);
    });
  }
};

MP3のURLを渡すとGoogle Homeで再生してくれるようです。
こちらの処理をつかってアラーム用のMP3を再生します。

MP3再生処理を作成

適当なWebサーバーに再生させたいMP3ファイルをアップロードして、
それを再生する処理を作成します。

var googlehome = require('./google-home-notifier');

var deviceName = 'Google Home';
var ip = '192.168.1.20';
var language = 'ja';
var text = "http://example.com/hoge.mp3";  // mp3 url

googlehome.ip(ip, language);
googlehome.device(deviceName,language);
googlehome.play(text, function(notifyRes) {
    console.log(notifyRes);
});

実行するとアップロードした音楽が再生されます。
あとは、タスクスケジューラーへ上のスクリプトをに登録すれば最低限のアラームが完成です。

終わり

これでタスクスケジューラで指定した時間に音楽を鳴らすことができます。
ただ、こんな運用をするなら、そのまま音楽を鳴らしたほうが楽ですね…

Google Homeを活用するのであれば以下のような構成にするべきなのかなと思いました。

graph LR ID1[Google Home] ID2[IFTTT] ID3[SpreadsHeet] ID4[アラームスクリプト] ID1 -- アラーム時刻入力 --> ID2 ID2 -- 書き込み --> ID3 ID3 -->ID4 ID4 -- 時刻読み込み --> ID3 ID4 -- 音楽再生指示 --> ID1

また、都度都度MP3をアップロードしなければ不便。
GMusicProxyを使えばGoogle Play Musicのプレイリストを参照できそうなので、
これを使えば幸せになれそう。

いろいろと課題はありますが、今回はここまでとしたいと思います。
以上、ありがとうございました。

参考

Windowsでgoogle-home-notifierを使う
https://qiita.com/tomatosum/items/046200efe9acd9fb00be