Amazon Echo (Alexa)でのジュークボックス・スキルの開発:手持ちのmp3ファイルを音楽再生したい
2019年7月6日

■目次

■はじめに

自分の持っているmp3ファイルを、Amazon Echo (Alexa)で音楽再生したいと考えました。
完成したソースファイルを公開するとともに、開発に関して自分なりに理解した情報をまとめてみました。

ついつい「Alexa」と表現したくなりますが、以下では「Amazon Echo」で統一しています。

■ソースファイル

開発したソースファイルはGitHubで公開させてもらいました。こちらからどうぞ。

■制限事項(ハードル)

今回のジュークボックス・スキルの開発においては、 大きく2つの制限事項(ハードル)があります。

まず、Amazon Echoは、自宅LAN上にあるファイルにアクセスできません。 mp3ファイルなどのコンテンツ・データは、インターネット上に置く必要があり、 かつ、httpsでアクセスできる必要があります。これには正式な証明書も必要です。

また、通常これらのmp3ファイルには著作権の問題がありますので、 開発したスキルは一般公開できません。自分一人で楽しむこととなります。 もちろん、mp3ファイルそのものも一般公開できません。 これについては今回仕組みを設けて対処しています。

AWSの無料枠を利用する方法もありますが、今回は正式な証明書を持った 自前のサーバを利用しました。

■操作マニュアル

以下が今回開発したスキルの操作マニュアルです。

  1. 「私のジュークボックスを開いて」で全曲シャッフル再生する。
  2. 最初に「私のジュークボックスで」が不要な発話(デフォルトの発話)
  3. 最初に「私のジュークボックスで」が必要な発話(開発した発話)
    (「再生して」「かけて」「流して」など、似たような言い回しも可能。)
  4. 次の3種類で大きなカテゴリを指定できる。
    「全部」「ポップス」「洋楽」
    これ以外は個別のカテゴリ指定になる。
    「B'z」「EXILE」など
  5. 「次へ」以外で曲を操作した場合は、シャッフルがオフになる。
    (カテゴリを変えただけの場合は、シャッフルオン/オフを維持する。)

■動作概要

以下が、Amazon Echoに関するサーバと動作の概要です。
fig1.png

サーバは3種類登場します。

アマゾン・サーバ:
利用者がAmazon Echoに対して発話した音声を解析します。 このサーバは、いわゆるAmazonの一部です。

スキル・サーバ:
解析結果を元に任意の処理を実行します。 このサーバは、AWS Lambdaが推奨のようですが、自前のサーバでも可能です。 自前のサーバはhttpsでアクセスできる必要がありますが、 スキル開発中(すなわち、一般公開しない)の場合は、独自の証明書を使用可能です。

データ・サーバ:
Amazon Echoで使用する(再生する)ファイルを置きます。 このサーバは、Amazon S3や自前のサーバなどです。 自前のサーバは正式な証明書を使用してhttpsでアクセスできる必要があります。

動作の概要は次の通りです。

  1. Amazon Echoは、利用者が発話した音声をアマゾン・サーバへ送信します。
  2. アマゾン・サーバは、解析結果(要求)をJSON形式でスキル・サーバへ送信(POST)します。
  3. スキル・サーバは、解析結果(要求)を元に処理をおこない、 Amazon Echoにおこなわせたい動作(応答)をJSON形式でアマゾン・サーバへ返信します。
  4. アマゾン・サーバは、結果をAmazon Echoへ返信します。
  5. Amazon Echoは、アマゾン・サーバからの結果(=スキル・サーバからの応答)を 実行します。 今回のジュークボックス・スキルでは、スキル・サーバからの応答で指定されている mp3ファイルを取得して再生します。
  6. データ・サーバは、Amazon Echoの要求に対して、mp3ファイルを提供します。

■トレーニング

開発の最初の一歩としては、公式のトレーニングシリーズが分かりやすいです。
https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill

「スキル開発 基礎トレーニングシリーズ」を見よう見まねで順番に進めることで、 基礎が分かります。

■アトリビュートとトークン

今回のジュークボックス・スキルでは、次の3つの情報をどこかに保持する必要がありました。

通常であればセッションアトリビュートや永続アトリビュートを利用するところですが、 今回は代わりにトークンを利用しました。
mp3ファイルの再生には、現在の曲を一意に表す任意の文字列(トークン)を指定する必要があります。
ここに上記3つの情報を埋め込むことで、結果的にアトリビュートを利用せずに済んでいます。
具体的には、
として、例として「S-10-JPOP」といった文字列(トークン)にしました。 この場合、シャッフル再生、11曲目、'JPOP'ディレクトリ、を表しています。

■Node.js版ジュークボックス・スキル

ファイル:myjuke.json および myjuke.js

上記のトレーニングに登場するソースプログラムを修正することで作成しました。 スキル・サーバとしてはAWS Lambda上で動作します。

jsonファイルを見てもらうと、やりたいことが分かると思います。
jsファイルのほうは、function url()の部分だけ必ず修正が必要ですが、 その他の部分はこのままでも動作します。

■PHP版への変更

mp3ファイルを一般公開すると著作権の問題があります。 そのため、一般公開とならないような仕組みを設けなければなりません。

以降では、まず、自前のデータ・サーバ上で、PHPスクリプトを通してのみ mp3ファイルを取得するように準備します。
続いて、スキルもPHPで書き直して、同じくデータ・サーバ上に置くことにします。 すなわち、スキル・サーバ兼データ・サーバとなり、結果的に以下のように変わります。 (AWSを利用しなくなります。)

fig2.png

■PHP版データ・サーバ

ファイル: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のパラメータは以下のようにして、チェックで不正アクセスを無視するようにします。

実際のプログラムでは、最低限、パスワード文字列部分だけは独自のものに修正する必要があります。 (修正しない場合はエラーになるように書いています。)

■PHP版ジュークボックス・スキル

ファイル:myjuke.php

Node.js版と比較して見ると、同じようになっているのが見てもらえると思います。

実際のプログラムでは、最低限、以下を修正する必要があります。

■開発の仕方

Alexa Developer Consoleを使って今回のプログラムを手っ取り早く使う手順を簡単に記載します。
(スキル・サーバへの.phpファイルの配置等については割愛します。)

まずは Alexa Developer Console を開きます。

[スキルの作成]を押します。
Image01.png

任意のスキル名を入力し、「カスタム」と「ユーザー定義のプロビジョニング」を選択して、[スキルを作成]を押します。
Image02-03.png

画面が初期表示されます。
Image04.png

左側の「インターフェース」を選択します。
「Audio Player」を選択して、[インターフェースを保存]を押します。
Image06.png

左側の「エンドポイント」を選択します。
「HTTPS」を選択し、スキルのプログラムのURLと証明書の情報を入力して、「エンドポイントを保存」を押します。
Image07.png

左側の「JSONエディター」を選択します。
「.jsonファイルをドラッグ&ドロップ」の部分に.jsonファイルをドラッグ&ドロップします。
Image08.png

「モデルを保存」を押してから、「モデルをビルド」を押します。
しばらくするとビルド完了メッセージが表示されます。
Image09.png

「テスト」を選択します。
「スキルテストが有効になっているステージ」を「開発中」にします。
Image10.png

補足:スキルIDを確認するには、スキル一覧にある「スキルIDの表示」を選択します。
Image11.png

この後、Amazon Echoに対して「アレクサ、私のジュークボックスを開いて。」と発話すると、 エンドポイントで指定したスキルのプログラムのURLにアクセスが発生します。

■最後に

手持ちの音楽を自分の好きなようにコントロールできるので便利になりました。


トップページへ