Writing the code for Alexa ----------------------------------------------------------------------------------------------------------------------------- **Author:** Tristan Brodeur **Email:** brodeurtristan@gmail.com **Date:** Last modified on 12/29/16 **Keywords:** Alexa, Amazon Skills Kit ----------------------------------------------------------------------------------------------------------------------------- Overview {{ youtube>m8i3vgwMH3k?medium }} ----------------------------------------------------------------------------------------------------------------------------- 1. Create a Lambda Function To create a lambda function, follow this tutorial: [[using_lambda|Creating a lambda function]] ----------------------------------------------------------------------------------------------------------------------------- 2. Add the code def lambda_handler(event, context): #Checks to make sure application id is same as alexa skill (links) if (event['session']['application']['applicationId'] != #Change to application id listed under your alexa skill in the developer portal "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"): raise ValueError("Invalid Application ID") if event["session"]["new"]: on_session_started({"requestId": event["request"]["requestId"]}, event["session"]) #check event types and call appropriate response if event["request"]["type"] == "LaunchRequest": return on_launch(event["request"], event["session"]) elif event["request"]["type"] == "IntentRequest": return on_intent(event["request"], event["session"]) elif event["request"]["type"] == "SessionEndedRequest": return on_session_ended(event["request"], event["session"]) #################################################################### def on_session_started(session_started_request, session): print "Starting new." #################################################################### def on_launch(launch_request, session): return get_welcome_response() #################################################################### def on_intent(intent_request, session): intent = intent_request["intent"] intent_name = intent_request["intent"]["name"] if intent_name == "Hello": return say_hello() elif intent_name == "AMAZON.HelpIntent": return get_welcome_response() elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent": return handle_session_end_request() else: raise ValueError("Invalid intent") #################################################################### def on_session_ended(session_ended_request, session): print "Ending session." #################################################################### def say_hello(): session_attributes = {} card_title = "Hello World" speech_output = "Hello World" reprompt_text = "" should_end_session = True return build_response(session_attributes, build_speechlet_response( card_title, speech_output, reprompt_text, should_end_session)) #################################################################### def build_response(session_attributes, speechlet_response): return { "version": "1.0", "sessionAttributes": session_attributes, "response": speechlet_response } #################################################################### def build_speechlet_response(title, output, reprompt_text, should_end_session): #return data in json format to alexa skills kit return { "outputSpeech": { "type": "PlainText", "text": output }, "card": { "type": "Simple", "title": title, "content": output }, "reprompt": { "outputSpeech": { "type": "PlainText", "text": reprompt_text } }, "shouldEndSession": should_end_session } #################################################################### ******Make sure to change the application id listed in lambda_handler() to your own id once you create the Alexa Skill with Alexa Skills Kit****** ----------------------------------------------------------------------------------------------------------------------------- The handler function takes two parameters: * event: will contain an object with information about the request. * context: will represent the state of the Lambda function (for * example, how much time is left before the function times out). The * context parameter is also used for sending a response back to the * caller. In this tutorial, we’ll run the web service on AWS Lambda, a service that executes code in response to events, thus saving the developer the trouble of maintaining a server. Lambda also links seamlessly to the Alexa Skills Kit, which makes it an excellent tool for running the code for Alexa Skills. We will implement the server functionality as a python module, so to complete the tutorial, you’ll need a basic understanding of python2.7. Every request from the Alexa Skills Kit has a type, passed in event.request.type. In all, there are three request types, all of which the service needs to respond to separately: * Launch request: Sent when the user launches the Skill. The * example code calls the helper function onLaunch to initialize the * help function. * SessionEndedRequest: Sent when the user stops using the skill * by saying “exit”, by not responding for a while, or if an error occurs. * The example code calls the helper function onSessionEnded, * which is currently just a placeholder and doesn’t do anything. * IntentRequest: Sent when the user speaks a command that * maps to an intent. The example code calls the helper function * onIntent. Amazon’s documentation explains that: “[A]n intent represents a high-level action that fulfills a user’s spoken request. Intents can optionally have arguments called slots that collect additional information needed to fulfill the user’s request.” When a user speaks a command, Alexa converts it to text and compares it to a list of phrases the application understands. Each phrase is mapped to an intent definition so that your code doesn’t have to worry about parsing the free-form input from the user but can rely on the intents to organize its communication with the user. ----------------------------------------------------------------------------------------------------------------------------- You’ll soon see how to specify the intents for your skill, but first, let’s take a look at the onIntent function to see how Alexa handles the intents. def on_intent(intent_request, session): intent = intent_request["intent"] intent_name = intent_request["intent"]["name"] if intent_name == "Hello": return say_hello() elif intent_name == "AMAZON.HelpIntent": return get_welcome_response() elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent": return handle_session_end_request() else: raise ValueError("Invalid intent") As you can see, most of the function is an if..else structure that compares the intent name from the request to a set of intents the skill accepts. Depending on the intent name, it then calls a matching function. For example, when Alexa receives a request with the intent name Hello, it calls the corresponding say_hello() function. ----------------------------------------------------------------------------------------------------------------------------- Looking at the say_hello function, def say_hello(): session_attributes = {} card_title = "Hello World" speech_output = "Hello World" reprompt_text = "" should_end_session = True return build_response(session_attributes, build_speechlet_response( card_title, speech_output, reprompt_text, should_end_session)) we can see that the function returns a build_response function that will pass arguments defined in the say_hello function. -card_title: name of the card that will display on the Alexa app on your smartphone -speech_output: what the Echo or Echo Dot will ouput once the function build_response function is called -should_end_session: tells Alexa whether to end the skill session after a response has been outputed. This should be set to True in this case. If a reprompt text is defined, usually should_end_session would be set to false, however all we are doing with this function is asking for a simple output. ----------------------------------------------------------------------------------------------------------------------------- After the code is added, [[using_alexa_skills_kit|configure your lambda function with the Alexa Skills Kit.]]