Как правильно реализовать AMAZON.ResumeIntent и AMAZON.PauseIntent в навыке аудиоплеера - PullRequest
0 голосов
/ 28 января 2019

Я создаю навык для Amazon Alexa, который извлекает подкаст с веб-сайта и воспроизводит его.Подкаст воспроизводится и корректно останавливается, но у меня возникает проблема, когда я пытаюсь остановить его и возобновить его.

Во-первых, Amazon говорит, что я могу приостановить и возобновить воспроизведение звука, просто сказав "Alexa, pause" или"Алекса, резюме".Но в моем коде это вызывает ошибки в ответе навыка, и мне приходится использовать имя вызова, чтобы заставить их работать.

Моя вторая проблема заключается в том, что когда я приостанавливаю аудиопоток, он останавливается.Но когда я возобновляю его, он начинается с LaunchRequest.Это не просто начать потоковую передачу с самого начала.Похоже, что Alexa рассматривает вызовы «open mySkill» и «resume mySkill» как одно и то же.Но «резюме» должно быть высказыванием для начала потоковой передачи с той точки, где оно было приостановлено ранее.

Я попытался изменить параметр «следует», но это не то, что я хотел, потому что это заставляет Алексу ждать новогоответы вместо потокового аудио.

Это часть моего кода.

SimplePlayer.prototype.handle = function () {
var requestType = this.event.request.type;
var userId = this.event.context ? this.event.context.System.user.userId : this.event.session.user.userId;
var epId = this.id_episode;
//variabile per gestire i diversi linguaggi della richiesta
var requestLang = this.event.request.locale;


// On launch, we tell the user what they can do (Play audio :-))
if (requestType === "LaunchRequest") {
    if(requestLang === "en-US")
        this.say("Welcome to the commonsense radio. Say Start to play some audio!", "You can say Start");
    else if(requestLang === "it-IT")
        this.say("Benvenuto nella Radio del Buonsenso. Puoi dire avvia per ascoltare l'ultimo programma!", "You can say Play");
// Handle Intents here - Play, Pause and Resume is all for now
} else if (requestType === "IntentRequest") {
    var intent = this.event.request.intent;
    if (intent.name === "AvviaRadioIntent") {
        this.play(podcastURL + epId + "/play", 0);

    } else if (intent.name === "AMAZON.StopIntent") {
        // When we receive a Pause Intent, we need to issue a stop directive
        //  Otherwise, it will resume playing - essentially, we are confirming the user's action
        //this.say("stop", "stop");
        if(requestLang === "it-IT")
            this.stop("Sto terminando la riproduzione come richiesto", "Termino la riproduzione");
        else if(requestLang === "en-US")
            this.stop("I'm closing the audio stream as requested. ", "Closing the audio stream.");
    } else if (intent.name === "AMAZON.PauseIntent") {
            this.stop("","");
            this.attributes.offsetInMills = this.event.request.offsetInMilliseconds;
    } else if (intent.name === "AMAZON.ResumeIntent") {
            this.play(podcastURL + epId + "/play", this.attributes.offsetInMills);
    } else if (intent.name === "AMAZON.StartOverIntent") {
        var lastPlayed = this.loadLastPlayed(userId);
        var offsetInMilliseconds = 0;
        if (lastPlayed !== null) {
            offsetInMilliseconds = lastPlayed.request.offsetInMilliseconds;
        }

        this.play(podcastURL, offsetInMilliseconds);
    } else if (intent.name === "AMAZON.HelpIntent") {
        if(requestLang === "en-US")
            this.say("Welcome to the Radio del Buonsenso. Say Play to play some audio!", "You can say Play");
        else if(requestLang === "it-IT")
            this.say("Puoi dire avvia per ascoltare l'ultimo programma!. Invece puoi dire stop radio del buonsenso per interrompere la riproduzione", "Puoi dire avvia per avviare, stop radio del buonsenso per chiudere.");



    }
};

Это директивы Play и Stop, которые я реализовал.

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

// Stops the playback of Audio
SimplePlayer.prototype.stop = function (message, repromptMessage) {
var response = {
    version: "1.0",
    response: {
        shouldEndSession: true,
        outputSpeech: {
            type: "SSML",
            ssml: "<speak> " + message + " </speak>"
        },
        reprompt: {
            outputSpeech: {
                type: "SSML",
                ssml: "<speak> " + repromptMessage + " </speak>"
            }
        },
        directives: [
            {
                type: "AudioPlayer.Stop"
            }
        ]
    }
};

this.context.succeed(response);
};

Как я могу заставить умение остановить звук, когда сказал "Alexa, pause", и как я могвозобновить потоковую передачу с того момента, когда она была приостановлена, когда произнесено "Alexa, resume"?

...