Самый простой пример для потоковой передачи аудио с 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()