Alexa выдает ошибку, если пользователь не отвечает («Ответ навыка был помечен как отказ») - PullRequest
0 голосов
/ 17 ноября 2018

Я пишу навык Алекса и закончу с кодом. У меня только одна проблема: я хочу, чтобы мой навык, основанный на шаблоне фактического навыка, ждал ответов после вывода. Но когда 8 секунд закончились, и Alexa не услышал ответ, он выдает ошибку (ответ навыка был помечен как сбой, целевое Lambda-приложение вернуло ответ об ошибке). Я прочитал в документе Amazon (https://developer.amazon.com/docs/gadget-skills/keep-session-open.html)), что обычно Алекса просто закрывает микрофон. Я должен добавить, что я установил ' shouldEndSession ' в ' false ', чтобы открыть микрофон. Вот весь мой лямбда-код:

  /* eslint-disable  func-names */
/* eslint quote-props: ["error", "consistent"]*/

/**
 * This sample demonstrates a simple skill built with the Amazon Alexa Skills
 * nodejs skill development kit.
 * This sample supports multiple lauguages. (en-US, en-GB, de-DE).
 * The Intent Schema, Custom Slots and Sample Utterances for this skill, as well
 * as testing instructions are located at [https://github.com/alexa/skill-sample-nodejs-fact[2]
 **/

'use strict';
const Alexa = require('alexa-sdk');

//=========================================================================================================================================
//TODO: The items below this comment need your attention.
//============================================================================

=============================================================

//Replace with your app ID (OPTIONAL).  You can find this value at the top of your skill's page on http://developer.amazon.com.
//Make sure to enclose your value in quotes, like this: const APP_ID = 'amzn1.ask.skill.bb4045e6-b3e8-4133-b650-72923c5980f1';
const APP_ID = undefined;

const SKILL_NAME = 'Wissens Zitate';
const GET_FACT_MESSAGE = "Hier ist dein Zitat: ";
const HELP_MESSAGE = 'Du kannst zum Beispiel sagen: gib mir ein wissens zitat, oder, du sagst stop, um den Skill zu beenden... Wie kann ich dir helfe?';
const HELP_REPROMPT = 'Womit kann ich dir helfen?';
const STOP_MESSAGE = 'Auf Wiedersehen!';

//=========================================================================================================================================
//TODO: Replace this data with your own.  You can find translations of this data at http://github.com/alexa/skill-sample-node-js-fact/data
//=========================================================================================================================================
const data = [
    ' Wissenschaft ohne Religion ist lahm, Religion ohne Wissenschaft ist blind. - Albert Einstein',
    'Für den gläubigen Menschen steht Gott am Anfang, für den Wissenschaftler am Ende aller seiner Überlegungen. - Max Planck ',
    'Es ist mein Job, nie zufrieden zu sein. - Wernher von Braun',
    'Eine gewaltige Lichtsinfonie spielte in tiefstem, feierlichen Schweigen über unseren Häuptern, wie um unserer Wissenschaft zu spotten: kommt doch her und erforscht mich! Sagt mir, was ich bin! - Alfred Wegener',
    'Die Naturwissenschaft braucht der Mensch zum Erkennen, den Glauben zum Handeln. - Max Planck',
    'Die Erfindungen für Menschen werden unterdrückt, die Erfindungen gegen sie gefördert. - Bertolt Brecht',
    'Ohne Spekulation gibt es keine neue Beobachtung. - Charles Darwin',
    'Die Arznei macht kranke, die Mathematik traurige und die Theologie sündhafte Leute. - Martin Luther',
    'Wenn alle Experten sich einig sind, ist Vorsicht geboten. - Bertrand Russell',
    'Zwei Wahrheiten können sich nie widersprechen. - Galileo Galilei.',
    'Wenn die Neugier sich auf ernsthafte Dinge richtet, dann nennt man sie Wissensdrang. - Marie von Ebner-Eschenbach',
    'Das schönste Glück des denkenden Menschen ist, das Erforschliche erforscht zu haben und das Unerforschliche zu verehren. - Johann Wolfgang von Goethe.',
    'Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. - Albert Einstein.',
    'Jedes Naturgesetz, das sich dem Beobachter offenbart, lässt auf ein höheres, noch unerkanntes schließen. - Alexander von Humboldt.',
    'Es gibt kein großes Genie ohne einen Schuss Verrücktheit. - Aristoteles.',
    'Ich fühle mich nicht zu dem Glauben verpflichtet, dass derselbe Gott, der uns mit Sinnen, Vernunft und Verstand ausgestattet hat, von uns verlangt, dieselben nicht zu benutzen. - Galileo Galilei.',
    'Mit dem Wissen wächst der Zweifel. - Johann Wolfgang von Goethe.',
    'Die Wahrheit triumphiert nie, ihre Gegner sterben nur aus. - Max Planck.',
    'Nicht mit Erfindungen, sondern mit Verbesserungen macht man Vermögen. - Henry Ford.',
    'Wozu Socken? Sie schaffen nur Löcher! - Albert Einstein.',
];

//=========================================================================================================================================
//Editing anything below this line might break your skill.
//=========================================================================================================================================

const handlers = {
    'LaunchRequest': function () {
        this.emit('GetNewFactIntent');
    },
    'GetNewFactIntent': function () {
        const factArr = data;
        const factIndex = Math.floor(Math.random() * factArr.length);
        const randomFact = factArr[factIndex];
        const speechOutput = GET_FACT_MESSAGE + randomFact;

        this.response.cardRenderer(SKILL_NAME, randomFact);
        this.response.speak(speechOutput);
        this.response.shouldEndSession(false, "Reprompt your user here");
        this.emit(':responseReady');
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;

        this.response.speak(speechOutput).listen(reprompt);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
};

exports.handler = function (event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

Ответ Json:

{
"body": {
    "version": "1.0",
    "response": {
        "outputSpeech": {
            "type": "SSML",
            "ssml": "<speak> Hier ist dein Zitat: Wenn die Neugier sich auf ernsthafte Dinge richtet, dann nennt man sie Wissensdrang. - Marie von Ebner-Eschenbach </speak>"
        },
        "card": {
            "type": "Simple",
            "title": "Wissens Zitate",
            "content": "Wenn die Neugier sich auf ernsthafte Dinge richtet, dann nennt man sie Wissensdrang. - Marie von Ebner-Eschenbach"
        },
        "shouldEndSession": false
    },
    "sessionAttributes": {},
    "userAgent": "ask-nodejs/1.0.25 Node/v6.10.3"
}

}

Надеюсь, у вас есть идеи, как это решить. Спасибо в avance

1 Ответ

0 голосов
/ 19 ноября 2018

Для любого ответа, если вы хотите дождаться ответа пользователя, необходимо установить для свойства "shouldEndSession" значение "false" в ответе JSON.Но вам не нужно явно делать это, если вы используете какую-либо ask-sdk.Если вы используете reprompt, sdk автоматически установит это свойство на false.

In ask-nodejs-sdk-v1

'GetNewFactIntent': function () {
        const factArr = data;
        const factIndex = Math.floor(Math.random() * factArr.length);
        const randomFact = factArr[factIndex];
        const speechOutput = GET_FACT_MESSAGE + randomFact;
        const reprompt = "Reprompt your user here";      
        this.emit(':askWithCard',speechOutput,reprompt,SKILL_NAME,randomFact );
    },

Если вы хотите использовать ask-nodejs-sdk-v2

const GetNewFactIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === "IntentRequest"
           && handlerInput.requestEnvelope.request.intent.name === "GetNewFactIntent";
  },
  handle(handlerInput) {
     const factArr = data;
     const factIndex = Math.floor(Math.random() * factArr.length);
     const randomFact = factArr[factIndex];
     const speechOutput = GET_FACT_MESSAGE + randomFact;
     const reprompt = "Reprompt your user here";      
     return handlerInput.responseBuilder
       .speak(speechOutput )
       .reprompt(reprompt )
       .withSimpleCard(SKILL_NAME,randomFact )
       .getResponse();
  },
};

В обоих этих примерах sdk автоматически устанавливает "shouldEndSession":"false".

Подробнее о ask-sdk-for-nodejs V2 здесь

...