Самый простой пример для потоковой передачи аудио с Alexa
Я пытаюсь получить новый потоковый аудио API. Является ли следующий ответ действительным? Когда я тестирую его на своем устройстве, у меня возникает проблема с ошибкой "умение".
Вот код для моей AWS-лямбда-функции:
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
}
}
Ответы
Ответ 1
Для меня работал следующий код:
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-адрес - https, а не http.
Не откладывайте, если он не работает в симуляторе навыков. Это еще не обновлено, чтобы работать с потоковым аудио. Вы даже не увидите там своих директив. Но он должен работать при использовании с вашим устройством.
Ответ 2
Мы создали действительно простой проект на Github, который показывает самый простой способ использования AudioPlayer:
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);
};
Ответ 3
Программа должна возвращать некоторый ответ на "LaunchRequest" и "SessionEndedRequest", иначе вы получите "Была проблема с запрошенным ответом навыков".
Вам нужно добавить намерение "PlayMusic" и изменить URL-адрес файла.
P.S. Я не уверен, что version
должен быть в build_audio_response
функции, я получил json из здесь
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()