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

person maxymoo    schedule 26.08.2016    source источник
comment
Эй, я посмотрел на API. У них есть образец сообщения, который кажется очень похожим на то, что вы хотите, но есть дополнительные поля для идентификации header и payload. API находится здесь, а сообщение в разделе «Образец сообщения». Если вы используете это форматирование, вы все еще получаете ошибку?   -  person Liam Kelly    schedule 29.08.2016
comment
только что пробовал, не помогло   -  person maxymoo    schedule 30.08.2016
comment
Однако это работает с HTTPS, но как его остановить? Команды Cancel и Stop не работают после запуска потока.   -  person Fastmover    schedule 13.06.2017
comment
Stop работает для меня (я думаю, что это просто выход из навыка), если вы хотите обрабатывать другие намерения, вам придется написать для них собственные обработчики.   -  person maxymoo    schedule 13.06.2017


Ответы (3)


У меня работал следующий код:

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.

Не отчаивайтесь, если это не работает в симуляторе навыков. Это еще не было обновлено для работы с потоковым аудио. Вы даже не увидите там свои директивы. Но он должен работать при использовании с вашим устройством.

person Joseph Jaquinta    schedule 02.09.2016
comment
Это здорово! Большое спасибо! Как ты догадался попробовать это? - person maxymoo; 04.09.2016
comment
Ну, сначала я подумал, что это из-за отсутствия нормального заголовка, вывода текста и тому подобного. Итак, я прошел через множество циклов, прежде чем в конце концов получил сообщение на аппаратном устройстве, в котором говорилось, что ему нужно использовать https. Как только это сработало, я шаг за шагом удалял все остальное, что добавлял, пока не остался с этим. Похоже, я только что добавил одного персонажа. Но мне потребовалось много времени, чтобы понять, какой персонаж. :-) Спасибо за очки! - person Joseph Jaquinta; 04.09.2016
comment
где вы увидели сообщение об аппаратном устройстве? это очень помогло бы мне, если бы я мог видеть где-то зарегистрированные ошибки! - person maxymoo; 18.09.2016
comment
Alexa крайне плохо сообщает об ошибках. Кажется, я ошибся, когда сказал на аппаратном устройстве. То, что я должен был сказать, отображается в сопутствующем приложении. Иногда он кладет туда что-то полезное. Но, поскольку это потребительское устройство, сообщения чаще всего расплывчаты и не связаны с техникой. - person Joseph Jaquinta; 18.09.2016
comment
о, круто, я буду следить за этим, да, это делает разработку настоящей проблемой, а! - person maxymoo; 19.09.2016
comment
@JosephJaquinta, я пробовал этот фрагмент кода и тестировал его на симуляторе, а также на echosim.io. Это не сработало. на обоих. Как вы упомянули, на симуляторе это не сработает, но с эхоизмом то же самое? - person Fayza Nawaz; 19.10.2016
comment
Он также не будет работать на эхоизме, следовательно, это симулятор. - person Fastmover; 13.06.2017
comment
Кто-нибудь знает, действителен ли этот код для аудиопотока .m3u8 HLS? - person neowinston; 27.07.2017

Мы создали очень простой проект на 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);
};
person John Kelvie    schedule 06.05.2017

Программа должна возвращать некоторый ответ на «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()
person armicron    schedule 05.03.2017