0
votes

I'm writing an Alexa skill and am finished with the code. I only have one problem: I want my skill, which is based on a fact-skill template, to wait for responses after the output. But when the 8 seconds are over and Alexa didn't hear a respond, it puts out an error (Skill response was marked as failure, The target Lambda application returned a failure response). I read in an Amazon document (https://developer.amazon.com/docs/gadget-skills/keep-session-open.html) that normally Alexa just closes the mic. I have to add that I set 'shouldEndSession' to 'false' to let the mic open. Here is my entire Lambda-code:

  /* 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();
};

Response 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"
}

}

I hope you have any ideas how to solve this. Thanks in avance

1

1 Answers

0
votes

For any response if you want to wait for user response, you have to set the property "shouldEndSession" to "false" in the response JSON. But you don't have to explicitly do this if you are using any ask-sdk. If you use a reprompt the sdk will automatically set this property to 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 );
    },

If you want to use 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();
  },
};

In both these examples "shouldEndSession":"false" is automatically set by the sdk.

More on ask-sdk-for-nodejs V2 here