Мой опубликованный навык может быть вызван «Alexa, open Mighty Righty», но он не сработает, если пользователь скажет «Alexa, спросите Mighty Righty, кто прав, я или мой муж», как это сделать?
https://www.amazon.com/dp/B07SGBR24G/
Это ссылка на рабочий опубликованный навык.
#------------------------------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
Это файл JSON. Это может немного отличаться, потому что я попытался максимально сократить файл для целей этого вопроса, но это не имеет значения, потому что основные компоненты здесь - присутствуют в текущем рабочем приложении:
{
"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"
]
}
}
]
}
]
}
}
}
Кстати, как вы можете видеть, есть синонимы, но Alexa не будет их использовать. Очень хороший пример:
Алекса, кто прав, я или ты? (Работа)
Алекса, кто прав, ты или я? (не будет работать)
Но в JSON написано:
"value": "me or you",
"synonyms": [
"you or me"
]
Но я думаю, для этого мне нужно задать еще один вопрос ...
Я зашел в Alexa Developer Console, вкладка Test, написал:
"Алекса, спроси могучую правду, кто прав, я или мой муж"
Она сказала:
Хмм, я этого не знаю.
Ничего в окнах ввода и вывода JSON, но я нашел эту строку в журналах устройства:
[21: 11: 35: 676] - Событие: Text.TextMessage
Я щелкнул там, и он открыл это (если это то, что нужно):
{
"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
}
}
}
]
}
После этого следующий лог
[21: 11: 36: 703] - Директива: SkillDebugger.CaptureDebuggingInfo
Там написано
{
"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
}
]
}
}
}
следующий [21: 11: 36: 932] - Директива: 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'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>"
}
}
и еще пару таких журналов и все, вот что я нашел.
Ожидаемый результат:
- Алекса, спроси Могучего Райти, кто прав, я или моя жена?
- твоя жена
(или другой случайный ответ от Player_BIOGRAPHY "я или моя жена")
Фактический результат:
- Алекса, открой Mighty Righty.
- Привет, вы можете сказать ......
- Кто прав, я или моя жена?
- твоя жена
(или другой случайный ответ от Player_BIOGRAPHY "я или моя жена")
Как видите, путь к ответу намного длиннее (в зависимости от приветствия Mighty Righty)
Пожалуйста, помогите! (Я не кодер, я только следовал учебнику)