[Alexaスキル] AudioPlayerでハローワールド

2018.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

Alexaでは、AudioPlayerを利用することで、音楽再生スキルを作成できます。 今回はAudioPlayerの最低限の機能を実装することで、AudioPlayerの概要を掴みましょう。

AudioPlayerの有効化

はじめに、AudioPlayer機能を利用するには、開発者コンソールでスキルのAudioPlayer機能を有効にします。

対話モデル

音楽再生スキルの対話モデルは、通常のカスタムスキルと変わりません。 ただし、必須インテントのAMAZON.PauseIntentAMAZON.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.PauseIntentAMAZON.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を有効にするとインテントとは別にイベントが発生します。 イベントを処理するハンドラも合わせて定義してください。

以上で音楽再生スキルのベースが出来ました。 実用レベルのスキルにするには、複数の音源から適切なファイルを選択したり、リピート再生に対応したり、要件に合わせた機能を追加する必要があります。