目的
Alexaから、"パソコンに入っている音楽"を、"パソコンにつながっているスピーカー"で流したい。
きっかけ
先日、Amazon Prime Dayが開催された。
普段Web会議の時に同僚のAlexaが会議のリマインドを教えてくれているのを聞いて、
密やかに羨ましがっていた私は一も二もなくAmazon echo show5を購入した。
到着するのを心待ちにしつつ、どんな事が実現できるのかをネットサーフィン。
よく聞くのは「音楽を流して」というやつだなぁ、などと思っていたのだが……。
現実
Alexaに「音楽を流して」と言っても、Amazon Musicの"よく知らない人"の、"よく知らない曲"を、
echoのそこまで良いわけでもないスピーカーが流すということしかできない。
それなら自分のパソコンの中に入っている音楽を、パソコンにつながっている高性能なスピーカーから流した方が断然良い。
ただ……まぁ……せっかくecho買ったんだし、なんとかしてみようと思う。
構成
Alexa -> IFTTT -> Beebotte -> Windows10(音楽ファイルが入っているパソコン)
IFTTT とは
サービスとサービスをつなげるサービス。
〇〇をしたら、□□をする、というように、いずれかのサービスをトリガーに別のサービスを発火
Twitterに投稿したら、同じことをインスタに投稿する、というようなことが実現できる。
Beebotte とは
MQTTブローカ + REST API + Web Socketサービス。
IoT向けのサービスで、メッセージのPub/Subが出来る。
実装
1.Beebotte でチャンネルを作る
2.beebotteサーバのpemファイルを取得
↓にアクセスするとダウンロードできる。
https://beebotte.com/certs/mqtt.beebotte.com.pem
3.Subクライアントを実装する
言語はなんでも良いので、MQTTライブラリが便利そうなものを選ぶ。
今回はPythonを利用。
ライブラリをインストールする。
pip install paho-mqtt
コードを書く
import paho.mqtt.client as mqtt
import subprocess
import json
# MQTT Broker
HOST = "mqtt.beebotte.com"
PORT = 8883
KEEP_ALIVE = 60
TOKEN = "token:token_hogehogefugafuga"
PEM_PATH = "mqtt.beebotte.com.pem"
CHANNEL = "yourChannnel/yourResource"
# winampのpath
WINAMP_PATH = "C:\Program Files (x86)\Winamp\winamp.exe"
# 接続時の処理
def on_connect(client, data, flags, rc):
client.subscribe(CHANNEL, 1)
# メッセージ受信時の処理
def on_message(client, data, msg):
# メッセージから、data部分を取得
data = json.loads(msg.payload.decode("utf-8"))["data"]
# 値によってコマンド実行
if data == "play": # 再生する
subprocess.call(["CMD", "/C", WINAMP_PATH, "/play"])
elif data == "pause": # 一時停止
subprocess.call(["CMD", "/C", WINAMP_PATH, "/pause"])
elif data == "next": # 次の曲
subprocess.call(["CMD", "/C", WINAMP_PATH, "/next"])
# MQTTクライアント作成
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(PEM_PATH)
client.username_pw_set(TOKEN)
# 接続
client.connect(HOST, PORT, KEEP_ALIVE)
client.loop_forever()
このpythonファイルと同ディレクトリに、[2.beebotteサーバのpemファイルを取得](## 2.beebotteサーバのpemファイルを取得) でダウンロードしたpemファイルを配置する。
また、今回はコマンドラインから操作がしたかったため、音楽再生ソフトはwinampを利用。
他ソフトを利用する場合は、お好みにon_message
の中身を変更。
ここをいじくればなんでもできる。
プログラムを実行する
python sub.py
試しに、BeebotteにPubしてみる
↓URLにアクセスしてアクセスキーを取得する
https://beebotte.com/account#credentials
コンソールに移動し、アクセスキーとチャンネル、リソース、データを指定してリクエストを投げる。
コンソール
https://beebotte.com/dev/console
[3.Subクライアントを実装する](## 3.Subクライアントを実装する) で実装した通りの結果が得られるはず。
IFTTTでAlexaとBeebotteを繋ぎこむ
(例のごとく長くなるので、アカウント登録とかは割愛)
「Alexa」で検索して、選択
たぶん、Amazonの認証に飛ばされるので、自分のアカウントで認証してください。
https://api.beebotte.com/v1/data/publish/yourChannel/yourResource?token=token_hogehogefugafuga
Method: POST
Content Type: application/json
Body:
{"data":"play"}
alexaに再生してもらう
alexaに「alexa、"音楽の再生"をトリガー」と発言すればあなたのパソコンから音楽が再生されるはずである。
××をトリガーって言い方ダサいけど、制約だからしょうがない。Alexaのスキルを開発するしかない。
あとは、同様にIFTTTで"音楽の停止"で"pause"を、"次の曲"で"next"を作成すれば、一通りの操作をAlexaでできる。
(IFTTTの無料枠って3つまでなので、それ以上の事をさせたければ同様の代替サービスを利用するか、月額400円ぐらいを払ってね)
結論
IFTTTって便利だね。
今回はBeebotteを利用したけど、AWSやGCPでAPIをこしらえればAlexaからいろいろ出来そう。
結局Alexaが一番活躍してるのは部屋の電気をつけたり消したりすること