Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -- coding: utf-8 --
- """
- This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
- The Intent Schema, Custom Slots, and Sample Utterances for this skill, as well
- as testing instructions are located at http://amzn.to/1LzFrj6
- For additional samples, visit the Alexa Skills Kit Getting Started guide at
- http://amzn.to/1LGWsLG
- """
- from __future__ import print_function
- import json
- import boto3
- import datetime
- import random
- import decimal
- import requests
- #BUCKET_URL = 'http://35.168.209.123:5000'
- BUCKET_URL = 'http://54.175.141.247:5000'
- REGION = "us-east-1"
- dynamodb = boto3.resource('dynamodb', REGION)
- state_table = dynamodb.Table('StateTable')
- user_table = dynamodb.Table('UserTable')
- confidence_scores = dynamodb.Table("confidence_scores")
- convId_table = dynamodb.Table("convid_event")
- # Set of utterances that get randomly selected when reprompting the user
- utterances=["Are you still there?",
- "Cat got your tongue?",
- "Hello? Anyone there?",
- "Houston, we have a problem! I think I lost communication..."]
- intro_phrases=["How are you doing?",
- "How are you feeling today?",
- "How's it going with you?",
- "How's it going?",
- "How are you?"]
- # --------------- Helpers that build all of the responses ----------------------
- def build_speechlet_response(title, output, reprompt_text, should_end_session):
- return {
- 'outputSpeech': {
- 'type': 'SSML',#'PlainText',
- 'ssml':'<speak>'+ output+ '</speak>'
- },
- 'reprompt': {
- 'outputSpeech': {
- 'type': 'PlainText',
- 'text':reprompt_text
- }
- },
- 'shouldEndSession': should_end_session
- }
- def build_response(session_attributes, speechlet_response):
- return {
- 'version': '1.0',
- 'sessionAttributes': session_attributes,
- 'response': speechlet_response
- }
- # --------------- Functions that control the skill's behavior ------------------
- def get_welcome_response():
- """ If we wanted to initialize the session to have some attributes we could
- add those here
- """
- session_attributes = {}
- card_title = "Welcome"
- speech_output = "Hi, This is a development Alexa Prize socialbot... " + random.choice(intro_phrases)
- reprompt_text = select_random_utterance()
- should_end_session = False
- return build_response(session_attributes, build_speechlet_response(
- card_title, speech_output, reprompt_text, should_end_session))
- def handle_session_end_request():
- card_title = "Session Ended"
- speech_output = ""
- # Setting this to true ends the session and exits the skill.
- should_end_session = True
- return build_response({}, build_speechlet_response(
- card_title, speech_output, None, should_end_session))
- def get_answer(intent, session):
- """ Sets the color in the session and prepares the speech to reply to the
- user.
- """
- # card_title = intent['intent']['name']
- card_title = session['sessionId']
- session_attributes = {}
- should_end_session = False
- utterance = intent['intent']["slots"]["All"]["value"]
- session_id = session['sessionId']
- timestamp = intent['timestamp']
- user_id = session['user']['userId']
- print("utterance: {}, session_id: {}, timestamp: {}, user_id: {}".format(utterance, session_id, timestamp, user_id))
- try:
- confidence_list = [x['confidence'] for x in intent['speechRecognition']['hypotheses'][0]['tokens']]
- # confidence_list = [decimal.Decimal(str(x)) for x in confidence_list]
- print(confidence_list)
- except:
- confidence_list = []
- # write the user utterance to db
- # update_db(session, timestamp, utterance_no_plus, "user", "1", "0", confidence_list
- # print('{}?q={}'.format(BUCKET_URL, utterance + '&sid=' + session['sessionId']))
- data = {
- 'session_id': session_id,
- 'question': utterance,
- 'user_id': user_id,
- 'avg_conf_score': sum(confidence_list)/len(confidence_list) if confidence_list else 1.0,
- 'conf_score_list': confidence_list,
- 'timestamp': timestamp
- }
- speech_output = 'blah blah'
- try:
- # speech_output = json.loads(urllib2.urlopen('{}?q={}'.format(BUCKET_URL, utterance + '&sid=' + session['sessionId']), timeout=15).read())
- res = requests.post(BUCKET_URL, json=data)
- speech_output = res.json().get('result')
- except Exception as e:
- # speech_output = 'I am sorry I didn\'t catch that. Could you repeat that please?'
- speech_output = str(e)
- print("speech_output: ", speech_output)
- if speech_output == 'STOP_INTENT_REQUESTED':
- return build_response(session_attributes, build_speechlet_response(
- card_title, '', None, True))
- reprompt_text = select_random_utterance()
- # write the system utterance to db
- # update_db(session, timestamp, speech_output[1], "system", str(speech_output[0]), speech_output[2])
- # if news were selected (with news_id), save that to mt_newsAPI table
- # if len(speech_output) > 3:
- # update_news_id(session, speech_output[3])
- return build_response(session_attributes, build_speechlet_response(
- card_title, speech_output, reprompt_text, should_end_session))
- def select_random_utterance():
- return random.choice(utterances)
- def log(event):
- try:
- if 'conversationId' in json.dumps(event):
- # log_table.put_item(
- # Item={
- # 'timestamp': event["request"]["timestamp"],
- # 'event': json.dumps(event)
- # }
- # )
- convId_table.put_item(
- Item={
- 'conv_id': event["request"]["body"]["conversationId"],
- 'event': json.dumps(event)
- }
- )
- except:
- pass
- def log_confidence(event):
- try:
- # print(json.dumps(event))
- confidence_scores.put_item(
- Item={
- 'sessionID': event["session"]["sessionId"],
- 'utterance': json.dumps(event['request']['intent']["slots"]["All"]["value"]),
- 'event': json.dumps(event)
- }
- )
- except:
- pass
- # --------------- Events ------------------
- def on_session_started(session_started_request, session):
- """ Called when the session starts """
- print("on_session_started requestId=" + session_started_request['requestId']
- + ", sessionId=" + session['sessionId'])
- # create the session db object
- #start_db_session(session)
- #start_db_ner(session)
- def on_launch(launch_request, session):
- """ Called when the user launches the skill without specifying what they
- want
- """
- print("on_launch requestId=" + launch_request['requestId'] +
- ", sessionId=" + session['sessionId'])
- # Dispatch to your skill's launch
- return get_welcome_response()
- def on_intent(intent_request, session):
- """ Called when the user specifies an intent for this skill """
- print("on_intent requestId=" + intent_request['requestId'] +
- ", sessionId=" + session['sessionId'])
- #intent = intent_request['intent']
- intent_name = intent_request['intent']['name']
- # Dispatch to your skill's intent handlers
- if intent_name == "GetAnswer":
- return get_answer(intent_request, session)
- elif intent_name == "StopIntent":
- return handle_session_end_request()
- else:
- raise ValueError("Invalid intent")
- def on_session_ended(session_ended_request, session):
- """ Called when the user ends the session.
- Is not called when the skill returns should_end_session=true
- """
- print("on_session_ended requestId=" + session_ended_request['requestId'] +
- ", sessionId=" + session['sessionId'])
- # add cleanup logic here
- # --------------- Main handler ------------------
- def lambda_handler(event, context):
- """ Route the incoming request based on type (LaunchRequest, IntentRequest,
- etc.) The JSON body of the request is provided in the event parameter.
- """
- print("event.session.application.applicationId=" +
- event['session']['application']['applicationId'])
- log(event)
- log_confidence(event)
- """
- Uncomment this if statement and populate with your skill's application ID to
- prevent someone else from configuring a skill that sends requests to this
- function.
- """
- # if (event['session']['application']['applicationId'] !=
- # "amzn1.echo-sdk-ams.app.[unique-value-here]"):
- # raise ValueError("Invalid Application ID")
- if event['session']['new']:
- on_session_started({'requestId': event['request']['requestId']},
- event['session'])
- 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'])
Add Comment
Please, Sign In to add comment