Sunday, August 14, 2016

Monitoring time while using your skill



I wanted to explore making a game using the Alexa.  I thought it would be useful to know how long the game had been running.  Here is an example of how I am able to track the time elapsed since launching a skill.

Intent Schema
{
  "intents": [
     {
      "intent": "TimeIntent"
     },
    {
      "intent": "AMAZON.StopIntent"
    }
    ]
}

Sample Utterances
TimeIntent How much time has passed


I only have one intent that I use to ask for the elapsed time.  And the StopIntent just helps me quit the skill.  All of the work happens in the Lambda function.

var tickingClockMP3 = 
    "https://alexafiles.blob.core.windows.net/demo/ticking-clock.mp3";

exports.handler = function (event, context) {
    var attributes = {};
    
    if (event.session.new) {
        attributes = { startTime: event.request.timestamp };
    }
    else {
        attributes = 
        { 
            startTime: event.session.attributes.startTime,
            timeDiff: (new Date(event.request.timestamp) - 
                       new Date(event.session.attributes.startTime)) / 1000
        };
    }
    
    try {

        if (event.request.type === "SessionEndedRequest") {
                    onSessionEnded(event.request, event.session);
                    context.succeed();
        }
        else if(event.request.type === "LaunchRequest")
            context.succeed(buildTickerResponse(attributes, false));
        else if(event.request.type === "IntentRequest") {
            var output = "" + (attributes.timeDiff || 0) 
                       + " seconds have past.
";
            context.succeed(buildTickerResponse(attributes, false, output));
        }
        else
            context.succeed(buildTickerResponse(attributes, false));
    } catch (e) {
        context.fail("Exception: " + e);
    }
};

function buildTickerResponse(attributes, shouldEndSession, output) {
    return {
        version: "1.0",
        sessionAttributes: attributes,
        response: {
            outputSpeech: {
                type: "SSML",
                ssml: output || ""
            },
            reprompt: {
                outputSpeech: {
                    type: "SSML",
                    ssml: "At anytime you can say... " + 
                          "Alexa, how much time has past?
"
                }
            },
            shouldEndSession: false
        }
    };
}


A few things to note here.  
  1. When creating MP3s, make sure you follow the rules about where they can be hosted and the allowed format.  I used FFMPEG to fix it up: ffmpeg -i input.mp3 -b:a 48k -ar 16000 output.mp3.
  2. While the SSML is playing the audio, the only way to get Alexa to hear you again, you have to say her name.
  3. I store the startTime as an attribute.  I have to copy that value over to the new attributes object I send back each time.
That's it!  You can now keep track of how much time has past since your skill started.


No comments:

Post a Comment