解决Alexa Custom Skill Reoccuring响应问题

问题描述 投票:1回答:2

我正在构建一个自定义的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。

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

java aws-lambda alexa alexa-skills-kit alexa-skill
2个回答
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();
  }
};

现在,启用/添加两个BuiltIn意图,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.YesIntent,在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();
  }
};

因此,您可以使用“状态”来识别用户响应的场景,然后提供正确的响应。


1
投票

恐怕不可能让Alexa每隔10秒询问一次问题,直到用户确认。

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

confirmSlotDirective或Alexa中的任何确认指令都与仅同意或不同意确认消息的单词一起使用。例如是/否

解:

1)如果您已经询问了用户的姓名(例如“John”),请不要再问它。简单地让Alexa说:

Alexa:“你的名字叫John,对吧?”或者“你说约翰?请确认一下?”

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.