2

My published skill can be invoked by "Alexa, open Mighty Righty," but it won't work if a user says "Alexa, ask Mighty Righty who is right, me or my husband," how to do that?

https://www.amazon.com/dp/B07SGBR24G/

This is the link to the working published skill.

#------------------------------Part1--------------------------------
# In this part we define a list that contains the player names, and 
# a dictionary with player biographies

Player_LIST = ["me or my wife", "me or my husband", "me or you"]

Player_BIOGRAPHY = {"me or my wife": ["She is. Do as she says, and you'll be OK.", "You", "Of course, your wife", "No doubt, it's you"],

"me or my husband": ["He is", "You are right", "He is not right", "Your husband. He is always right."],

"me or you": ["me", "You are, ... I mean... you are wrong, of course", "of course me", "It's me, don't you know that, my friend?", "you yourself, what do you think? Of course it's me", "I always know who is right, me or not me, so, it's me", "what do you think? I am Mighty Righty, so I am RIGHT"]}

#------------------------------Part2--------------------------------
# Here we define our Lambda function and configure what it does when 
# an event with a Launch, Intent and Session End Requests are sent. # The Lambda function responses to an event carrying a particular 
# Request are handled by functions such as on_launch(event) and 
# intent_scheme(event).

def lambda_handler(event, context):
    if event['session']['new']:
        on_start()
    if event['request']['type'] == "LaunchRequest":
        return on_launch(event)
    elif event['request']['type'] == "IntentRequest":
        return intent_scheme(event)
    elif event['request']['type'] == "SessionEndedRequest":
        return on_end()

#------------------------------Part3--------------------------------
# Here we define the Request handler functions

def on_start():
    print("Session Started.")

def on_launch(event):
    onlunch_MSG = "Hi, start with the word. Me. For example: who is right, me or my husband?"
    reprompt_MSG = "you can say, who is right, me or my wife?"
    card_TEXT = "Who is right, me or... ?."
    card_TITLE = "Choose your question."
    return output_json_builder_with_reprompt_and_card(onlunch_MSG, card_TEXT, card_TITLE, reprompt_MSG, False)

def on_end():
    print("Session Ended.")

#-----------------------------Part3.1-------------------------------
# The intent_scheme(event) function handles the Intent Request. 
# Since we have a few different intents in our skill, we need to 
# configure what this function will do upon receiving a particular 
# intent. This can be done by introducing the functions which handle 
# each of the intents.

def intent_scheme(event):

    intent_name = event['request']['intent']['name']

    if intent_name == "playerBio":
        return player_bio(event)        
    elif intent_name in ["AMAZON.NoIntent", "AMAZON.StopIntent", "AMAZON.CancelIntent"]:
        return stop_the_skill(event)
    elif intent_name == "AMAZON.HelpIntent":
        return assistance(event)
    elif intent_name == "AMAZON.FallbackIntent":
        return fallback_call(event)

#---------------------------Part3.1.1-------------------------------
# Here we define the intent handler functions

import random # this can be at the top of the file too
def player_bio(event):
    name=event['request']['intent']['slots']['player']['value']
    player_list_lower=[w.lower() for w in Player_LIST]
    if name.lower() in player_list_lower:
        reprompt_MSG = "Try to say something like. who is right me or them"
        card_TEXT = "You've picked " + name.lower()
        card_TITLE = "You've picked " + name.lower()
        return output_json_builder_with_reprompt_and_card(random.choice(Player_BIOGRAPHY[name.lower()]), card_TEXT, card_TITLE, reprompt_MSG, False)
    else:
        wrongname_MSG = "Some questions may not yet be present in my database. Try to rephrase your sentence."
        reprompt_MSG = "For example, who is right, me or my wife?"
        card_TEXT = "Use the full question."
        card_TITLE = "Wrong question."
        return output_json_builder_with_reprompt_and_card(wrongname_MSG, card_TEXT, card_TITLE, reprompt_MSG, False)

def stop_the_skill(event):
    stop_MSG = "Bye for now and feel free to ask mighty righty who is right"
    reprompt_MSG = "next time just tell me. Open Mighty righty"
    card_TEXT = "Bye."
    card_TITLE = "Bye Bye."
    return output_json_builder_with_reprompt_and_card(stop_MSG, card_TEXT, card_TITLE, reprompt_MSG, True)

def assistance(event):
    assistance_MSG = "start with the word. Me."
    reprompt_MSG = "For example, who is right me or him"
    card_TEXT = "You've asked for help."
    card_TITLE = "Help"
    return output_json_builder_with_reprompt_and_card(assistance_MSG, card_TEXT, card_TITLE, reprompt_MSG, False)

def fallback_call(event):
    fallback_MSG = "Try to say, for example, who is right, me or him?"
    reprompt_MSG = "Certain answers may not yet be in my database. Use personal pronouns, for example: me, or her, me, or him, me, or them. They can cover pretty much everybody"
    card_TEXT = "You've asked a wrong question."
    card_TITLE = "Wrong question."
    return output_json_builder_with_reprompt_and_card(fallback_MSG, card_TEXT, card_TITLE, reprompt_MSG, False)

#------------------------------Part4--------------------------------
# The response of our Lambda function should be in a json format. 
# That is why in this part of the code we define the functions which 
# will build the response in the requested format. These functions
# are used by both the intent handlers and the request handlers to 
# build the output.

def plain_text_builder(text_body):
    text_dict = {}
    text_dict['type'] = 'PlainText'
    text_dict['text'] = text_body
    return text_dict

def reprompt_builder(repr_text):
    reprompt_dict = {}
    reprompt_dict['outputSpeech'] = plain_text_builder(repr_text)
    return reprompt_dict

def card_builder(c_text, c_title):
    card_dict = {}
    card_dict['type'] = "Simple"
    card_dict['title'] = c_title
    card_dict['content'] = c_text
    return card_dict    

def response_field_builder_with_reprompt_and_card(outputSpeach_text, card_text, card_title, reprompt_text, value):
    speech_dict = {}
    speech_dict['outputSpeech'] = plain_text_builder(outputSpeach_text)
    speech_dict['card'] = card_builder(card_text, card_title)
    speech_dict['reprompt'] = reprompt_builder(reprompt_text)
    speech_dict['shouldEndSession'] = value
    return speech_dict

def output_json_builder_with_reprompt_and_card(outputSpeach_text, card_text, card_title, reprompt_text, value):
    response_dict = {}
    response_dict['version'] = '1.0'
    response_dict['response'] = response_field_builder_with_reprompt_and_card(outputSpeach_text, card_text, card_title, reprompt_text, value)
    return response_dict

This Is the JSON file. It might be slightly different, because I tried to shorten the file as much as possible for the purpose of this question, but it doesn't matter because the main components here - are present in the current working app:

{
    "interactionModel": {
        "languageModel": {
            "invocationName": "mighty righty",
            "intents": [
                {
                    "name": "AMAZON.FallbackIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.CancelIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.HelpIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.StopIntent",
                    "samples": []
                },
                {
                    "name": "playerBio",
                    "slots": [
                        {
                            "name": "player",
                            "type": "playerNames"
                        }
                    ],
                    "samples": [
                        "who is right {player}"
                    ]
                },
                {
                    "name": "AMAZON.NoIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.NavigateHomeIntent",
                    "samples": []
                }
            ],
            "types": [
                {
                    "name": "playerNames",
                    "values": [
                        {
                            "name": {
                                "value": "me or you",
                                "synonyms": [
                                    "you or me"
                                ]
                            }
                        },
                        {
                            "name": {
                                "value": "me or them",
                                "synonyms": [
                                    "I am or they are",
                                    "I am or them",
                                    "I am or they",
                                    "I or they are",
                                    "I or them",
                                    "me or they are",
                                    "me or they"
                                ]
                            }
                        },
                        {
                            "name": {
                                "value": "me or him",
                                "synonyms": [
                                    "I or him",
                                    "I or he",
                                    "I'm or he is",
                                    "I'm or him",
                                    "me or he is",
                                    "me or he's"
                                ]
                            }
                        },
                        {
                            "name": {
                                "value": "me or her",
                                "synonyms": [
                                    "I'm or she's",
                                    "I am or she is",
                                    "I'm or she",
                                    "I'm or her",
                                    "me or she is",
                                    "me or she"
                                ]
                            }
                        },
                        {
                            "name": {
                                "value": "me or my wife",
                                "synonyms": [
                                    "me or my wifey"
                                ]
                            }
                        },
                        {
                            "name": {
                                "value": "me or my husband",
                                "synonyms": [
                                    "my husband"
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
}

By the way, as you can see there are synonyms, but Alexa won't use them. Very good example:

Alexa, who is right, me or you? (works)

Alexa, who is right, you or me? (won't work)

But in the JSON it says:

                                "value": "me or you",
                                "synonyms": [
                                    "you or me"
                                ]

But I think for that I need to ask another question...

I went to Alexa Developer Console, Test tab, wrote:

"alexa, ask mighty righty who is right, me or my husband"

She said:

Hmm, I don't know that.

Nothing in JSON input and output windows, but I found this line in device logs:

[21:11:35:676] - Event: Text.TextMessage

I clicked there and it opened this (if this is what is needed):

{
    "event": {
        "header": {
            "namespace": "Text",
            "name": "TextMessage",
            "messageId": "messageId",
            "dialogRequestId": "numbers-and-letters-separated-with-sashes-that-i-deletedxxxxxxxxxxxxxxxxxxxxxxxxxxx506"
        },
        "payload": {
            "textMessage": "alexa, ask mighty righty who is right, me or my husband"
        }
    },
    "context": [
        {
            "header": {
                "namespace": "System",
                "name": "SettingsState",
                "payloadVersion": "1"
            },
            "payload": {
                "settings": [
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.experiences",
                        "value": "[{\"arcMinuteWidth\":\"246\",\"arcMinuteHeight\":\"144\",\"canRotate\":\"false\",\"canResize\":\"false\"}]"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.shape",
                        "value": "RECTANGLE"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.pixelWidth",
                        "value": "1024"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.pixelHeight",
                        "value": "600"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.dpi",
                        "value": "160"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.currentPixelWidth",
                        "value": "1024"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.currentPixelHeight",
                        "value": "600"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.touch",
                        "value": "[\"SINGLE\"]"
                    },
                    {
                        "key": "com.amazon.alexa.characteristics.viewport.video",
                        "value": "{\"codecs\": [\"H_264_42\",\"H_264_41\"]}"
                    }
                ]
            }
        },
        {
            "header": {
                "namespace": "SpeechSynthesizer",
                "name": "SpeechState"
            },
            "payload": {
                "token": "amzn1.as-ct.v1.ThirdPartySdkSpeechlet#ACRI#ValidatedSpeakDirective_amzn1.ask.skill.some-kind-of-numbers-and-letters-here-i-deleted-it_they-are-seperated-with-dashes-and-1-underscore-in-the-middlexxxxxxxxxxxxxxxxxxxxxxxx",
                "offsetInMilliseconds": 1000,
                "playerActivity": "FINISHED"
            }
        },
        {
            "header": {
                "namespace": "AudioPlayer",
                "name": "PlaybackState"
            },
            "payload": {
                "token": "",
                "offsetInMilliseconds": 0,
                "playerActivity": "IDLE"
            }
        },
        {
            "header": {
                "namespace": "Alerts",
                "name": "AlertsState"
            },
            "payload": {
                "activeAlerts": [],
                "allAlerts": []
            }
        },
        {
            "header": {
                "namespace": "AudioFocusManager",
                "name": "AudioFocusState"
            },
            "payload": {
                "dialog": {
                    "component": "SpeechSynthesizer",
                    "idleTimeInMilliseconds": 0
                }
            }
        }
    ]
}

After that the next log

[21:11:36:703] - Directive: SkillDebugger.CaptureDebuggingInfo

It says

{
    "header": {
        "namespace": "SkillDebugger",
        "name": "CaptureDebuggingInfo",
        "messageId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx38"
    },
    "payload": {
        "skillId": null,
        "timestamp": "2019-06-02T01:11:34.189Z",
        "dialogRequestId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx506",
        "skillRequestId": null,
        "type": "ConsideredIntents",
        "content": {
            "intents": [
                {
                    "name": "<IntentForDifferentSkill>",
                    "confirmationStatus": null,
                    "slots": null
                },
                {
                    "name": "<IntentForDifferentSkill>",
                    "confirmationStatus": null,
                    "slots": null
                },
                {
                    "name": "<IntentForDifferentSkill>",
                    "confirmationStatus": null,
                    "slots": null
                }
            ]
        }
    }
}

the next one [21:11:36:932] - Directive: SpeechSynthesizer.Speak:

{
    "header": {
        "namespace": "SpeechSynthesizer",
        "name": "Speak",
        "messageId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "dialogRequestId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx506",
        "keys": {
            "isBlocking": true,
            "channel": "audio"
        }
    },
    "payload": {
        "caption": "Hmm, I don't know that.",
        "url": "https://tinytts.amazon.com/path to file here/resource.mp3",
        "format": "AUDIO_MPEG",
        "token": "amzn1.as-ct.v1.Domain:Global:Fallback#ACRI#DeviceTTSRendererV4_xxxxxxxxx5c",
        "ssml": "<speak><prosody volume=\"x-loud\">Hmm, I don&apos;t know that.</prosody><metadata><promptMetadata><promptId>NotUnderstood</promptId><namespace>SmartDJ.MusicQA</namespace><locale>en_US</locale><overrideId>default</overrideId><variant>2017_Variant 5</variant><condition/><weight>1</weight><stageVersion>Adm-xxxxxxxxxxxxxx</stageVersion></promptMetadata></metadata></speak>"
    }
}

and a couple of more of these logs and that's it, that's what I found.

Expected result:

  • Alexa, ask Mighty Righty who is right, me or my wife?
  • your wife (or another random response from Player_BIOGRAPHY "me or my wife")

Actual result:

  • Alexa, open Mighty Righty.
  • Hi, you can say ......
  • Who is right, me or my wife?
  • your wife (or another random response from Player_BIOGRAPHY "me or my wife")

As you can see, the way to get to the response is much longer (depending on Mighty Righty's welcome response)

Please, help! (I am not a coder, I just followed a tutorial)

Dilshod
  • 27
  • 6
  • The problem is not necessarily in the code. Can you share your console setup? The intent utterances, the slots, and what the incoming request/event is when you say "Alexa, ask Mighty Righty ...." that is sent to your Lambda. Just replace any skillID and sensitive data with xxxxx. – Jay A. Little Jun 01 '19 at 02:22
  • where to paste that from? AWS console where it says: select a test event. test. OR from alexa developer console, from the test tab, where it says JSON input and output (if so there is no output when I say alexa, ask mighty righty who is right me or you). I pasted the JSON file as you told me. – Dilshod Jun 01 '19 at 17:59
  • For synonyms, Alexa does not automatically change the value for you. Instead you are given `slot.resolutions` and you have to switch the value in Lambda. Check out this answer: https://stackoverflow.com/questions/48638353/how-to-handle-synonyms-in-intents-in-alexa – Jay A. Little Jun 02 '19 at 00:17
  • For the Alexa request, look in the Alexa Console test chat and grab the "input" part after you enter "Alexa, ask Mighty Righty who is right, me or my husband." That shows what is sent to your Lambda. Then your Lambda is not handling it with an output for some reason, so seeing the input might explain why. – Jay A. Little Jun 02 '19 at 00:28
  • I went to the test tab and in JSON input and output windows it was nothing there. There a little below I found in device logs some I think JSON format logs. Can you have a look maybe it's that what you meant. – Dilshod Jun 02 '19 at 02:05
  • Surprised nothing shows in the test JSON input. I just tried my own and it didn't accept inputs with commas, so try again without punctuation. Normally, Alexa takes speech so she doesn't include commas in her speech-to-text interpretation. You should also try using your microphone in the Alexa console test chat as well to get a better idea of how Alexa is interpretting voice. – Jay A. Little Jun 02 '19 at 10:33
  • From the drop-down I selected "live" out of "development" and "off," when I said "Alexa open mighty righty who is right me or you," she wrote "alexa ask my dee radio who is right me or you," and response was "You have Mighty Righty enabled. Do you want to open it?," then if she understands it incorrectly, she would also say she doesn't know that. But when I forced my input in the text line as "alexa ask mighty righty who is right me or you" and she said "me." With punctuation - fail. Solution: pronounce super clearly, so the issue is not the code. Thank you for punctuation. – Dilshod Jun 02 '19 at 17:46
  • I am still working on synonyms and can't figure out where and what code should I paste. Maybe I don't read attentively, but the instructions out there don't really say that. – Dilshod Jun 02 '19 at 17:49
  • Glad the punctuation issue solved the problem, I added it as an answer to this question and I suggest you post a new question for help with the synonyms and include what you have tried from the post I suggested. Others may have a better way to explain it. – Jay A. Little Jun 03 '19 at 01:02

1 Answers1

3

This error message of "Hmm, I don't know that" is delivered when Alexa cannot understand the input outside of a skill, and so does not recognize what you are asking or what skill to use. So it shouldn't be an error with the slots or intents.

When Alexa captures voice input, it does not insert any punctuation, and the punctuation such as commas seem to break Alexa's ability to understand the input.

So when using the Alexa Console test chat, do not write any punctuation into the text input.

And when testing with voice, pronounce your input clearly and double check your logs to view how Alexa interpretted the voice. The more you use your skill, the better Alexa should learn to capture the key words correctly.

Jay A. Little
  • 3,239
  • 2
  • 11
  • 32
  • 1
    Absolutely true, I noticed that after a while she picks up mighty righty correctly. But at first she hears my tea right tea, or something like that. But later she gets it right. – Dilshod Jun 03 '19 at 04:04
  • 1
    I think I need to open another discussion on how to teach her understand the synonyms – Dilshod Jun 03 '19 at 04:05