Amazon Echo (Alexa)でのジュークボックス・スキルの開発:手持ちのmp3ファイルを音楽再生したい
2019年7月6日
自分の持っているmp3ファイルを、Amazon Echo (Alexa)で音楽再生したいと考えました。
完成したソースファイルを公開するとともに、開発に関して自分なりに理解した情報をまとめてみました。
ついつい「Alexa」と表現したくなりますが、以下では「Amazon Echo」で統一しています。
開発したソースファイルはGitHubで公開させてもらいました。こちらからどうぞ。
今回のジュークボックス・スキルの開発においては、
大きく2つの制限事項(ハードル)があります。
まず、Amazon Echoは、自宅LAN上にあるファイルにアクセスできません。
mp3ファイルなどのコンテンツ・データは、インターネット上に置く必要があり、
かつ、httpsでアクセスできる必要があります。これには正式な証明書も必要です。
また、通常これらのmp3ファイルには著作権の問題がありますので、
開発したスキルは一般公開できません。自分一人で楽しむこととなります。
もちろん、mp3ファイルそのものも一般公開できません。
これについては今回仕組みを設けて対処しています。
AWSの無料枠を利用する方法もありますが、今回は正式な証明書を持った
自前のサーバを利用しました。
以下が今回開発したスキルの操作マニュアルです。
以下が、Amazon Echoに関するサーバと動作の概要です。
サーバは3種類登場します。
アマゾン・サーバ:
利用者がAmazon Echoに対して発話した音声を解析します。
このサーバは、いわゆるAmazonの一部です。
スキル・サーバ:
解析結果を元に任意の処理を実行します。
このサーバは、AWS Lambdaが推奨のようですが、自前のサーバでも可能です。
自前のサーバはhttpsでアクセスできる必要がありますが、
スキル開発中(すなわち、一般公開しない)の場合は、独自の証明書を使用可能です。
データ・サーバ:
Amazon Echoで使用する(再生する)ファイルを置きます。
このサーバは、Amazon S3や自前のサーバなどです。
自前のサーバは正式な証明書を使用してhttpsでアクセスできる必要があります。
動作の概要は次の通りです。
開発の最初の一歩としては、公式のトレーニングシリーズが分かりやすいです。
https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/training/build-a-skill
「スキル開発 基礎トレーニングシリーズ」を見よう見まねで順番に進めることで、
基礎が分かります。
今回のジュークボックス・スキルでは、次の3つの情報をどこかに保持する必要がありました。
ファイル:myjuke.json および myjuke.js
上記のトレーニングに登場するソースプログラムを修正することで作成しました。
スキル・サーバとしてはAWS Lambda上で動作します。
jsonファイルを見てもらうと、やりたいことが分かると思います。
jsファイルのほうは、function url()の部分だけ必ず修正が必要ですが、
その他の部分はこのままでも動作します。
mp3ファイルを一般公開すると著作権の問題があります。
そのため、一般公開とならないような仕組みを設けなければなりません。
以降では、まず、自前のデータ・サーバ上で、PHPスクリプトを通してのみ
mp3ファイルを取得するように準備します。
続いて、スキルもPHPで書き直して、同じくデータ・サーバ上に置くことにします。
すなわち、スキル・サーバ兼データ・サーバとなり、結果的に以下のように変わります。
(AWSを利用しなくなります。)
ファイル:mp3.php
ディレクトリ/ファイル構成を以下のように想定します。
公開ディレクトリ | mp3.php (データ・サーバのプログラム) | myjuke.php (ジュークボックス・スキルのプログラム) +---data | .htaccess (これ以下は外部から直接参照できなくする) +---JPOP | +---B'z_Pleasure (これらの下にmp3ファイルを置く) | +---B'z_Treasure | +---EXILE1 | +---EXILE2 | +---X +---WMUSIC +---BEATLES
ディレクトリ名は前方一致で検索することとし(例:「B'z*」や「EXILE*」)、複数可能とします。
また、各mp3のファイル名は、今回は直接登場しないので、任意で構いません。
重要なのが、外部からmp3ファイルを直接参照できないようにすることです。
.htaccessファイルに次の1行を書いておきます。
deny from all
mp3ファイルを取得するには、次のようなURLを生成して指定することにします。
https://my-data-server.jp/mp3.php?cat=JPOP&num=10&state=1561852558&sum=f62b1a72d28be4b5b0265f909101df1234567890
URLのパラメータは以下のようにして、チェックで不正アクセスを無視するようにします。
実際のプログラムでは、最低限、パスワード文字列部分だけは独自のものに修正する必要があります。 (修正しない場合はエラーになるように書いています。)
ファイル:myjuke.php
Node.js版と比較して見ると、同じようになっているのが見てもらえると思います。
実際のプログラムでは、最低限、以下を修正する必要があります。
Alexa Developer Consoleを使って今回のプログラムを手っ取り早く使う手順を簡単に記載します。
(スキル・サーバへの.phpファイルの配置等については割愛します。)
まずは Alexa Developer Console を開きます。
任意のスキル名を入力し、「カスタム」と「ユーザー定義のプロビジョニング」を選択して、[スキルを作成]を押します。
左側の「インターフェース」を選択します。
「Audio Player」を選択して、[インターフェースを保存]を押します。
左側の「エンドポイント」を選択します。
「HTTPS」を選択し、スキルのプログラムのURLと証明書の情報を入力して、「エンドポイントを保存」を押します。
左側の「JSONエディター」を選択します。
「.jsonファイルをドラッグ&ドロップ」の部分に.jsonファイルをドラッグ&ドロップします。
「モデルを保存」を押してから、「モデルをビルド」を押します。
しばらくするとビルド完了メッセージが表示されます。
「テスト」を選択します。
「スキルテストが有効になっているステージ」を「開発中」にします。
補足:スキルIDを確認するには、スキル一覧にある「スキルIDの表示」を選択します。
この後、Amazon Echoに対して「アレクサ、私のジュークボックスを開いて。」と発話すると、
エンドポイントで指定したスキルのプログラムのURLにアクセスが発生します。
手持ちの音楽を自分の好きなようにコントロールできるので便利になりました。