Выпущен Alexa Skills Kit на основе Node.js!

Node.js задняя часть JavaScript Программа перевода самородков Amazon AWS
Выпущен Alexa Skills Kit на основе Node.js!

Мы рады объявить сегодня о новом инструменте на основе Node.js, призванном помочь разработчикам быстрее и проще осваивать навыки работы с Alexa.alexa-sdkопубликовано. пройти черезAlexa Skills Kit,Node.jsAWS LambdaРазвитие навыка Alexa в настоящее время является самым популярным способом развития навыка. Управляемая событиями и неблокирующая природа Node.js делает ее идеальной для развития навыков работы с Alexa, а Node.js — одна из крупнейших систем с открытым исходным кодом в мире. Кроме того, Amazon Web Services (AWS) Lambda, предоставляющая бесплатные услуги для первого миллиона сетевых запросов в месяц, может помочь большинству разработчиков в развитии навыков. При использовании AWS Lambda вам не нужно беспокоиться об управлении какими-либо SSL-сертификатами (поскольку Alexa Skills Kit является доверенным триггером AWS).

Добавление Node.js и Alexa Skills Kit — это простой процесс при создании навыка Alexa с помощью AWS Lambda, но код, который вам на самом деле нужно написать, намного сложнее. Мы поняли, что большая часть нашего времени на разработку навыков уходит на работу со свойствами сеанса, постоянством состояния навыков, созданием ответов и моделями поведения. Итак, команда Alexa приступила к разработке Alexa Skills Kit SDK на основе Node.js, чтобы помочь вам избежать этих распространенных неприятностей и сосредоточиться на разработке собственной логики вашего навыка, а не шаблонного кодирования.

Ускорьте разработку Alexa Skill с помощью Alexa Skills Kit на основе Node.js (alexa-sdk).

Наша цель с alexa-sdk — помочь вам быстрее развивать навыки, избегая ненужной сложности. Последняя версия SDK, которую мы выпускаем сегодня, имеет следующие функции:

  • Новый SDK представляет собой управляемый пакет NPM, упрощающий разработку в любой среде Node.js.
  • Ответы Alexa можно создавать из встроенных событий.
  • Встроенные вспомогательные события для новых сеансов и добавленные необработанные события для перехвата всех исключений.
  • Предоставляет вспомогательную функцию, которая может создавать обработку намерений пользователя на основе конечного автомата.
  • Это позволяет определять различные менеджеры событий на основе текущего состояния навыка.
  • Упрощенная настройка сохраняемости атрибутов с помощью Amazon DynamoDB
  • Вся выходная речь будет автоматически инкапсулирована в SSML.
  • События Lambda и объекты контекста будут считываться с помощью this.event, а встроенные функции могут быть переопределены с помощью this.contextAbility , что дает вам больше гибкости в управлении состоянием и создании ответов. Например, хранить свойства состояния на AWS S3.

Установите и отладьте Alexa Skills Kit на основе Node.js (alexa-sdk)

alexa-sdk был загружен вgithub, и его можно установить в вашей среде Node.js как пакет узла с помощью следующей команды:

npm install --save alexa-sdk

Чтобы начать использовать alexa-sdk, вам нужно сначала импортировать его библиотеку. Вам просто нужно просто создать файл с именем index.js в вашем проекте и добавить следующий код:

var Alexa = require('alexa-sdk');

exports.handler = function(event, context, callback){

    var alexa = Alexa.handler(event, context);

};

Эти несколько строк кода импортируют alexa sdk и создают объект alexa для последующего использования. Далее нам нужно обработать намерение ️, которое взаимодействует с навыком. К счастью, alexa-sdk позволяет легко активировать функцию по нашему желанию. Например, чтобы создать диспетчер событий для «HelloWorldIntent», нам просто нужно реализовать следующий код:

var handlers = {

    'HelloWorldIntent': function () {

        this.emit(':tell', 'Hello World!');

                  }

};

Обратите внимание на наличие нового синтаксического правила «:tell» выше? -skills-kit/docs/alexa-skills-kit-interface-reference#Формат ответа). Если мы хотим задать пользователю вопросы, нам нужно изменить приведенный выше код на:

this.emit(‘:ask’, ’What would you like to do?’, ’Please say that again?’);

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

var speechOutput = 'Hello world!';

var repromptSpeech = 'Hello again!';

this.emit(':tell', speechOutput);

this.emit(':ask', speechOutput, repromptSpeech);

var cardTitle = 'Hello World Card';

var cardContent = 'This text will be displayed in the companion app card.';

var imageObj = {

    smallImageUrl: 'https://imgs.xkcd.com/comics/standards.png',

    largeImageUrl: 'https://imgs.xkcd.com/comics/standards.png'

};

this.emit(':askWithCard', speechOutput, repromptSpeech, cardTitle, cardContent, imageObj);

this.emit(':tellWithCard', speechOutput, cardTitle, cardContent, imageObj);

this.emit(':tellWithLinkAccountCard', speechOutput);

this.emit(':askWithLinkAccountCard', speechOutput);

this.emit(':responseReady'); // 在回复创建之后,返回 Alexa 服务之前被调用。Calls :saveState。

this.emit(':saveState', false); // 事件管理器将 this.attributes 的内容和当前管理器的状态存储到 DynamoDB,然后将之前内置的回复发送到 Alexa 服务。如果你想用别的方式处理持久化状态,可以重写它。其中的第二个属性是可选的并且可以通过将它设置为 ‘true’ 以强制储存。

this.emit(':saveStateError'); // 在存储状态的过程出错时被调用。如果你想自己处理异常的话,可以重写它。

После того, как мы создали обработчики событий, в сценарии нового сеанса (NewSession) нам нужно использовать функцию registerHandlers в ранее созданном объекте Alexa для регистрации этих обработчиков.

exports.handler = function(event, context, callback){

    var alexa = Alexa.handler(event, context);

    alexa.registerHandlers(handlers);

};

Вы также можете зарегистрировать несколько менеджеров событий одновременно. Вместо создания одного объекта менеджера мы создаем новый сеанс с множеством разных менеджеров, обрабатывающих разные события, и мы можем зарегистрировать их одновременно с помощью следующего кода:

    alexa.registerHandlers(handlers, handlers2, handlers3, ...);

Определяемые вами менеджеры событий могут звонить друг другу, чтобы обеспечить единообразие ответов вашего навыка. Ниже приведен пример того, как LaunchRequest и IntentRequest (в HelloWorldIntent) возвращают сообщение «Hello World».

var handlers = {

    'LaunchRequest': function () {

        this.emit('HelloWorldIntent');

    },

    'HelloWorldIntent': function () {

        this.emit(':tell', 'Hello World!');

};

После того, как вы зарегистрировали все функции диспетчера намерений, вы просто запускаете логику навыка, используя функцию выполнения в объекте alexa. Последняя строка кода такова:

exports.handler = function(event, context, callback){

    var alexa = Alexa.handler(event, context);

    alexa.registerHandlers(handlers);

    alexa.execute();

};

Вы можете скачать полный пример с github. Мы также предоставляем последние примеры навыков на основе Node.js и alexa-sdk:Fact,HelloWorld,HighLow,HowToиTrivia.

Упростите управление состоянием навыка

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

Например, давайте создадим простую игру на угадывание чисел с двумя состояниями «начало» и «угадай число» на основе предыдущего примера управления новыми событиями сеанса.

var states = {
    GUESSMODE: '_GUESSMODE', // User is trying to guess the number.
    STARTMODE: '_STARTMODE'  // Prompt the user to start or restart the game.
};

var newSessionHandlers = {

 // 以下代码将会切断任何即将输入的 intent 或者启动请求,并且把它们都传送给这个管理器。

  'NewSession': function() {

    this.handler.state = states.STARTMODE;

    this.emit(':ask', 'Welcome to The Number Game. Would you like to play?.');

   }

 };

Обратите внимание, что при создании нового сеанса мы просто устанавливаем состояние навыка в STARTMODE через this.handler.state. На этом этапе состояние навыка будет автоматически сохраняться в свойствах сеанса.Если вы настроили таблицу в DynamoDB, вы можете сохранить ее в каждом сеансе.

Стоит отметить, что NewSession — отличный менеджер для фиксации различных поведений и отличный ввод навыков, но это не обязательно. NewSession будет разбужен только в функции, названной в его честь. Каждое определяемое вами состояние может иметь собственный диспетчер NewSession, который пробуждается, когда вы используете встроенную сохраняемость. В приведенном выше примере у нас больше гибкости, чтобы определить различное поведение NewSession для состояний.STARTMODE и States.GUESSMODE.

Чтобы определить намерения, которые реагируют на различные состояния навыка, нам нужно использовать функцию Alexa.CreateStateHandler. Любой менеджер намерений, определенный здесь, будет работать только в определенном состоянии, что делает наши операции разработки более гибкими!

Например, если бы мы находились в состоянии GUESSMODE, определенном выше, мы хотели бы обработать ответ пользователя на вопрос. Это может быть достигнуто с помощью StateHandlers следующим образом:

var guessModeHandlers = Alexa.CreateStateHandler(states.GUESSMODE, {

    'NewSession': function () {

        this.handler.state = '';

        this.emitWithState('NewSession'); // 等同于 Start Mode 下的 NewSession handler

    },

    'NumberGuessIntent': function() {

        var guessNum = parseInt(this.event.request.intent.slots.number.value);

        var targetNum = this.attributes["guessNumber"];

        console.log('user guessed: ' + guessNum);



        if(guessNum > targetNum){

            this.emit('TooHigh', guessNum);

        } else if( guessNum < targetNum){

            this.emit('TooLow', guessNum);

        } else if (guessNum === targetNum){

            // 通过一个 callback 函数,用 arrow 函数储存正确的 ‘this’ context

            this.emit('JustRight', () => {

                this.emit(':ask', guessNum.toString() + 'is correct! Would you like to play a new game?',

                'Say yes to start a new game, or no to end the game.');

        })

        } else {

            this.emit('NotANum');

        }

    },

    'AMAZON.HelpIntent': function() {

        this.emit(':ask', 'I am thinking of a number between zero and one hundred, try to guess and I will tell you' +

            ' if it is higher or lower.', 'Try saying a number.');

    },

    'SessionEndedRequest': function () {

        console.log('session ended!');

        this.attributes['endedSessionCount'] += 1;

        this.emit(':saveState', true);

    },

    'Unhandled': function() {

        this.emit(':ask', 'Sorry, I didn\'t get that. Try saying a number.', 'Try saying a number.');

    }

});

С другой стороны, если мы находимся в состоянии STARTMODE, я могу определить StateHandler следующим образом:

var startGameHandlers = Alexa.CreateStateHandler(states.STARTMODE, {

    'NewSession': function () {

        this.emit('NewSession'); // 在 newSessionHandlers 使用管理器

    },

    'AMAZON.HelpIntent': function() {

        var message = 'I will think of a number between zero and one hundred, try to guess and I will tell you if it' +

            ' is higher or lower. Do you want to start the game?';

        this.emit(':ask', message, message);

    },

    'AMAZON.YesIntent': function() {

        this.attributes["guessNumber"] = Math.floor(Math.random() * 100);

        this.handler.state = states.GUESSMODE;

        this.emit(':ask', 'Great! ' + 'Try saying a number to start the game.', 'Try saying a number.');

    },

    'AMAZON.NoIntent': function() {

        this.emit(':tell', 'Ok, see you next time!');

    },

    'SessionEndedRequest': function () {

        console.log('session ended!');

        this.attributes['endedSessionCount'] += 1;

        this.emit(':saveState', true);

    },

    'Unhandled': function() {

        var message = 'Say yes to continue, or no to end the game.';

        this.emit(':ask', message, message);

    }

Мы видим, что AMAZON.YesIntent и AMAZON.NoIntent не определены в объекте guessModeHandlers, потому что ответ «да» или «нет» не имеет смысла для этого состояния. Такие ответы будут перехвачены менеджером «Необработанные».

Также обратите внимание на различное поведение в состояниях NewSession и Unhandled. В этой игре мы «сбрасываем» состояние навыка, вызывая диспетчер NewSession в объекте newSessionHandlers. Вы также можете пропустить этот шаг, и alexa-sdk вызовет диспетчер намерений для текущего состояния. Вам просто нужно не забыть зарегистрировать своих менеджеров состояний перед вызовом alexa.execute() , иначе они не будут найдены.

Все свойства будут сохранены автоматически, когда ваш навык завершит сеанс, но если пользователь сам завершит текущий сеанс, вам нужно создать событие ':saveState' ( this.emit(':saveState', true ), чтобы принудительно сохранить эти Вы должны сделать это в диспетчере SessionEndedRequest, потому что диспетчер SessionEndedRequest будет вызываться, когда пользователь завершает текущий сеанс с «выходом» или тайм-аутом ответа. Вы можете увидеть пример кода выше.

Мы написали приведенный выше пример в игре на угадывание больших и малых чисел, вы можете нажатьСкачать здесь.

Сохранение свойств навыка через Amazon DynamoDB

Многим нравится хранить значения атрибутов сеанса в базе данных для последующего использования. alexa-sdk напрямую объединяетAmazon DynamoDB(служба базы данных NoSQL) позволяет реализовать хранилище свойств всего несколькими строками кода.

Просто задайте имя таблицы DynamoDB в объекте alexa, прежде чем вызывать alexa.execute.

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.appId = appId;
    alexa.dynamoDBTableName = ’YourTableName'; // That’s it!
    alexa.registerHandlers(State1Handlers, State2Handlers);
    alexa.execute();
};

После этого вам просто нужно вызвать атрибуты объекта Alexa, чтобы установить значение для вашего атрибута. Для отдельных функций больше не требуется ввода!

this.attributes[”yourAttribute"] = ’value’;

вы можете продвинутьсяСоздать таблицу вручнуюИли предоставьте DynamoDB для вашей лямбда-функции.Разрешение на создание таблицыДальше все генерируется автоматически. Однако имейте в виду, что создание формы может занять несколько минут, когда вы в первый раз активируете навык.

Попробуйте расширить игру на угадывание чисел:

  • Пусть он хранит среднее количество ваших догадок за игру
  • Присоединяйсязвуковой эффект
  • Дайте игрокам ограниченное время, чтобы угадать числа

Для получения дополнительной информации об обучении разработке с помощью Alexa Skills Kit перейдите по ссылкам ниже:

Alexa Skills Kit на основе Node.js
Подкаст разработчиков Alexa
Тренинг по развитию Alexa
Введение в Alexa Skills
101 Руководство по дизайну голосового взаимодействия
Alexa Skills Kit (ASK)
Форум разработчиков Alexa

-Dave (@TheDaveDev)

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.