この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
Alexaでは、AudioPlayerを利用することで、音楽再生スキルを作成できます。 今回はAudioPlayerの最低限の機能を実装することで、AudioPlayerの概要を掴みましょう。
AudioPlayerの有効化
はじめに、AudioPlayer機能を利用するには、開発者コンソールでスキルのAudioPlayer機能を有効にします。
対話モデル
音楽再生スキルの対話モデルは、通常のカスタムスキルと変わりません。
ただし、必須インテントのAMAZON.PauseIntent
とAMAZON.ResumeIntent
を含めなければなりません。
AMAZON.PauseIntent
は音楽再生の一時停止、AMAZON.ResumeIntent
は音楽再生の再開を意図するインテントです。
必須インテントに加え、起動インテントとなるAMAZON.StartOverIntent
、およびに音楽再生のトリガーとなるPlayIntent
を追加すると、次のような対話モデルとなります。
{
"interactionModel": {
"languageModel": {
"invocationName": "音楽再生",
"intents": [
{
"name": "AMAZON.StartOverIntent"
},
{
"name": "AMAZON.PauseIntent"
},
{
"name": "AMAZON.ResumeIntent"
},
{
"name": "PlayIntent",
"samples": [
"音楽をかけて",
"音楽を流して",
"音楽を再生して"
]
}
]
}
}
}
なお、組み込みインテントは、サンプル発話は省略できます。
Playディレクティブ
AudioPlayerで音楽を再生することは簡単です。 クライアント(Echo端末)に対し、Playディレクティブを送信します。
雑に言えば、ディレクティブとは、Lambda(クラウド)側からクライアントへのアクションを指定することです。 LambdaからJSONオブジェクトを返すことでPlayディレクティブを送信しますが、SDKを利用していれば、audioPlayerPlayメソッドを実行するだけです。 具体的には、PlayIntentで次のように、audioPlayerPlayメソッドを実行します。
'PlayIntent': function () {
this.response.audioPlayerPlay('REPLACE_ALL', url, url, null, 0);
this.emit(':responseReady');
},
再生時にAlexaに喋らせる場合は speakメソッドも併用してください。
'PlayIntent': function () {
const output = this.t('PLAYING');
this.response.speak(output).audioPlayerPlay('REPLACE_ALL', url, url, null, 0);
this.emit(':responseReady');
},
urlには、再生する音楽ファイルのあるURLを指定します。
PauseIntentとResumeIntentに対応する
続けて、必須インテントのAMAZON.PauseIntent
とAMAZON.ResumeIntent
のハンドラを追加します。
それぞれ、StopディレクティブとPlayディレクティブを送信するため、audioPlayerStopメソッドとaudioPlayerPlayメソッドを実行します。
'AMAZON.PauseIntent': function () {
this.response.speak(text).audioPlayerStop();
this.emit(':responseReady');
},
'AMAZON.ResumeIntent': function () {
this.response.audioPlayerPlay('REPLACE_ALL', url, url, null, 0);
this.emit(':responseReady');
}
PauseIntentは、音楽再生後「Alexa、一時停止」のように話しかけると起動するハンドラとなります。 その後、「Alexa、再開」のように話しかければResumeIntentが呼び出されます。
イベントの処理
AudioPlayerを有効にすると、音楽の再生開始時や終了時などにイベントをクラウド(Lambda)側に送信し、処理を行うことができます。 具体的には、次のイベントが発生します。
- PlaybackStarted
- PlaybackFinished
- PlaybackStopped
- PlaybackNearlyFinished
- PlaybackFailed
特に処理が不要であれば、処理を実装しなくても良いのですが、イベントは発生します。 イベントが発生した時、対応するハンドラがないと、Lambdaにエラーが発生してしまいます。 次のように空の処理を実装しておくと良いでしょう。
他のインテントと同様にハンドラを定義してください。
// 再生開始時
'PlaybackStarted': function () {
this.emit(':responseReady');
},
// 再生終了時
'PlaybackFinished': function () {
this.emit(':responseReady');
},
// 再生停止時
'PlaybackStopped': function () {
this.emit(':responseReady');
},
// 再生終了が近い時
'PlaybackNearlyFinished': function () {
this.emit(':responseReady');
},
// 再生失敗時
'PlaybackFailed': function () {
this.emit(':responseReady');
},
以上が音楽再生スキルとしては最低必要となるハンドラです。
まとめ
音楽再生スキルを作るには、AudioPlayerの機能を有効にします。 音楽再生のインテント、及びに一時停止と再生再開のインテントを追加してください。 それぞれのインテントでは再生する音楽ファイルのURLを指定し、PlayディレクティブやStopディレクティブを送信します。
また、AudioPlayerを有効にするとインテントとは別にイベントが発生します。 イベントを処理するハンドラも合わせて定義してください。
以上で音楽再生スキルのベースが出来ました。 実用レベルのスキルにするには、複数の音源から適切なファイルを選択したり、リピート再生に対応したり、要件に合わせた機能を追加する必要があります。