Alexa + IFTTT + Beebotte で "自分のパソコンで" 音楽を流した

# 目的
Alexaから、"パソコンに入っている音楽"を、"パソコンにつながっているスピーカー"で流したい。

# きっかけ
先日、Amazon Prime Dayが開催された。
普段Web会議の時に同僚のAlexaが会議のリマインドを教えてくれているのを聞いて、
密やかに羨ましがっていた私は一も二もなくAmazon echo show5を購入した。

到着するのを心待ちにしつつ、どんな事が実現できるのかをネットサーフィン。
よく聞くのは「音楽を流して」というやつだなぁ、などと思っていたのだが……。

# 現実
Alexaに「音楽を流して」と言っても、Amazon Musicの"よく知らない人"の、"よく知らない曲"を、
echoのそこまで良いわけでもないスピーカーが流すということしかできない。

それなら自分のパソコンの中に入っている音楽を、パソコンにつながっている高性能なスピーカーから流した方が断然良い。

ただ……まぁ……せっかくecho買ったんだし、なんとかしてみようと思う。

# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/64b0267d-05aa-b39e-211a-67cf273cfad2.png)
Alexa -> IFTTT -> Beebotte -> Windows10(音楽ファイルが入っているパソコン)

## IFTTT とは
サービスとサービスをつなげるサービス。
〇〇をしたら、□□をする、というように、いずれかのサービスをトリガーに別のサービスを発火
Twitterに投稿したら、同じことをインスタに投稿する、というようなことが実現できる。

https://ifttt.com

## Beebotte とは
MQTTブローカ + REST API + Web Socketサービス。
IoT向けのサービスで、メッセージのPub/Subが出来る。

https://beebotte.com

# 実装
## 1.Beebotte でチャンネルを作る
(長くなるので、アカウント登録とかは割愛)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/0c0562ba-1ffa-b62c-d2bc-80fc3eebe04c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/b5d01756-854c-0008-50a7-789695c79c8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/7efadfcd-f911-8c03-d9ee-1107e9d1501c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/487ac2a6-570e-84d6-e65e-8acd1ae17536.png)

## 2.beebotteサーバのpemファイルを取得
↓にアクセスするとダウンロードできる。
https://beebotte.com/certs/mqtt.beebotte.com.pem

## 3.Subクライアントを実装する
言語はなんでも良いので、MQTTライブラリが便利そうなものを選ぶ。
今回はPythonを利用。

ライブラリをインストールする。

```
pip install paho-mqtt
```

コードを書く

```python:sub.py
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を利用。

https://www.winamp.com

他ソフトを利用する場合は、お好みに`on_message`の中身を変更。
ここをいじくればなんでもできる。

プログラムを実行する

```
python sub.py
```

## 試しに、BeebotteにPubしてみる
↓URLにアクセスしてアクセスキーを取得する
https://beebotte.com/account#credentials
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/10e50a89-9f08-d0ee-86c7-6ff80b98a457.png)

コンソールに移動し、アクセスキーとチャンネル、リソース、データを指定してリクエストを投げる。
コンソール
https://beebotte.com/dev/console
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/5bb31dd2-49a3-df6f-6c87-cf40986a6328.png)

[3.Subクライアントを実装する](## 3.Subクライアントを実装する) で実装した通りの結果が得られるはず。

## IFTTTでAlexaとBeebotteを繋ぎこむ
(例のごとく長くなるので、アカウント登録とかは割愛)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/d3bcedc3-0dc0-d44b-43db-721bead645b4.png)
右上部「Create」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/c5961ae1-0baf-38a1-8f07-04da5e9d019e.png)
「If This」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/7b8da27a-801c-035e-d9c3-453b21a7d28f.png)
「Alexa」で検索して、選択
たぶん、Amazonの認証に飛ばされるので、自分のアカウントで認証してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/43e7cf90-2140-52b3-d742-bf276ce15dfa.png)
「Say a specific phrase」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/3127d6bc-0fe5-28dc-48c8-28b4e84e777d.png)
キーワードとなる単語を入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/d3d22c47-2c4f-fa1f-d75e-01d97a0bcf48.png)
「Then That」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/245b5ba1-9fc5-1640-1e77-cd2f241e909c.png)
「Webhooks」と検索して、選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/e9f5a6f0-9d74-da85-0605-5822c19aa694.png)
「Make a web request」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/34798829-078a-1362-e864-a6387d3a37f3.png)
URL:

```
https://api.beebotte.com/v1/data/publish/yourChannel/yourResource?token=token_hogehogefugafuga
```

Method: POST
Content Type: application/json
Body:

```
{"data":"play"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/85d804b0-e369-e41b-509d-1c13c5add0c4.png)
「Continue」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686444/d5c59309-d12d-459f-1c00-e177bc540a22.png)
「Finish」をクリックして終了！

# alexaに再生してもらう
alexaに「alexa、"音楽の再生"をトリガー」と発言すればあなたのパソコンから音楽が再生されるはずである。
~~××をトリガーって言い方ダサいけど、制約だからしょうがない。Alexaのスキルを開発するしかない。~~

あとは、同様にIFTTTで"音楽の停止"で"pause"を、"次の曲"で"next"を作成すれば、一通りの操作をAlexaでできる。
(IFTTTの無料枠って3つまでなので、それ以上の事をさせたければ同様の代替サービスを利用するか、月額400円ぐらいを払ってね)

# 結論
IFTTTって便利だね。
今回はBeebotteを利用したけど、AWSやGCPでAPIをこしらえればAlexaからいろいろ出来そう。

~~結局Alexaが一番活躍してるのは部屋の電気をつけたり消したりすること~~