2016-08-26 4 views
11

Ich versuche, die neue Streaming-Audio-API zu bekommen. Ist die folgende Antwort gültig? Ich erhalte den Fehler "Es gab ein Problem mit der Fertigkeit", wenn ich es auf meinem Gerät teste. HierEinfachstes Beispiel für Audio-Streaming mit Alexa

ist der Code für mein AWS-Lambda-Funktion:

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

Hey, ich an der API sah. Sie haben eine Beispielnachricht, die * erscheint *, um sehr ähnlich zu sein, was Sie wollen, aber es gibt mehr Felder, um 'header' und' Nutzlast' zu identifizieren. Die API ist [hier] (https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/reference/audioplayer) und die Nachricht befindet sich im Abschnitt "Beispielnachricht". Wenn Sie diese Formatierung verwenden, erhalten Sie immer noch den Fehler? –

+0

gerade versucht, dass, schien nicht zu helfen – maxymoo

+0

Das funktioniert mit HTTPS, aber wie bekommen Sie es zu stoppen? Abbrechen und Stop-Befehle funktionieren nicht, sobald der Stream gestartet wird. – Fastmover

Antwort

12

Der folgende Code für mich gearbeitet:

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 
     } 
    } 
] 

Der einzige Unterschied besteht darin, dass die URL https statt http.

Lassen Sie sich nicht abschrecken, wenn es im Skill-Simulator nicht funktioniert. Das wurde noch nicht aktualisiert, um mit Streaming-Audio zu arbeiten. Sie werden Ihre Anweisungen dort nicht einmal sehen. Aber es sollte funktionieren, wenn es mit Ihrem Gerät verwendet wird.

+0

Das ist großartig, vielen Dank! Woher weißt du das zu versuchen? – maxymoo

+1

Nun, zuerst dachte ich, es wäre, weil es den normalen Header, den ausgegebenen Text und solche Sachen gefehlt hätte. Also habe ich viele Zyklen durchlaufen, bis ich schließlich eine Nachricht auf dem Hardwaregerät erhielt, in der etwas darüber gesagt wurde, dass es https sein muss. Sobald das funktionierte, nahm ich Schritt für Schritt alle anderen Sachen heraus, die ich hinzugefügt hatte, bis ich damit allein war. So sieht es aus wie ich gerade ein Zeichen hinzugefügt habe. Aber es hat lange gedauert, um herauszufinden, um welchen Charakter es sich handelt. :-) Danke für die Punkte! –

+0

Wo haben Sie die Nachricht auf dem Hardwaregerät gesehen? das würde mir sehr helfen, wenn ich irgendwo Fehler sehen könnte! – maxymoo

0

Ein Programm sollte eine Antwort auf "LaunchRequest" und "SessionEndedRequest" zurückgeben, andernfalls erhalten Sie "Es gab ein Problem mit den angeforderten Fähigkeiten repsonse".

Sie müssen Absicht "PlayMusic" hinzufügen und URL der Datei ändern.

P.S. Ich bin nicht sicher, welche version in build_audio_response Funktion sein sollte, bekam ich die json von 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

Wir haben ein wirklich einfaches Projekt auf Github erstellt, die die einfachste Art und Weise zeigt den Audioplayer zu verwenden:
https://github.com/bespoken/super-simple-audio-player

Wir haben auch eine Zuschreibung für sie hier:
https://bespoken.tools/blog/2017/02/27/super-simple-audioplayer

Das Projekt zeigt, wie ein Track zu spielen, sowie das Anhalten und Wieder suming. Hier

ist der Code, der die eigentliche Abspielen einer Audio-Datei zeigt:

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); 
}; 
Verwandte Themen