解决Alexa自定义技能重现响应

时间:2019-02-21 12:48:15

标签: java aws-lambda alexa alexa-skills-kit alexa-skill

我正在建立自定义的Alexa技能 我可以在其中询问用户名并重复输入。 (工作正常)。 现在,下一部分是确认用户名称。

Alexa: "Please confirm your name!"<br>
User:"-"

Alexa: "Please confirm your name!"<br>
User: "No"

Alexa: "Please confirm your name!"<br>
**User: "Yes I confirm"**  
End.

现在,我正在尝试实现上述行为,因为 Alexa应每10秒钟提示一次"Please confirm your name!",直到用户回复

"Yes, I confirm".

我已经检查了API文档,但找不到与此案例相关的任何Intent。

请分享一些信息或解决方案。

2 个答案:

答案 0 :(得分:1)

恐怕要等到用户确认后,Alexa才能每10秒问一次问题。

我想您正在使用 confirmSlotDirective 来确认用户名称。

confirmSlotDirective 或仅Alexa中的任何确认指令都可以使用仅同意不同意的词。例如是/否

解决方案:

1 )如果您已经要求输入用户名(例如“ John”),则无需再询问。只需让Alexa说:

Alexa :“你叫约翰,对吗?”还是“你说约翰?请确认吗?”

用户:可以说是/否来确认。

注意:Alexa仅识别有限的国际名称。

2 )获得用户名的更好方法是使用Alexa的Customer Profile Api,因此您不必担心Alexa无法识别名称,更不用说确认用户名了。

答案 1 :(得分:1)

当用户没有响应时每10秒重复一次,不确定我们是否可以这样做。

但是我们可以实现是/否部分。一种方法是使用状态。在此示例中,我使用node-cache模块进行状态管理。

请考虑以下名为“ ConfirmationQuestionIntent”的意图。它将状态设置为“确认名称”。

const ConfirmationQuestionIntentHandler = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "ConfirmationQuestionIntent"
    );
  },
  handle(handlerInput) {
    const speechText = "Please confirm your name as 'John'.";
    myCache.set('state','confirm-name');
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

现在,启用/添加两个内置意图,即AMAZON.YesIntent和AMAZON.NoIntent。 考虑下面的AMAZON.NoIntent, 在处理函数中。它检查是否存在名称为“ confirm-name”的状态。如果存在,它将以“请确认您的姓名为'John'的形式答复”。如果没有,则使用默认响应进行响应。

const NoBuiltInIntent = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "AMAZON.NoIntent"
    );
  },

  handle(handlerInput) {
    const state = myCache.get("state");
    let speechText = "I didn't get this!. Could you please rephrase.";
    if(state === "confirm-name") speechText = "Please confirm your name as 'John'.";
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

请考虑AMAZON。是的,下面是 在handle函数中,它检查是否存在任何名为“ confirm-name”的状态。如果是,则它以“感谢确认”进行响应,并从缓存中删除状态。如果没有,它将要求用户重新措辞。

const YesBuiltInIntent = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "AMAZON.YesIntent"
    );
  },

  handle(handlerInput) {
    const state = myCache.get("state");
    let speechText = "I didn't get this!. Could you please rephrase.";
    if(state === "confirm-name") speechText = "Thanks for the confirmation.";
    myCache.del('state');
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

因此,您可以使用“状态”来识别用户在哪种情况下做出响应,然后提供正确的响应。