2016-08-26 7 views
11

Я пытаюсь получить новый потоковый аудио API. Является ли следующий ответ действительным? Когда я тестирую его на своем устройстве, у меня возникает проблема с ошибкой «умение».Простейший пример для потокового аудио с Alexa

Вот код для моей функции 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 
     } 
    } 
+0

Эй, я посмотрел на API. У них есть примерное сообщение, которое * появляется * очень похоже на то, что вы хотите, но есть больше полей для определения 'header' и' payload'. API [здесь] (https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/reference/audioplayer), и сообщение находится в разделе «пример сообщения». Если вы используете эту форму, вы все еще получаете ошибку? –

+0

просто попробовал, что, похоже, не помог – maxymoo

+0

Это работает с HTTPS, однако, как вы его остановили? Команды «Отмена» и «Стоп» не работают после запуска потока. – Fastmover

ответ

12

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

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.

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

+0

Это большое спасибо! Как вы узнали, чтобы попробовать это? – maxymoo

+1

Ну, сначала я подумал, что это потому, что ему не хватает обычного заголовка, выходного текста и тому подобного. Поэтому я прошел много циклов, прежде чем в конце концов получил сообщение на аппаратном устройстве, в котором говорилось о том, что ему нужно быть https. Как только это сработало, я шаг за шагом вытащил все остальные вещи, которые я добавил, пока я не остался с этим. Так что, похоже, я просто добавил одного персонажа. Но мне понадобилось много времени, чтобы разобраться, какой характер. :-) Спасибо за очки! –

+0

Где вы видели сообщение на аппаратном устройстве? это очень помогло бы мне, если бы я мог видеть ошибки, зарегистрированные где-то! – maxymoo

0

Программа должна возвращать некоторый отклик на «LaunchRequest» и «SessionEndedRequest», иначе вы получите «Была проблема с запрошенным ответом навыков».

Вам необходимо добавить намерение «PlayMusic» и изменить URL-адрес файла.

P.S. Я не уверен, 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() 
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); 
}; 
Смежные вопросы