Рубрики
Без рубрики

Создать Alexa Skill Part 3: Написание функции лямбда

Узнайте, как написать лямбда-функцию для Alexa Skill в JavaScript!

Автор оригинала: Kathryn Hodge.

Что такое умение Алекса?

Создано в 2014 году, Echo Amazon – это громкий динамик, который вы управляете своим голосом. Alexa – это голосовая служба, которая способствует эхо и позволяет клиентам взаимодействовать с устройством. В качестве сторонних разработчиков мы можем создавать приложения или, в данном случае «навыки», с которыми пользователи могут загружать и взаимодействовать. Умение Alexa может помочь вам найти хорошую книгу, в то время как другой может дать вам информацию о вашем любимом телешоу. Возможности безграничны!

Последний раз…

В последних двух учебниках мы сделали навык, который дает факты о данном знаке зодиака. Например, если вы сказали Эхо, «расскажи мне о LeoS», «Эхо будет отвечать бы с« LeoS, как известно, гордыми, лояльными, харизматичными и стильными »или что-то в этом роде. Вы также можете сказать: «Расскажи мне о Virgos», и эхо будет реагировать на факт о людях с знаком Девы. Прежде чем мы прыгнули в функциональную сторону приложения, мы создали модель голосового интерфейса и модели взаимодействия и настроить нашу учетную запись AWS и функцию Lambda для навыка. Если вы еще не запустили голосовой интерфейс, ознакомьтесь с этим руководством, и если вы не настроили свою учетную запись AWS и функцию Lambda на облаке, ознакомьтесь с этим руководством.

Написание кода

Прежде чем написать код для этого навыка, давайте посмотрим на это JavaScript Шаблон для записи лямбда-функции для навыка Alexa. Первая часть шаблона будет Проложите входящий запрос на основе своего типа Отказ Тип будет либо будет Maintrequest , Intentrequest или Сессионная обработкаrequest И эта функция будет запущена всякий раз, когда мы взаимодействуем с Alexa. Параметр события будет иметь всю необходимую информацию о данном запросе.

exports.handler = function (event, context) {
    try {
        if (event.session.new) {
            onSessionStarted({requestId: event.request.requestId}, event.session);
        }

        if (event.request.type === "LaunchRequest") {
            onLaunch(event.request,
                event.session,
                function callback(sessionAttributes, speechletResponse) {
                    context.succeed(buildResponse(sessionAttributes, speechletResponse));
                });
        } else if (event.request.type === "IntentRequest") {
            onIntent(event.request,
                event.session,
                function callback(sessionAttributes, speechletResponse) {
                    context.succeed(buildResponse(sessionAttributes, speechletResponse));
                });
        } else if (event.request.type === "SessionEndedRequest") {
            onSessionEnded(event.request, event.session);
            context.succeed();
        }
    } catch (e) {
        context.fail("Exception: " + e);
    }
};

На данный момент мы поместим этот код в файл с именем index.js Отказ Не стесняйтесь использовать Sublime, Atom, или любой другой редактор простого текста, с которым вы хотите написать этот код. Далее мы напишем Руководство по эксплуатации , Onlaunch , DineNent и Особняк Функции, которые наша Экспорт. Хандлер звонки.

/** Called when the session starts */
function onSessionStarted(sessionStartedRequest, session) {
    // add any session init logic here
}

/** Called when the user invokes the skill without specifying what they want. */
function onLaunch(launchRequest, session, callback) {

}

/** Called when the user specifies an intent for this skill. */
function onIntent(intentRequest, session, callback) {

    var intent = intentRequest.intent
    var intentName = intentRequest.intent.name;

    // dispatch custom intents to handlers here
}

/** Called when the user ends the session - is not called when the skill returns shouldEndSession=true. */
function onSessionEnded(sessionEndedRequest, session) {

}

Комментарии красивые самоуверенные – Руководство по эксплуатации называется, когда мы начинаем сеанс с Alexa, Onlaunch называется, когда мы открываем навык, DineNent называется, когда указан конкретный намерение, а Особняк называется, когда пользователь завершает сеанс. В нашем шаблоне мы также будем иметь функции помощника, которые помогут нам построить ответ Alexa на пользователя.

// ------- Helper functions to build responses for Alexa -------
function buildSpeechletResponse(title, output, repromptText, shouldEndSession) {
    return {
        outputSpeech: {
            type: "PlainText",
            text: output
        },
        card: {
            type: "Simple",
            title: title,
            content: output
        },
        reprompt: {
            outputSpeech: {
                type: "PlainText",
                text: repromptText
            }
        },
        shouldEndSession: shouldEndSession
    };
}

function buildSpeechletResponseWithoutCard(output, repromptText, shouldEndSession) {
    return {
        outputSpeech: {
            type: "PlainText",
            text: output
        },
        reprompt: {
            outputSpeech: {
                type: "PlainText",
                text: repromptText
            }
        },
        shouldEndSession: shouldEndSession
    };
}

function buildResponse(sessionAttributes, speechletResponse) {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
}

Каждая из этих функций создает другой тип ответа для Alexa, чтобы вернуться. BuildSpeeChtResponse Метод принимает заголовок, вывод, RepromptText и Независимость Значение и возвращает отформатированный объект JSON для Alexa, чтобы прочитать и сказать. В этом случае Alexa скажет вывод, воспроизвести пользователь с помощью RepromptText Если пользователь не отвечает и завершит сеанс, если Независимость правда. Эта функция также создает карту, которая появится в приложении Alexa – заголовок карты имеет значение параметра заголовка, а текст абзаца будет тем, что Alexa говорит (вывод).

BuildSpeeChtResponseWithoutcard Функция принимает вывод, RepromptText и Независимость Значение и просто генерирует разговорную ответ с воспроизведением, если пользователь не отвечает, но не создает карту. BuildResponse Способ создает только разговорную ответ. Вы можете добавить больше помощников в зависимости от того, что вы хотите, чтобы Alexa делать, но это хорошие, чтобы использовать при запуске.

С нашим шаблоном завершен, теперь мы можем начать добавлять информацию, которая уместно к нашему навыку. Мы не будем возиться с Экспорт. Хандлер , но мы будем реализовывать большую часть функций, которые он называет – a. Onlaunch , DineNent и т. Д. Для начала, давайте посмотрим на Функция Onlaunch , который будет вызван, когда мы начнем навык. Здесь мы напишем, что Алекса должна сказать в SpeakeOutput Переменная, что Alexa должна воспроизвести пользователь в Пересматривать , Заголовок Для карты, и будь мы закончить сеанс или нет Отказ Тогда мы создадим SecurityAttributes Переменная, которая будет держать SpeakeOutput и RepromptText Отказ Со всеми это сделано, мы можем позвонить в Функция обратного вызова и введите SecurityAttributes а также правильно отформатированный ответ, который Alexa должен сказать пользователю. Этот ответ будет построен с помощью функций помощника, которые мы написали раньше.

function onLaunch(launchRequest, session, callback) {
    var speechOutput = "Welcome to Zodiac Facts! I can tell you facts about all the Zodiac signs. Which sign are you interested in?"
    var reprompt = "Which sign are you interested in? You can find out about Aquaries, Aries, Taurus, Pisces, Gemini, Geminis, Cancer, Leo, Virgo, Libra, Scorpio, Sagittarius, and Capricorn."
    var header = "Zodiac Facts!"
    var shouldEndSession = false
    var sessionAttributes = {
        "speechOutput" : speechOutput,
        "repromptText" : reprompt
    }
    callback(sessionAttributes, buildSpeechletResponse(header, speechOutput, reprompt, shouldEndSession))
}

Теперь, когда мы начнем навык, Alexa скажет: «Добро пожаловать в факты зодиака!» … и т. Д. Большинство наших функций последуют следующим образом.

Переходя к Функция в непосредственной близости , мы напишем оператор коммутатора, который разделяет обработчиков для наших различных намерений.

function onIntent(intentRequest, session, callback) {
    var intent = intentRequest.intent
    var intentName = intentRequest.intent.name;

    // dispatch custom intents to handlers here
    if (intentName == "GetZodiacFactIntent") {
        handleGetZodiacFactRequest(intent, session, callback)
    } else if (intentName == "AMAZON.HelpIntent") {
        handleHelpRequest(intent, session, callback)
    } else if (intentName == "AMAZON.StopIntent" || intentName == "AMAZON.CancelIntent") {
        handleFinishSessionRequest(intent, session, callback)
    } else {
        throw "Invalid intent"
    }
}

В этом коде мы захватываем намерение и IntentName и соответствовать IntentName к конкретному намерению, чтобы запускать соответствующую функцию обработчика. Теперь мы должны писать каждый из функций обработчика, но прежде чем мы сделаем это, давайте создадим объект, Zodiacsigns , это будет держать все наши факты. Мы доступм к этому в нашей первой обработке функции, handgetzodiacfactrequest Отказ

var zodiacSigns = {
  "aries" : {
    	"fact" : "Aries is the first sign of the zodiac. Those who are Aries are independent and courageous. They enjoy leading others and bringing excitement into the lives of others. An Aries is enthusiastic and very goal-oriented"
    },
    "taurus" : {
    	"fact" : "The second sign of the zodiac, those who are a Taurus are solid and fight for what they want. A Taurus is very easy going but can also be stubborn. A Taurus can be procrastinators but also have a good-work ethic."
    },
    "gemini" : {
    	"fact" : "Gemini is the third sign of the zodiac. Geminis have many sides and are known for their energy. They are very talkative and are considered social butterflies. A Gemini will always take their lives in the direction they want to go."
    },
    "cancer" : {
    	"fact" : "Cancer is the fourth sign of the zodiac. This sign is marked by inconsistency. They enjoy security but also seek adventure. A Cancer is not very predictable and always keep others guessing.",
    },
    "leo" : {
    	"fact" : "Leo is the fifth sign in the zodiac. Leos have high self esteem and are very devoted. They are also very kind and generous. A Leo is known for being hot tempered yet forgiving."
    },
    "virgo" : {
    	"fact" : "The sixth sign of the zodiac, Virgo is very mind oriented. They are constantly analyzing and thinking. They enjoy bettering themselves and those around them."
    },
    "libra" : {
    	"fact" : "The seventh sign of the zodiac, Libras are known for their diplomatic nature. They get along well with everyone and are ambitious. They have very expensive taste and work hard to make money."
    }, 
    "scorpio" : {
    	"fact" : "The eight sign of the zodiac, Scorpios are very intense. They like to question everything and work hard at making sense of things. Scorpios treat others with kindness and loyalty."
    },
    "sagittarius" : {
    	"fact" : "The ninth sign of the zodiac, a Sagittarius has a very positive outlook on life. They have vibrant personalities and enjoy meeting new people. They can also be reckless."
    },
    "capricorn" : {
    	"fact" : "The 10th sign of the zodiac, those who are Capricorns are marked by their ambitious nature. They have very active minds and always have to be in control of their lives."
    }, 
    "aquarius" : {
    	"fact" : "Aquarius is the 11th sign of the zodiac. Aquarians don't always care what others think about them. They take each opportunity they have and work towards formulating new ideas."
    }, 
    "pisces" : {
    	"fact" : "Pisces is the 12th and last sign of the zodiac. Those who are Pisces are extremely sensitive and reserved. They like to escape from reality. A Pisces is a very good listener and friend."
    }
}

С нашим объектом создан, мы можем перейти к нашим функциям обработчика. Мы начнем с handgetzodiacfactrequest Отказ Здесь мы схватим знак, который пользователь просил вне зодиакального слота и соответствовать его соответствующему знаку. Затем мы проверим, если этот знак является одним из знаков в нашем Zodiacsigns объект. Если нет, то пользователь просил факты о слоте зодиака, который не существует, который мы ответим, говоря, что знак недействителен. Если знак является одним из знаков в нашем объекте Zodiacsigns, то мы идем вперед и доступ к соответствующему атрибуту факта и образуем соответствующий ответ. Мы также использовали функцию под названием PottizeFirst Чтобы извлечь выгоду из первой буквы каждого знака зодиака для заголовка карты, который также реализован ниже.

function handleGetZodiacFactRequest(intent, session, callback) {
    var sign = intent.slots.Zodiac.value.toLowerCase()
    sign = matchSign(sign)
    if (!zodiacSigns[sign]) {
        var speechOutput = "That's not a Zodiac sign. Try asking about another sign."
        var repromptText = "Try asking about another Zodiac sign."
        var header = "Does Not Exist"
    } else {
        var fact = zodiacSigns[sign].fact
        var speechOutput = fact  
        var repromptText = "Do you want to hear about more Zodiac signs?"
        var header = capitalizeFirst(sign)
    }
    var shouldEndSession = false
    callback(session.attributes, buildSpeechletResponse(header, speechOutput, repromptText, shouldEndSession))
}

function matchSign(sign) {
  switch(sign) {
    case "geminis":
    	return "gemini"
    case "cancers":
        return "cancer"
   	case "leos":
        return "leo"
    case "virgos":
        return "virgo"
    case "libras":
        return "libra"
    case "scorpios":
        return "scorpio"
    case "sagittariuses":
        return "sagittarius"
    case "capricorns":
    	return "capricorn"
    default:
        return sign
   }
}

function capitalizeFirst(s) {
    return s.charAt(0).toUpperCase() + s.slice(1)
}

В конце реализации мы называем функцию обратного вызова с переменными, которые мы создали выше. Теперь, на следующий обработчик, который называется Ручкаelprequest Отказ Здесь мы просто создаем ответ, используя BuildSpeezeletResposneWithoutcard Метод, который объяснит, как приложение работает пользователю.

function handleGetHelpRequest(intent, session, callback) {
    // Ensure that session.attributes has been initialized
    if (!session.attributes) {
        session.attributes = {};
    }
    var speechOutput = "I can tell you facts about all the different Zodiac signs, including Aquaries, Aries, Taurus, Pisces, Gemini, Geminis, Cancer, Leo, Virgo, Libra, Scorpio, Sagittarius, and Capricorn. Which sign are you interested in?"
    var repromptText = speechOutput
    var shouldEndSession = false
    callback(session.attributes, buildSpeechletResponseWithoutCard(speechOutput, repromptText, shouldEndSession))
}

Теперь нам просто нужно написать HandlefinishSessionRequest , что выйдет из пользователя из навыка. Здесь мы просто делаем ответ без карты и отдайте его обратному функции.

function handleFinishSessionRequest(intent, session, callback) {
    // End the session with a "Good bye!"
    callback(session.attributes,
        buildSpeechletResponseWithoutCard("Good bye! Thank you for using Zodiac Facts!", "", true));
}

Если эта функция называется, Alexa скажет «До свидания! Спасибо за использование зодиакальных фактов!» И навык закроется.

ЭТО ОНО! Вы завершили код для вашего index.js Файл и ваша ламбда. Чтобы положить его на облако, просто нажимайте на один файл и загрузите его, где мы остановились в последнем руководстве на AWS сайт

войти

Как только ваш файл index index.js загружен, и вы нажимаете сохранение, ваш экран должен выглядеть так.

войти

В верхнем правом углу вы должны увидеть Номер arn Это выглядит что-то подобное, но с большим количеством номеров и символов. Это называется Имя ресурса Amazon И это свяжет функциональность нашего навыка на голосовой интерфейс. Мы будем использовать ARN на следующем шаге.

войти

Теперь мы сможем подключить функциональность к интерфейсу нашего навыка и проверить его на Amazon Developer Site Отказ Навигация обратно в голосовой интерфейс для нашего навыка, вы увидите Конфигурация вкладка На этой панели выберите свой регион, вставьте на вашу конечную точку ARN, которые мы схватили ранее, и ударили Следующий начать тестирование.

войти

Чтобы проверить наш навык, мы прокручиваем до Служба симулятора Отказ В Введите высказывание Текстовое поле, введите то, что вы можете сказать своему эхо с этим навыком. Для этого примера, скажем, Расскажи мне о Льве Отказ После нажатия Спросите факты зодиака Вы увидите Лямбда запрос справа и Лямбда ответ налево.

войти

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