Alexa 跳过插槽或以编程方式设置它?
Alexa skip slot or set it programmatically?
我正在研究一项 Alexa 技能,它基本上是一个测验,其中 Alexa 连续询问用户多个问题,主题根据存储在发电机 table 中的用户状态而变化。这行得通。我完成此任务的目的是为每个答案设置一个插槽,并且我使用对话管理来引发每个响应,直到它们全部填满。这是一些代码:
if(!answers.NewWordSpanishAnswer) {
const newWordIntroAudio = sound('intro');
const promptAudio = sound(`new-word-${word}-spanish-intro`);
return handlerInput.responseBuilder
.speak(newWordIntroAudio + promptAudio)
.reprompt(promptAudio)
.addElicitSlotDirective('NewWordSpanishAnswer')
.getResponse();
}
if(!answers.NewWordEnglishAnswer) {
const responseAudio = sound(`new-word-${word}-spanish-correct`);
const promptAudio = sound(`new-word-${word}-english-intro`);
return handlerInput.responseBuilder
.speak(responseAudio + promptAudio)
.reprompt(promptAudio)
.addElicitSlotDirective('NewWordEnglishAnswer')
.getResponse();
}
// etc. repeat for each question
问题是我需要创建一个需要可变数量问题的测验,但槽是在模型中定义的,所以我无法更改完成意图所需的答案数量。我认为这样做的方法是提供任意数量的 answer
插槽并将默认值分配给我不需要的插槽(所以如果测验有 3 个问题,但有 5 个插槽,最后 2 个插槽将被分配占位符值)。
我怎样才能做到这一点?有没有办法以编程方式设置插槽值?
This Alexa blog post 似乎描述了我需要的东西,但不幸的是它是使用 ASK SDK v1 编写的,所以我不确定如何使用 v2 来完成它。
是的,可以跳过 1 个或多个槽值。
我可以想出两种方法来解决你的问题。
1) 使用 addDelegateDirective 而不是 addElicitSlotDirective 来收集槽值并用一些任意值填充不需要的槽当 dialogState 为“STARTED”时,如以下代码片段。
const { request } = handlerInput.requestEnvelope;
const { intent } = request;
if (request.dialogState === 'STARTED') {
intent.slots.slotToSkip.value = 'skipped'
return handlerInput.responseBuilder
.addDelegateDirective(intent)
.withShouldEndSession(false)
.getResponse()
}
2) 在第二个解决方案中,您可以使用会话变量来跟踪要引出的槽数。喜欢
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
sessionAttributes.count = 3 //Suppose you want to elicit 3 slots;
handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
if (sessionAttributes.count >= 0)
{
//addElecitSlotDirective
sessionAttributes.count = sessionAttributes.count--;
handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
}
else{
//here you will get the required number of slots
}
我正在研究一项 Alexa 技能,它基本上是一个测验,其中 Alexa 连续询问用户多个问题,主题根据存储在发电机 table 中的用户状态而变化。这行得通。我完成此任务的目的是为每个答案设置一个插槽,并且我使用对话管理来引发每个响应,直到它们全部填满。这是一些代码:
if(!answers.NewWordSpanishAnswer) {
const newWordIntroAudio = sound('intro');
const promptAudio = sound(`new-word-${word}-spanish-intro`);
return handlerInput.responseBuilder
.speak(newWordIntroAudio + promptAudio)
.reprompt(promptAudio)
.addElicitSlotDirective('NewWordSpanishAnswer')
.getResponse();
}
if(!answers.NewWordEnglishAnswer) {
const responseAudio = sound(`new-word-${word}-spanish-correct`);
const promptAudio = sound(`new-word-${word}-english-intro`);
return handlerInput.responseBuilder
.speak(responseAudio + promptAudio)
.reprompt(promptAudio)
.addElicitSlotDirective('NewWordEnglishAnswer')
.getResponse();
}
// etc. repeat for each question
问题是我需要创建一个需要可变数量问题的测验,但槽是在模型中定义的,所以我无法更改完成意图所需的答案数量。我认为这样做的方法是提供任意数量的 answer
插槽并将默认值分配给我不需要的插槽(所以如果测验有 3 个问题,但有 5 个插槽,最后 2 个插槽将被分配占位符值)。
我怎样才能做到这一点?有没有办法以编程方式设置插槽值?
This Alexa blog post 似乎描述了我需要的东西,但不幸的是它是使用 ASK SDK v1 编写的,所以我不确定如何使用 v2 来完成它。
是的,可以跳过 1 个或多个槽值。
我可以想出两种方法来解决你的问题。
1) 使用 addDelegateDirective 而不是 addElicitSlotDirective 来收集槽值并用一些任意值填充不需要的槽当 dialogState 为“STARTED”时,如以下代码片段。
const { request } = handlerInput.requestEnvelope;
const { intent } = request;
if (request.dialogState === 'STARTED') {
intent.slots.slotToSkip.value = 'skipped'
return handlerInput.responseBuilder
.addDelegateDirective(intent)
.withShouldEndSession(false)
.getResponse()
}
2) 在第二个解决方案中,您可以使用会话变量来跟踪要引出的槽数。喜欢
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
sessionAttributes.count = 3 //Suppose you want to elicit 3 slots;
handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
if (sessionAttributes.count >= 0)
{
//addElecitSlotDirective
sessionAttributes.count = sessionAttributes.count--;
handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
}
else{
//here you will get the required number of slots
}