【问题标题】:Work around for Alexa Custom Skill Reoccuring response解决 Alexa Custom Skill Reoccuring 响应
【发布时间】:2019-07-15 09:21:30
【问题描述】:

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


    【解决方案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.YesIntent, 在句柄函数中,它检查是否有任何名为“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();
      }
    };
    

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

    【讨论】:

    • @shardha,谢谢让我应用这个另外,如果可能的话,你能分享一个 Java 的 sn-p 吗?
    • @mohitsharma 抱歉,我不太了解 JAVA :)
    • 好吧,还有一个案例我有做 alexa 技能以编程方式支持 DropIn。 Alexa 1 向另一个位置的 Alexa 2 发送消息>>
    【解决方案2】:

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

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

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

    解决方案:

    1) 如果您已经询问过用户的姓名(例如“John”),请不要再询问。只需让 Alexa 说:

    Alexa:“你叫约翰,对吧?”或者“你说约翰?请确认?”

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

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

    2) 更好的获取用户名的方法是使用 Alexa 的Customer Profile Api,这样您就不必担心 Alexa 无法识别用户名,更不用说确认用户名了。

    【讨论】:

    • 感谢您的回复。我试试这个方法
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2020-05-04
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多