(Alexa)で音楽再生したいと考えました。完成したソースファイルを公開するとともに、開発に関して自分なりに理解した情報をまとめてみました。Echo」で統一しています。■ソースファイル開発したソースファイルはGitHubで公開させてもらいました。大きく2つの制限事項(ハードル)があります。Echoは、自宅LAN上にあるファイルにアクセスできません。httpsでアクセスできる必要があります。これには正式な証明書も必要です。開発したスキルは一般公開できません。自分一人で楽しむこととなります。mp3ファイルそのものも一般公開できません。これについては今回仕組みを設けて対処しています。自前のサーバを利用しました。■操作マニュアル以下が今回開発したスキルの操作マニュアルです。「私のジュークボックスを開いて」で全曲シャッフル再生する。最初に「私のジュークボックスで」が不要な発話(デフォルトの発話)中断/再開に関するものシャッフルオン/オフに関するもの次へ/前へに関するもの最初に「私のジュークボックスで」が必要な発話(開発した発話)(「再生して」「かけて」「流して」など、似たような言い回しも可能。次の3種類で大きなカテゴリを指定できる。「全部」「ポップス」「洋楽」これ以外は個別のカテゴリ指定になる。「B'z」「EXILE」など「次へ」以外で曲を操作した場合は、シャッフルがオフになる。(カテゴリを変えただけの場合は、シャッフルオン/オフを維持する。Echoに関するサーバと動作の概要です。サーバは3種類登場します。Echoに対して発話した音声を解析します。このサーバは、いわゆるAmazonの一部です。スキル・サーバ:解析結果を元に任意の処理を実行します。Lambdaが推奨のようですが、自前のサーバでも可能です。スキル開発中(すなわち、一般公開しない)の場合は、独自の証明書を使用可能です。Echoで使用する(再生する)ファイルを置きます。S3や自前のサーバなどです。自前のサーバは正式な証明書を使用してhttpsでアクセスできる必要があります。動作の概要は次の通りです。Echoは、利用者が発話した音声をアマゾン・サーバへ送信します。アマゾン・サーバは、解析結果(要求)をJSON形式でスキル・サーバへ送信(POST)します。Echoにおこなわせたい動作(応答)をJSON形式でアマゾン・サーバへ返信します。Echoへ返信します。mp3ファイルを取得して再生します。Echoの要求に対して、mp3ファイルを提供します。■トレーニング開発の最初の一歩としては、公式のトレーニングシリーズが分かりやすいです。■アトリビュートとトークン今回のジュークボックス・スキルでは、次の3つの情報をどこかに保持する必要がありました。連続再生かシャッフル再生か。何曲目を再生しているか。何のカテゴリを再生しているか。今回は代わりにトークンを利用しました。mp3ファイルの再生には、現在の曲を一意に表す任意の文字列(トークン)を指定する必要があります。ここに上記3つの情報を埋め込むことで、結果的にアトリビュートを利用せずに済んでいます。連続再生は'N'で表し、シャッフル再生は'S'で表す。何曲目かは、0から数えた数字で表す。カテゴリは、自分で用意したディレクトリ名で表す。して、例として「S-10-JPOP」といった文字列(トークン)にしました。この場合、シャッフル再生、11曲目、'JPOP'ディレクトリ、を表しています。myjuke.js上記のトレーニングに登場するソースプログラムを修正することで作成しました。Lambda上で動作します。jsonファイルを見てもらうと、やりたいことが分かると思います。その他の部分はこのままでも動作します。■PHP版への変更mp3ファイルを一般公開すると著作権の問題があります。そのため、一般公開とならないような仕組みを設けなければなりません。mp3ファイルを取得するように準備します。続いて、スキルもPHPで書き直して、同じくデータ・サーバ上に置くことにします。スキル・サーバ兼データ・サーバとなり、結果的に以下のように変わります。(AWSを利用しなくなります。)■PHP版データ・サーバファイル:mp3.phpディレクトリ/ファイル構成を以下のように想定します。+---BEATLESディレクトリ名は前方一致で検索することとし(例:「B'z*」や「EXILE*」)、複数可能とします。各mp3のファイル名は、今回は直接登場しないので、任意で構いません。重要なのが、外部からmp3ファイルを直接参照できないようにすることです。.htaccessファイルに次の1行を書いておきます。allmp3ファイルを取得するには、次のようなURLを生成して指定することにします。https://my-data-server.jp/mp3.php?cat=JPOP&num=10&state=1561852558&sum=f62b1a72d28be4b5b0265f909101df1234567890URLのパラメータは以下のようにして、チェックで不正アクセスを無視するようにします。cat=は、カテゴリを指定します。大分類の「JPOP」や小分類の「B'z」などです。num=は、カテゴリ内の曲番を指定します。(0〜)実際のファイル数より大きい数字を指定した場合は、ファイル数で割った余りとします。→例えばカテゴリ内に24個のファイルがあって、'59'を指定した場合は'11'として扱います。state=は、現在時刻(UNIX時間)を指定します。今回の場合、生成したURLの有効期間を15分(900秒)として、有効期間外の場合は無視します。→結果、もし正しいURLが漏洩しても、15分後には使用できなくします。Echoからのアクセスは、1つのURLにつき1回きりではなく数回発生しています。確実のためには、有効期間を最長の1曲よりも長めにしておく必要があります。sum=は、上記パラメータすべてのハッシュ(チェックサム)を指定します。自分だけのパスワード文字列を決めておきます。自分のスキルのプログラムでしか正しいURLを生成できないようにします。データ・サーバでは、ハッシュが一致しない場合は不正アクセスと見なして無視します。実際のプログラムでは、最低限、パスワード文字列部分だけは独自のものに修正する必要があります。(修正しない場合はエラーになるように書いています。)■PHP版ジュークボックス・スキルファイル:myjuke.phpNode.js版と比較して見ると、同じようになっているのが見てもらえると思います。実際のプログラムでは、最低限、以下を修正する必要があります。Consoleを使って今回のプログラムを手っ取り早く使う手順を簡単に記載します。(スキル・サーバへの.phpファイルの配置等については割愛します。[スキルの作成]を押します。任意のスキル名を入力し、「カスタム」と「ユーザー定義のプロビジョニング」を選択して、[スキルを作成]を押します。画面が初期表示されます。左側の「インターフェース」を選択します。Player」を選択して、[インターフェースを保存]を押します。左側の「エンドポイント」を選択します。「HTTPS」を選択し、スキルのプログラムのURLと証明書の情報を入力して、「エンドポイントを保存」を押します。左側の「JSONエディター」を選択します。「.jsonファイルをドラッグ&ドロップ」の部分に.jsonファイルをドラッグ&ドロップします。「モデルを保存」を押してから、「モデルをビルド」を押します。するとビルド完了メッセージが表示されます。「テスト」を選択します。「スキルテストが有効になっているステージ」を「開発中」にします。補足:スキルIDを確認するには、スキル一覧にある「スキルIDの表示」を選択します。Echoに対して「アレクサ、私のジュークボックスを開いて。エンドポイントで指定したスキルのプログラムのURLにアクセスが発生します。■最後に手持ちの音楽を自分の好きなようにコントロールできるので便利になりました。