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
}