Alexa跳过插槽还是以编程方式设置?

时间:2018-12-05 22:28:34

标签: javascript node.js alexa alexa-skills-kit alexa-skill

我正在研究一项Alexa技能,该技能基本上是一个测验,其中Alexa连续询问用户多个问题,主题随发电机表中存储的用户状态而变化。这可行。我的目的是为每个答案提供一个插槽,并且使用对话框管理来引发每个响应,直到所有答案都被填满。这是一些代码:

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 个答案:

答案 0 :(得分:1)

是的,可以跳过1个或多个广告位值。

我可以想到两种解决您的问题的方法。

1)使用 addDelegateDirective 而不是 addElicitSlotDirective 来收集插槽值,并在 dialogState 时用一些任意值填充不需要的插槽>是“ 开始”,类似于以下代码段。

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
}