web-dev-qa-db-fra.com

Exemple le plus simple de streaming audio avec Alexa

J'essaie de lancer la nouvelle API de streaming audio. La réponse suivante est-elle valide? Je reçois le message d'erreur «il y a un problème de compétence» lorsque je le teste sur mon appareil. 

Voici le code de ma fonction AWS-lambda:

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
        }
    }
12
maxymoo

Le code suivant a fonctionné pour moi:

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

La seule différence est que l'URL est https plutôt que http.

Ne soyez pas rebutés si cela ne fonctionne pas dans le simulateur de compétences. Cela n'a pas encore été mis à niveau pour fonctionner avec le streaming audio. Vous ne verrez même pas vos directives là-bas. Mais cela devrait fonctionner lorsqu'il est utilisé avec votre appareil.

15
Joseph Jaquinta

Nous avons créé un projet très simple sur Github qui montre le moyen le plus simple d'utiliser AudioPlayer:
https://github.com/bespoken/super-simple-audio-player

Nous avons également créé un article pour cela ici:
https://bespoken.tools/blog/2017/02/27/super-simple-audioplayer

Le projet montre comment lire une piste, en pause et en reprise.

Voici le code qui montre la lecture réelle d'un fichier audio:

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
John Kelvie

Un programme doit retourner une réponse sur "LaunchRequest" et "SessionEndedRequest", sinon vous obtiendrez "Il y avait un problème avec la réponse demandée aux compétences".

Vous devez ajouter une intention "PlayMusic" et changer l'URL du fichier.

P.S. Je ne suis pas sûr quelle version devrait être dans la fonction build_audio_response, j'ai obtenu le json de ici

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()
0
armicron