Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to give input to Amazon Alexa Skills Kit (ASK) mixed string with numbers?

Tags:

I'm trying to create a Amazon Alexa Skills Kit to do some kind of automation which would be required to take speech input comprised of strings and numbers (a-test12fish).

When I've used custom slots in Alexa Skills Kit, it is not letting me key in strings with numbers. When I try to key in ask alexa, dangerZone find a-test12fish, I'm getting the following error:

Error: Invalid text input. Text should begin with alphabets and should only contain alphabets, whitespaces, periods or apostrophes

How can I overcome this error?

like image 327
Sathish Avatar asked Mar 17 '16 13:03

Sathish


People also ask

Can you code your own Alexa skill?

Amazon's Alexa Skill Blueprints program lets you create your own Alexa skills. Here's how to do it. In an effort to make its voice assistant even more personal, Amazon now lets users create their own Alexa skills.

What programming language does Alexa Skills use?

If you choose the Alexa-hosted skill option, you write your code in Node.js and Python.

How do I get Alexa Skills without coding?

Voiceflow makes it easy to build Alexa skills without coding, and is free to get started. The best part about Voiceflow is it's easy to get started, but as powerful as custom code once you get the hang of it — without needing to code. Once you sign-up, you'll be asked a few quick questions.


2 Answers

Here's a solution.

You probably don't want to complete this in the intent schema. Instead try creating a custom mode withing Node.js that compiles letters, numbers and symbols into a single response. This is my rendition of an alpha numeric input Mode. Please Note: I just wrote this in response to your question and have not tested it in a larger skill. With that said I've had great success with MODES and will certainly implement this in my own skill when I have a chance.

The idea behind this code is that you push users into a seperate Mode that ignores all intents other than NumberIntent, LetterIntent, SymbolIntent, and a few help features. The user quickly enters their alpha numeric value and upon completion activates the CompletedIntent. That alphanumeric value can then be used elsewhere in your skill. If you have not used Modes note that on completion or exit you will be redirected back to LOBBYMODE where you can continue to access other intents in your skill.

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);
    }
});
like image 172
Caleb Gates Avatar answered Dec 31 '22 22:12

Caleb Gates


You didn't indicate how you intended the user to say the value. For example, "a dash test twelve fish" or "a dash t e s t one two f i s h." In any case, the recognition system is designed to recognize words and that data isn't a valid word.

As for solving the problem, you could try creating a spelling solution (the latter input) by creating a custom slot type with all valid character values and sample utterances the support the valid lengths.

You will have some work to reassemble the message, but it shouldn't be too complicated. The likely challenge will still be from the recognizer. While I haven't tested this scenario under Alexa, most I've used do rather poorly with variable length, alpha numeric strings. The sounds are just too similar and there are several values that could easily be mistaken for pauses and background noises. The typical work around is to use a phonetic alphabet.

like image 36
Jim Rush Avatar answered Dec 31 '22 22:12

Jim Rush