新しいストリーミングオーディオAPIを実行しようとしています。次の応答は有効ですか?デバイスでテストすると、「スキルに問題がありました」というエラーが表示されます。
これが私のAWS-lambda関数のコードです。
def lambda_handler(event, context):
return {
"response": {
"directives": [
{
"type": "AudioPlayer.Play",
"playBehavior": "REPLACE_ALL",
"audioItem": {
"stream": {
"token": "12345",
"url": "http://emit-media-production.s3.amazonaws.com/pbs/the-afterglow/2016/08/24/1700/201608241700_the-afterglow_64.m4a",
"offsetInMilliseconds": 0
}
}
}
],
"shouldEndSession": True
}
}
次のコードは私のために働きました:
def lambda_handler(event, context):
return {
"response": {
"directives": [
{
"type": "AudioPlayer.Play",
"playBehavior": "REPLACE_ALL",
"audioItem": {
"stream": {
"token": "12345",
"url": "https://emit-media-production.s3.amazonaws.com/pbs/the-afterglow/2016/08/24/1700/201608241700_the-afterglow_64.m4a",
"offsetInMilliseconds": 0
}
}
}
],
"shouldEndSession": True
}
}
]
唯一の違いは、URLがhttpではなくhttpsであることです。
スキルシミュレータで機能しない場合でも、後回しにしないでください。ストリーミングオーディオで動作するようにまだアップグレードされていません。ディレクティブはそこには表示されません。ただし、デバイスで使用すると機能するはずです。
AudioPlayerを使用する最も簡単な方法を示す非常にシンプルなプロジェクトをGithubに作成しました。
https://github.com/bespoken/super-simple-audio-player
ここでは、そのための記事も作成しました。
https://bespoken.tools/blog/2017/02/27/super-simple-audioplayer
このプロジェクトは、トラックの再生方法と、一時停止および再開の方法を示しています。
次に、オーディオファイルの実際の再生を示すコードを示します。
SimplePlayer.prototype.play = function (audioURL, offsetInMilliseconds) {
var response = {
version: "1.0",
response: {
shouldEndSession: true,
directives: [{
type: "AudioPlayer.Play",
playBehavior: "REPLACE_ALL", // Setting to REPLACE_ALL means that this track will start playing immediately
audioItem: {
stream: {
url: audioURL,
token: "0", // Unique token for the track - needed when queueing multiple tracks
expectedPreviousToken: null, // The expected previous token - when using queues, ensures safety
offsetInMilliseconds: offsetInMilliseconds
}
}
}]
}
}
this.context.succeed(response);
};
プログラムは、「LaunchRequest」と「SessionEndedRequest」に対して何らかの応答を返す必要があります。そうしないと、「要求されたスキル応答で問題が発生しました」と表示されます。
インテント「PlayMusic」を追加し、ファイルのURLを変更する必要があります。
追伸どのversion
をbuild_audio_response
関数に含めるかわかりません。jsonを here から取得しました
def build_audio_response(url):
return {
"version": "1.01",
"response": {
"directives": [
{
"type": "AudioPlayer.Play",
"playBehavior": "REPLACE_ALL",
"audioItem": {
"stream": {
"token": "12345",
"url": url,
"offsetInMilliseconds": 0
}
}
}
],
"shouldEndSession": True
}
}
def handle_session_end_request():
return {
"version": "1.0",
"response": {
"shouldEndSession": True
}
}
def play_music(intent, session):
url = "https://s3-eu-west-1.amazonaws.com/bucket/filename.mp3"
return build_audio_response(url, should_end_session=True)
def on_intent(intent_request, session):
""" Called when the user specifies an intent for this skill """
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
if intent_name == "PlayMusic":
return play_music(intent, session)
Elif intent_name == "Amazon.CancelIntent" or intent_name == "Amazon.StopIntent":
return handle_session_end_request()
else:
raise ValueError("Invalid intent")
def lambda_handler(event, context):
if event['request']['type'] == "LaunchRequest":
return {
"version": "1.0",
"response": {
"shouldEndSession": False
}
}
Elif event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])
Elif event['request']['type'] == "SessionEndedRequest":
return handle_session_end_request()