向Alexa提供一个数字列表

时间:2017-08-02 21:45:10

标签: alexa-skills-kit alexa-skill alexa-voice-service

我想创建一个从用户那里获取6个号码的彩票技能。 我目前正在通过样本和开发人员指南学习,我可以浏览指南并获得一项工作技能,这将需要一个输入,然后结束会话。但我相信我需要以某种方式创建一个对话框,这就是我被困住的地方。

设计明智,我喜欢这样的对话: Alexa:请提供第一个号码 用户:1 Alexa:现在第二个...... 用户:2 等等

但我认为如果它是这样的话会好的: Alexa:请拨打6个号码 用户:1,2,3,4,5,6。

这甚至可能吗?我是否必须创建一个名为" Numbers"然后输入数字,例如1-50或任何限制?

充其量,我现在可以让它要求一个号码,所以它真的是我坚持的对话互动。有没有人做过这样的事情?

感谢。

2 个答案:

答案 0 :(得分:1)

对这两个问题都是肯定的。您可以将响应与6个不同的自定义插槽串在一起。 "用户:我的号码是{num1},{num2},{num3},{num4},{num5},{num6}"并使用技能测试开发人员完成所有这些操作。但是,如果用户没有恰当地说出他们的答案而且Alexa必须提出后续问题来获取每个号码,那将是一个相当糟糕的用户体验。您遇到的最后一个问题是,虽然自定义插槽可以定义为包含数字1-50,但alexa通常会识别与自定义插槽中提供的值类似的值,例如50-99之间的数字。然后由您来检查您收到的值是否在1到50之间。如果不是,您想要求用户在适当的范围内提供不同的数字。

结论:您希望在用户一次提供单个号码时进行单独的互动。

Alexa:"you will be prompted for 6 numbers between 1 and 50 please state them one at a time. Choose your first number."
User:"50"
Alexa:"Your First number is 50, Next number."...

您可以使用单一意图实现此目的。让我们说出意图GetNumberIntent的名字。 GetNumberIntent将具有

行的样本uterances
{number}
pick {number}
choose {number}

其中{number}是自定义广告位类型,或者只是AMAZON.NUMBER。然后由您来检查该数字是否在1到50之间。

我使用SDK在Node.js中编程。您的实施可能会因您的语言选择而异。

我要做的是定义6个不同的状态处理程序。每个处理程序都应该有GetNumberIntent。如果插槽值是适当的,则返回GetNumberIntent,将值存储到会话数据和/或dynamodb,然后前进到下一个状态。如果槽值无效,则保持例如状态" NumberInputFiveStateHandlers"直到收到一个好的值,然后将状态更改为下一个" NumberInputSixStateHandlers"

var NumberInputFiveStateHandlers = Alexa.CreateStateHandler(states.NUMFIVEMODE, {
    'NewSession': function () {
        this.emit('NewSession'); // Uses the handler in newSessionHandlers
    },
    //Primary Intents
    'GetNumberIntent': function () {
      let message = ` `;
      let reprompt = ` `;
      let slotValue = this.event.request.intent.slots.number.value;
      if(parseInt(slotValue) >= 1 && parseInt(slotValue) <= 50){
          this.handler.state = states.NUMSIXMODE;
          this.attributes['NUMBERFIVE'] = this.event.request.intent.slots.number.value;
          message = ` Your fifth number is `+slotValue+`. please select your sixth value. `;
          reprompt = ` please select your sixth value. `;
      }else{
          message = ` The number `+slotValue)+` is not in the desired range between 1 and 50. please select a valid fifth number. `;
          reprompt = ` please select your fifth value. `;
      }
      this.emit(':ask',message,reprompt);
    },
    //Help Intents
    "InformationIntent": function() {
      console.log("INFORMATION");
      var message = ` You've been asked to choose a lottery number between 1 and 50. Please say your selection.`;
      this.emit(':ask', message, message);
    },
    "AMAZON.StopIntent": function() {
      console.log("STOPINTENT");
      this.emit(':tell', "Goodbye!");
    },
    "AMAZON.CancelIntent": function() {
      console.log("CANCELINTENT");
      this.emit(':tell', "Goodbye!");
    },
    'AMAZON.HelpIntent': function() {
        var message = `You're playing lottery. you'll be picking six numbers to play the game.  For help with your current situation say Information.  otherwise you may exit the game by saying quit.`;
        this.emit(':ask', message, message);
    },
    //Unhandled
    'Unhandled': function() {
        console.log("UNHANDLED");
        var reprompt = ' That was not an appropriate response. Please say a number between 1 and 50.';
        this.emit(':ask', reprompt, reprompt);
    }
});

这是第五个请求的示例。你将有6个相同的状态,就像这个状态背靠背一样。最终,您将获得6个会话值。

this.attributes['NUMBERONE']
this.attributes['NUMBERTWO']
this.attributes['NUMBERTHREE']
this.attributes['NUMBERFOUR']
this.attributes['NUMBERFIVE']
this.attributes['NUMBERSIX']

然后,您可以将这些值用于游戏。

如果您还没有使用alexa-sdk,则必须记住注册状态处理程序并将模式添加到states变量。

alexa.registerHandlers(newSessionHandlers, NumberInputOneStateHandlers, ... NumberInputSixStateHandlers); 

var states = {
    NUMONEMODE:    '_NUMONEMODE',
    ...
    ...
    NUMSIXMODE:    '_NUMSIXMODE',
}

此答案并非旨在涵盖使用Alexas-SDK进行编码的基础知识。还有其他资源可以针对该主题提出更具体的问题。

或者,因为你的意图是相同的[GetNumberIntent],你可以使用一个StateHandler来将新的有效数字推送到数组上,直到数组达到所需的长度。这只需要Intent Handler中的更多逻辑,并且一旦数组的长度为6,就会有条件断开状态。 首先尝试上面的代码,因为它更容易看到不同的状态。

答案 1 :(得分:0)

我喜欢Caleb的回答。此外,如果您提供有关错误的反馈(例如输入不是数字),并尝试考虑用户的其他响应,例如“我不知道”或“给我一个”,它可以提供更好的用户体验例如“或”我能说什么“。