在Python中为Alexa技能添加会话属性
作者:互联网
我在我的意图架构中有一个Alexa技能的3个插槽(account,dollar_value,recipient_first),我想在会话属性中保存扬声器提供的任何插槽.
我使用以下方法来设置会话属性:
def create_dollar_value_attribute(dollar_value):
return {"dollar_value": dollar_value}
def create_account_attribute(account):
return {"account": account}
def create_recipient_first_attribute(recipient_first):
return {"recipient_first": recipient_first}
但是,正如您可能猜到的,如果我想在sessionAttributes中保存多个插槽作为数据,则会覆盖sessionAttributes,如下所示:
session_attributes = {}
if session.get('attributes', {}) and "recipient_first" not in session.get('attributes', {}):
recipient_first = intent['slots']['recipient_first']['value']
session_attributes = create_recipient_first_attribute(recipient_first)
if session.get('attributes', {}) and "dollar_value" not in session.get('attributes', {}):
dollar_value = intent['slots']['dollar_value']['value']
session_attributes = create_dollar_value_attribute(dollar_value)
来自我的lambda函数的JSON响应,其中提供了两个插槽(dollar_value和recipient_first)的语音输入如下(我的猜测是第二个if语句中的create_dollar_value_attribute方法覆盖了第一个):
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Some text output"
},
"card": {
"content": "SessionSpeechlet - Some text output",
"title": "SessionSpeechlet - Send Money",
"type": "Simple"
},
"reprompt": {
"outputSpeech": {
"type": "PlainText"
}
},
"shouldEndSession": false
},
"sessionAttributes": {
"dollar_value": "30"
}
}
sessionAttributes的正确响应应该是:
"sessionAttributes": {
"dollar_value": "30",
"recipient_first": "Some Name"
},
如何创建此响应?有没有更好的方法在JSON响应中向sessionAttributes添加值?
解决方法:
在我看来,用Python添加sessionAttributes的最简单方法似乎是使用字典.例如,如果要在会话属性中存储以后的某些插槽:
session['attributes']['slotKey'] = intent['slots']['slotKey']['value']
接下来,您可以将其传递给构建响应方法:
buildResponse(session['attributes'], buildSpeechletResponse(title, output, reprompt, should_end_session))
在这种情况下的实现:
def buildSpeechletResponse(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': "SessionSpeechlet - " + title,
'content': "SessionSpeechlet - " + output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}
def buildResponse(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}
这将在Lambda响应JSON中以推荐的方式创建sessionAttributes.
如果不存在,只添加新的sessionAttribute不会覆盖最后一个sessionAttribute.它只会创建一个新的键值对.
请注意,这可能在服务模拟器中运行良好,但在实际的Amazon Echo上进行测试时可能会返回键属性错误.根据这个post,
在服务模拟器上,会话以Session开始:{… Attributes:{},…}
当会话在Echo上开始时,Session根本没有Attributes键.
我解决这个问题的方法是只要在创建新会话时在lambda处理程序中手动创建它:
if event['session']['new']:
event['session']['attributes'] = {}
onSessionStarted( {'requestId': event['request']['requestId'] }, event['session'])
if event['request']['type'] == 'IntentRequest':
return onIntent(event['request'], event['session'])
标签:alexa,alexa-skill,python,json,aws-lambda 来源: https://codeday.me/bug/20191006/1858493.html