Этот пост о том, как объявлять слоты и работать с ними. Это также покажет вам борьбу, с которой я столкнулся во время работы с ними. Наслаждаться!

Введение в слоты

Слоты - это в основном переменные в высказываниях. Они могут иметь предопределенные значения, но по умолчанию они пусты. Чтобы определить слот, вам сначала нужно создать собственное намерение в своем навыке, потому что вы не можете использовать его во встроенных намерениях. После этого, когда вам нужно создать образцы высказываний для намерения, просто определите слот, записав его в фигурные скобки.

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

Конструктор навыков автоматически определит {Город} и {День} как слоты и выделит их. В нашем списке намерений мы увидим эти два слота.

Если мы щелкнем по ним, мы можем присвоить им определенный тип. В качестве слота города мы выбираем Amazon.DE_City, который является предопределенным типом слота от Amazon, который может обрабатывать около 5000 названий городов в Германии. Дневной интервал соответствует Amazon.Date. Далее мы хотим выбрать, требуется ли слот для выполнения намерения. В нашем случае слоты для будок необходимы для выполнения задуманного.
Они необходимы, потому что мы не можем указать конкретные часы работы, не зная день или город данного офиса.

Мы также хотим взглянуть на голосовые подсказки Alexa и высказывания пользователя. Чтобы объяснить их, мы должны взглянуть на функцию Alexa «Dialog.Delegate», эта функция может делегировать диалог Alexa, если пользователь не предоставил все необходимые значения для слотов. Если пользователь не указал значение слота из нашего навыка, мы можем определить некоторые речевые подсказки в меню слота. Затем Alexa попросит пользователя указать значение для конкретного слота. В нашей речевой подсказке мы спросим пользователя о временном интервале: «Вы все равно должны сказать мне, для какого дня вы хотите знать часы работы», и в качестве пользовательских высказываний мы определяем «on {Day}».

Для дальнейшего объяснения «Dialog.Delegate» нам понадобится еще один пример. Скажем, пользователь предоставляет нашим навыкам только местоположение, но не день. Это означает, что не все слоты, необходимые для выполнения намерения, заполнены. Именно здесь мы передаем диалог с пользователем в Alexa. Затем он будет использовать наше предопределенное высказывание, чтобы запросить у пользователя отсутствующее значение слота. Теперь пользователь ответит, например, «в пятницу». Теперь Alexa обновит значение слота, и у нас есть все значения, с которыми нам нужно работать.

Кстати, неплохо то, что пользователь может «перевыполнить» вопрос, а также заполнить еще один необходимый слот. Например, «в пятницу в Берлине» будет установлено значение дневного интервала «Пятница», а для города - «Берлин».

Звучит просто, где же борьба?

Вот оно ...

Борьба и решение

У меня возникли проблемы с сервалом при работе со слотами, вот мои «фавориты»:

Как получить эти значения слотов?
Итак, пользователь предоставляет нам некоторые значения, но нет, как мы можем получить к ним доступ? Нет проблем, просто взгляните на документацию ... Нет, это тупик. Документация предоставит вам только некоторые примеры высказываний и некоторую дополнительную (полезную) информацию для различных типов слотов. Итак, я искал на Stackoverflow и других различных веб-сайтах, как получить доступ к значению слота без решения, что также показывает мне другую проблему и требует слишком много времени. Наконец, я взглянул на «this.event.request.intent.slots-object». Одна строчка кода. Поэтому, если вы хотите получить доступ к значению слота города, просто поместите эту строку кода в свою лямбда-функцию. Спасибо, Петр за указатель!

var cityName = this.event.request.intent.slots.City.value;

Почему воскресенье не подходит для дневного интервала?

Чтобы объяснить это, я покажу вам несколько строк кода, основанных на моем навыке.

const daysArr = [ “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”, “Sunday”];
let d = new Date(this.event.request.intent.slots.Tag.value);
dayName = daysArr[d.getDay()];

Этот код преобразует указанную дату из Amazon.Date в день, который можно говорить. Но каждый раз, когда пользователь говорит «Воскресенье», навык возвращает «dayName» с неверным результатом. Это действительно сводило меня с ума на сервальные минуты, пока я не понял, что первый день недели в штатах не понедельник, а воскресенье, и мне нужно переставить свой массив так:

[ “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”];

Так что всегда помните, даже самые маленькие проблемы могут сломать ваше мастерство!

Заключение

Пора закончить этот пост. В заключение, у Alexa есть несколько довольно хороших встроенных функций, таких как 'Dialog.Delegate', но без более подробных объяснений и фрагментов кода они не получили многих навыков, которые могли бы использовать их, чтобы сэкономить много кода и легко улучшить пользовательский интерфейс. Кроме того, у Alexa есть многоязычная поддержка, поэтому, возможно, документация должна намекнуть на некоторые местные различия, например, «Воскресенье - первый день недели» - даже если это связано с JavaScript. Так что, пожалуйста, Amazon предоставьте нам лучшую документацию, а также создайте несколько руководств среднего уровня, чтобы сообщество могло вырасти от клонов фактических навыков до живого и творческого сообщества разработчиков!

Дальнейшая информация