如何输入亚马逊Alexa技能套件(ASK)混合字符串与数字?

Sat*_*ish 5 amazon-web-services alexa alexa-skill alexa-skills-kit alexa-voice-service

我正在尝试创建一个亚马逊Alexa技能套件来进行某种自动化,这需要采用由字符串和数字组成的语音输入(a-test12fish).

当我在Alexa Skills Kit中使用自定义插槽时,它不会让我用数字键入字符串.当我尝试键入时ask alexa, dangerZone find a-test12fish,我收到以下错误:

错误:文本输入无效.文本应以字母开头,并且只应包含字母,空格,句点或撇号

我怎样才能克服这个错误?

Cal*_*tes 5

这是一个解决方案。

您可能不想在意图模式中完成此操作。而是尝试使用Node.js创建自定义模式,该模式将字母,数字和符号编译为单个响应。这是我对字母数字输入模式的再现。请注意:我只是为了回答您的问题而写的,而没有以更高的技能进行测试。话虽如此,我已经取得了巨大的成功,MODES如果有机会,我一定会以自己的技能实现这一目标。

这段代码背后的想法是,你把用户分为忽略比其他所有的意图一个单独的模式NumberIntentLetterIntentSymbolIntent,和一些帮助功能。用户快速输入其字母数字值,并在完成后激活CompletedIntent。然后可以在您的技能的其他地方使用该字母数字值。如果您没有使用过,Modes请注意在完成或退出时,您将被重定向回LOBBYMODE可以继续访问技能的其他意图的位置。

var lobbyHandlers = Alexa.CreateStateHandler(states.LOBBYMODE, {

    'enterPasswordIntent': function () {
      this.attributes['BUILDPASSWORD'] = '';
      this.handler.state = states.PASSWORDMODE;
      message = ` You will now create a password one letter, number or symbol at a time.  there will be no message after each entry.  simply wait for alexa's ring to become solid blue then stay your next value.  When you are satisfied say complete. Begin now by saying a number, letter, or keyboard symbol. `;
      reprompt = `Please say a number letter or symbol`;
      this.emit(':ask', message, reprompt);
    },

    //Place other useful intents for your Skill here

    'Unhandled': function() {
        console.log("UNHANDLED");
        var reprompt = ` You're kind of in the middle of something.  Say exit to end createing this password.  otherwise say complete if you've stated the whole password.  or repeat to hear the current password you've entered.  `;
        this.emit(':ask', reprompt, reprompt);
    }
});


var buildAlphaNumericPasswordHandlers = Alexa.CreateStateHandler(states.PASSWORDMODE, {
    'numberIntent': function () {// Sample Utterance: ninty nine  AMAZON.NUMBER
      var number = this.event.request.intent.slots.number.value; //I believe this returns a string of digits ex: '999'
      this.attributes['BUILDPASSWORD'] = this.attributes['BUILDPASSWORD'].concat(number);
      message = ``; //No message to make saying the next letter, number or symbol as fluid as possible.
      reprompt = `Please say the next number letter or symbol`;
      this.emit(':ask', message, reprompt);
    },
    'letterIntent': function () {// Sample Utterance: A   -- Custom Slot LETTERS [A, b, c, d, e, ... ]
      var letter = this.event.request.intent.slots.letter.value;
      this.attributes['BUILDPASSWORD'] = this.attributes['BUILDPASSWORD'].concat(letter);
      message = ``; //No message to make saying the next letter, number or symbol as fluid as possible.
      reprompt = `Please say the next number letter or symbol`;
      this.emit(':ask', message, reprompt);
    },
    'symbolIntent': function () {// Sample Utterance: Dash -- Custom Slot SYMBOLS [Pound, Dash, Dollar Sign, At, Exclamation point... ]
      var symbol = this.event.request.intent.slots.symbol.value;

      // Create a dictionary object to map words to symbols ex Dollar Sign => $.  Will need this because you likely cant put $ as a custom slot value. Can also map multiple names to the same value  ex. Dash => Tack = \> "-"
      var singleCharacterSymbol = symbolDict[symbol]; //^^^ Need to create dictionary

      this.attributes['BUILDPASSWORD'] = this.attributes['BUILDPASSWORD'].concat(singleCharacterSymbol);
      message = ``; //No message to make saying the next letter, number or symbol as fluid as possible.
      reprompt = `Please say the next number letter or symbol`;
      this.emit(':ask', message, reprompt);
    },
    'CompleteIntent': function() { //Sample Utterance: Complete
        console.log("COMPLETE");
        this.handler.state = states.LOBBYMODE;
        var reprompt = ` Your entry has been saved, used to execute another function or checked against our database. `;
        this.emit(':ask', reprompt, reprompt);
    },
    'ExitIntent': function() { //Sample Utterance: Exit
        console.log("EXIT");
        this.handler.state = states.LOBBYMODE;
        message = `You have returned to the lobby, continue with the app or say quit to exit.`;
        this.emit(':ask', message, message);
    },
    'RepeatIntent': function() {
        var currentPassword = this.attributes['BUILDPASSWORD'];
        var currentPasswordExploded  =  currentPassword.replace(/(.)(?=.)/g, "$1 "); //insert a space between each character so alexa reads correctly.
        var message = ` Your current entry is as follows. `+currentPasswordExploded;
        var reprompt = `  say complete if you've stated the whole password. Otherwise continue to say numbers letters and symbols. `;
        this.emit(':ask', reprompt, reprompt);
    },
    'Unhandled': function() {
        console.log("UNHANDLED");
        var reprompt = ` You're kind of in the middle of something.  Say exit to end creating this password, say complete if you've stated the whole password, say repeat to hear the current password you've entered, or continue to state letters, numbers and symbols  `;
        this.emit(':ask', reprompt, reprompt);
    }
});
Run Code Online (Sandbox Code Playgroud)


Jim*_*ush 1

您没有表明您希望用户如何说出该值。例如,“一次测试十二条鱼”或“一次测试一条两条鱼”。无论如何,识别系统旨在识别单词,而该数据不是有效单词。

至于解决问题,您可以尝试通过创建具有所有有效字符值和支持有效长度的示例话语的自定义槽类型来创建拼写解决方案(后一个输入)。

您将需要一些工作来重新组装消息,但它不应该太复杂。可能的挑战仍然来自识别器。虽然我还没有在 Alexa 下测试过这种情况,但我使用过的大多数情况对于可变长度的字母数字字符串的效果都相当差。这些声音太相似了,有几个值很容易被误认为是停顿和背景噪音。典型的解决方法是使用拼音字母