Предоставьте список номеров в Alexa

Я хочу создать навык лотереи, который берет от пользователя 6 чисел. В настоящее время я учусь, просматривая образцы и руководства для разработчиков, и я могу просмотреть руководства и получить рабочий навык, который потребует одного ввода, а затем завершит сеанс. Но я считаю, что мне нужно как-то создать диалог, и именно здесь я застрял.

С точки зрения дизайна, я бы хотел, чтобы диалог выглядел так: Alexa: Пожалуйста, укажите первое число User: 1 Alexa: а теперь второе ... User: 2 и т. Д. И т. Д.

Но я думаю, что было бы нормально, если бы это было так: Алекса: Набери 6 номеров. Пользователь: 1, 2, 3, 4, 5, 6.

Это вообще возможно? Придется ли мне создавать пользовательский тип слота под названием «Числа», а затем вводить числа, например, 1-50 или любой другой лимит?

В лучшем случае я могу заставить его запросить один номер, так что это действительно диалоговое взаимодействие, на котором я застрял. Кто-нибудь когда-нибудь делал что-нибудь подобное?

Спасибо.


person eoinzy    schedule 02.08.2017    source источник


Ответы (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 будет содержать образцы высказываний по строке

{number}
pick {number}
choose {number}

где {number} - это произвольный тип слота или просто AMAZON.NUMBER. Затем вам нужно будет проверить, находится ли это число от 1 до 50.

Я программирую на Node.js с помощью SDK. Ваша реализация может отличаться в зависимости от вашего выбора языка.

Что бы я сделал, так это определил 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, который помещает новые допустимые числа в массив, пока массив не достигнет желаемой длины. Для этого просто потребовалось бы больше логики внутри обработчика намерений и условия для выхода из состояния, когда массив имеет длину 6. Сначала попробуйте приведенный выше код, потому что так легче увидеть различные состояния.

person Caleb Gates    schedule 03.08.2017
comment
Не могли бы вы просто сделать {номер} {номер} {номер} {номер} {номер} {номер}? Я использовал то же самое для списка случайных слов. Таким образом, он отправляет только одно намерение после того, как пользователь сказал 6 слов. Затем вы просто убедитесь, что все они находятся в том диапазоне, который вы ищете. - person ialexander; 01.01.2018