在开发我的一项技能时,我注意到在服务模拟器中,调用具有意图Welcome
的技能 - 应该调度到我的get_welcome_response()
函数 - 会失败,除非它认为这不是一个新的会议。当我在没有特定意图的情况下调用技能时再次使用实际的Echo设备进行测试时会反映这一点 - 这也应该默认为我的get_welcome_response()
函数 - 我得到Alexa告诉我它在访问该特定内容时遇到问题技能。以下是此技能的get_welcome_response()
功能:
def get_welcome_response():
session_attributes = {}
card_title = "Welcome"
speech_output = "Welcome to Bravo Lima." \
"Please state username and password"
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = "Unable to authenticate." \
"Please repeat username and password"
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
然而,由于整个技能本身非常复杂,我写了一个新的,很容易尝试,看看我是否可以简单地调用这个技能。该技能有一个功能,即get_welcome_response()
:
def get_welcome_response():
session_attributes = {}
card_title = "Welcome"
speech_output = "Hello. " \
"Good morning, " \
"is their coffee in that nebula?"
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, None, should_end_session))
如果在没有意图的情况下调用此技能,它就会在这里。我还将其定义为在服务模拟器中进行测试的意图,无论是否认为是新会话,它都可以工作。 Alexa能够在使用Echo调用时识别此技能,并相应地做出响应。
AWS lambda服务器处理之前使用的更复杂的技能的方式,这个技术几乎没有任何不同。 get_welcome_response()
函数之间唯一的两个区别是:
should_end_session = False
,因为它需要将session_attributes
变量传递给其他函数,以便技能中的各种其他意图正常工作。这两项技能都是使用亚马逊的MyColorIs
模板创建的,因此代码开头的功能就像lambda_handler
,on_session_started
,{{1}等功能在结构上是一样的。
添加了一些信息以排除可能存在的问题(并表明这不是一个重复的问题):
on_launch
函数来解决这个问题。代码。我一直试图围绕这个问题绞尽脑汁 - 为什么Alexa可以注册我更简单的技能而不是我更复杂的技能,如果没有任何实质性区别于彼此的话 - 并且知道问题存在于交互模型的某个地方,但对我来说,它究竟在哪里并不明显。为了更好地衡量,这里是两种技能的交互模型:
对于简单的测试技能:
意图架构:
get_welcome_response()
相关话语:
{
"intents": [
{
"intent": "Morning"
}
]
}
更复杂的技能:
意图架构:
Morning good morning
相关话语:
{
"intents": [
{
"intent": "Welcome"
},
{
"intent": "Validate",
"slots": [
{
"name": "username",
"type": "LIST_OF_NAMES"
},
{
"name": "password",
"type": "AMAZON.NUMBER"
}
]
},
{
"intent": "Report"
}
]
}