はじめに
PlexMediaServer は音楽などをストリーミング再生できる無料のサーバーソフトウェアです。
これをラズパイなどに構築することで自身が所有する音楽などをストリーミング再生できるようになります。
今回はこれを Alexa から再生できるようにするまでの手順を記します。
また、Plex 公式から Alexa スキルが公開されていますが、残念ながら日本からは利用することができません。
そこでaskplexというプロジェクトがあったので利用させてもらうことにしました。
しかし、Plex との接続処理が重たかったり日本語環境で利用する上での不具合等があったため、このプロジェクトをフォークしてaskplex-Liteというプロジェクトを作りました。
これを利用して Alexa スキルを作成します。
事前準備
- PlexMediaServer を構築したラズパイなどにリモートアクセスができるようにしてください(ここでは手順等は省略します)
- Amazon Developer へログインできるようにしてください(Alexa で使用した Amazon のアカウントを使用してください)
1. スキルを作成する
alexa developer consoleにアクセスして「スキルの作成」を選択してください。

スキル名(なんでもOK)とロケール(日本語)を選択して次に進みます。
- エクスペリエンスタイプ -> 音楽&オーディオ
- モデル -> カスタム
- ホスティングサービス -> Alexa-hosted (Python)
- ホスト地域 -> 米国東部(バージニア北部)
を選択して次に進みます。
「スキルをインポート」を選択します。
askplex-LiteのURL https://github.com/Kuro4/askplex-Lite を入力してインポートします。
2. スキルを設定する
インポートが完了したらスキル一覧画面で作成したスキルを選択します。
ビルド > Invocations > Skill Invocation Name
を選択し、Skill Invocation Name のテキストボックスへスキルの呼び出し名を入力します。
他のスキル名と競合せず発音しやすい名前がよいです。
入力したら Build skill を押してビルドします。
コードエディタ タブを開き、
Skill Code > lambda > askplex > config.py
を開きます。
ここに各設定値を入力してデプロイします。
設定値について
SKILL_LOG_LEVEL
収集するログレベルを設定します。
動作確認する際にはDEBUGにするとよいです。
SKILL_INVOCATION_NAME
スキルの呼び出し名を設定します。
ワンショット発話をした際に、スロットにスキル名が混入することがあります。
これを設定することでスロットからスキル名を除外します。
※アーティスト名や楽曲名などにスキル名が含まれている場合も除外されてしまうので注意してください。
PMS_SERVER_URL
ドメインを取得していてリバースプロキシを設置しURLが変わらない場合、https で接続できる PlexMediaServer の URL を設定します。
詳しくはaskplexのインストール方法を確認してください。
PMS_USE_SERVER_URL
PMS_SERVER_URL を使用する場合に True を設定してください。
PMS_SERVER_URL を使用しない場合は app.plex.tv を経由してリモートアクセス用の URL を取得します。
PMS_SERVER_TOKEN
外部からアクセスするためのトークンを設定します。
トークンの確認方法はここを参照してください。
ローカルIP(192.168.x.x)ではなく、app.plex.tv を介して取得したトークンを使用してください。
PMS_SERVER_NAME
PlexMediaServer の名前を設定します。
PMS_DEFAULT_SECTION_NAME
PlexMediaServer のセクション名(ライブラリーの名前)を設定します。
PMS_DEFAULT_MAX_RESULTS
ランダム再生時などで取得する楽曲の最大数を設定します。
3. スキルを使用できるようにする
デプロイが終わったらテストタブを選択し、「スキルテストが有効になっているステージ:」の箇所を「非公開」から「開発中」に変更します。
これで Alexa スキルを使用する準備ができました。
4. 使用例
- (スキル名)を開いて -> 音楽を再生して
- (スキル名)で(アーティスト名)を再生して
- (スキル名)で(アーティスト名)の(楽曲名)を再生して
- (スキル名)でプレイリスト(プレイリスト名)を再生して
停止や曲のスキップ、シャッフルなども可能です。
検索がうまくいかない場合
Alexa への音声入力では、英字のアーティスト名などの認識がうまくいかない場合や、略称で認識してほしい場合などがあります。
その時は PlexMediaServer のライブラリからアーティストやアルバムの編集画面を開き、「アーティストを並び替え」の欄に対応させたい表記(ひらがな、かたかな、略称など)を書いておくと検索で引っかかるようになります。
※楽曲名は不可
実際に Alexa に音声入力をして履歴を確認し、認識されている文字を対応させるとよいです。
また、漢数字は内部で数字に変換してから検索しているので対応不要です。
おまけ askplexからの変更点
ここからは接続処理をどう軽量化したかを記します。
まず、元のコードでは PlexMediaServer との接続が必要になるたびにサーバへの接続処理を呼び出していたので、検索に必要となるMusicSectionをクラス変数として持ち、Noneの場合にのみ接続処理を行うようにしました。
また、その接続処理も PlexMediaServer の URL を直接指定する方式のみだったので、前述の app.plex.tv を経由して接続できるようにしました。
さらに、ストリーミング再生用のURLの取得などの PlexMediaServer との通信が発生する処理が Alexa で再生する楽曲のリストへの追加時に行われていたため、100件程度の楽曲を取得した際にも Alexa の応答制限時間をオーバーしてエラーが発生していました。
これを実際の楽曲再生直前などの必要となるタイミングで取得するように変更することで不要な通信を抑えました。
あとは、アーティスト名で楽曲を取得する際に、人気のトラックを取得するようなコードになっていましが、この人気のトラックが取得できない場合にはそのアーティストのランダムな楽曲を取得する処理を追加しました。
おわりに
これで Alexa から PlexMeidaServer をストリーミング再生することができました。
他にも「(アーティスト名)をランダム再生」させるとか機能の追加ができそうでしたが、とりあえずこれで完成とします。
最後に元となるプロジェクトを作成したAndrés Ponteさんに感謝申し上げます。
ありがとうございました。







