Оглавление:

Добавление настраиваемого элемента управления Alexa в проект Raspberry Pi: 5 шагов
Добавление настраиваемого элемента управления Alexa в проект Raspberry Pi: 5 шагов

Видео: Добавление настраиваемого элемента управления Alexa в проект Raspberry Pi: 5 шагов

Видео: Добавление настраиваемого элемента управления Alexa в проект Raspberry Pi: 5 шагов
Видео: iRidium Script Работа с драйверами iRidium 2024, Июль
Anonim
Добавить пользовательский элемент управления Alexa в проект Raspberry Pi
Добавить пользовательский элемент управления Alexa в проект Raspberry Pi

Этот проект предназначен для всех, у кого есть проект Raspberry Pi, использующий Python, который хочет добавить голосовое управление через свои существующие устройства Amazon Echo. Вам не нужно быть опытным программистом, но вам должно быть удобно использовать командную строку и адаптировать существующий код под свои нужды.

Первоначально я задумал проект, позволяющий управлять моим Raspberry Pi голосом с помощью Alexa, чтобы он мог нагревать воду в чайнике до определенной температуры. Хотя взаимодействие, которое я хотел, было довольно простым (передать одно число от Alexa к Raspberry Pi), потребовалось много работы, чтобы добраться до этого состояния из существующих руководств. Я надеюсь, что это руководство сделает этот процесс максимально быстрым для других.

В моем примере я начинаю с Raspberry Pi Zero W с Raspbian. У меня есть программа Python3 на моем Pi, способная записывать текст на дисплей SPI, и у меня есть датчик термометра, который я могу читать. Для вас эта программа может быть чем угодно, но идея состоит в том, что у вас могут быть некоторые устройства ввода, которые вы хотите читать через Alexa, и / или некоторые устройства вывода, которыми вы хотите управлять с помощью Alexa.

Цель состоит в том, чтобы перейти от базовой программы, такой как описанная выше, к устройству, которым вы можете легко управлять с помощью моего Echo. Если у вас уже есть это оборудование, этот проект не должен стоить вам денег. В конце концов, вы дойдете до того момента, когда сможете сказать что-то вроде:

Я: «Алекса, попроси мой гаджет проверить температуру по датчику 1».

Ответ Алексы: «Датчик показывает 72,31 градуса».

или

Я: «Алекса, скажи моему гаджету написать Джорджу Вашингтону»

Ответ: на дисплее, подключенном к моему Raspberry Pi, теперь отображается «Джордж Вашингтон».

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

Шаг 1. Справочная информация

Фон
Фон

На этом изображении (предоставлено https://developer.amazon.com/en-US/docs/alexa/alex … мы можем увидеть общую архитектуру гаджетов Alexa.

Когда вы что-то говорите своему устройству Echo, оно отправляет звук в облако Alexa, где он обрабатывается и генерируется ответ, чтобы ответить вам. Когда вы спрашиваете, какая сейчас погода, между ними общаются только эти двое. Теперь предположим, что вы хотите добавить голосовое управление в один из своих небольших проектов на Raspberry Pi. Обработка всего на борту потребует значительного оборудования и очень сложной кодовой базы, чтобы все заработало. Лучшим решением было бы использовать Alexa Cloud, которая очень сложна и отлично справляется со сложными речевыми шаблонами. Гаджеты Alexa предоставляют вам хороший способ сделать это.

Гаджет Alexa связывается с устройством Echo с помощью Bluetooth. Как только это соединение установлено, они передают друг другу сообщения в кодировке UTF-8. Когда Echo передает что-то гаджету, это называется директивой. Другое направление называется событием. Прежде чем вдаваться в подробности всего этого, мы должны ввести еще один ключевой элемент: пользовательские навыки Alexa.

Alexa позволяет разработчикам создавать свои собственные навыки, что позволяет им разрабатывать собственные взаимодействия и модели поведения для использования на всех устройствах Echo. Например, разработчик может создать специальный навык, который сообщит вам расстояние между двумя аэропортами в США. Пользователь сказал бы: «Алекса, спросите мой калькулятор расстояний, каково расстояние между Лос-Анджелесом и JFK», и он мог бы ответить «2475 миль». Как оно работает? Когда разработчик создает пользовательский навык, он определяет то, что называется «пользовательскими намерениями», с «образцами высказываний», содержащими «слоты». Например, в этом навыке у меня может быть намерение «calc_dist» для вычисления расстояния между двумя точками. Примером высказывания может быть «какое расстояние между {слот1} и {слот2}» или «насколько далеко между {слот1} и {слот2}». Слоты, указанные в скобках, имеют определенные типы. В этом случае такими типами будут коды аэропортов, такие как LAX, JFK, BOS, ATL. Когда пользователь запрашивает пользовательский навык, Alexa Cloud пытается сопоставить то, что пользователь говорит, с пользовательским намерением, используя предоставленные образцы высказываний, и пытается найти допустимые значения слотов для этого запроса. В этом примере он обнаружит, что пользователю требуется намерение «calc_dist», и что slot1 - это LAX, а slot2 - JFK. На этом этапе Alexa Cloud передает работу собственному коду разработчика. По сути, он сообщает коду разработчиков, какое намерение он получил и каковы были все значения слотов, среди других деталей.

Разработчик сам решает, где находится его код, но очень популярным вариантом является использование функции AWS Lambda. Если вы не знаете, что это такое, по сути, это служба, которая позволяет вам загружать код, который можно запустить в любое время, а затем взимать плату только за то время, в течение которого выполняется ваш код. Если мы продолжим наш пример, код разработчика может быть функцией Python, которая получает два кода аэропорта, ищет их местоположения, вычисляет расстояния, а затем отправляет ответ обратно в облако Alexa, чтобы сообщить что-то пользователю. Затем Alexa Cloud отправит эту речевую информацию обратно на устройство пользователя, и они получат ответ.

Теперь мы можем вернуться к гаджету. Мы можем создавать индивидуальные навыки, специально предназначенные для работы с гаджетами. Разработчик может написать навык, который отправляет директиву подключенному гаджету. У этой директивы есть полезная нагрузка, которую можно использовать, но это необходимо гаджету. Этот навык также может отправить директиву, а затем прослушивать событие от гаджета, чтобы код навыка мог иметь доступ к информации, отправляемой с гаджета.

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

Следует отметить, что большинство навыков допускают различные способы взаимодействия с ними. Например, пользователь может сразу перейти к намерению, сказав: «Алекса, спроси мой калькулятор расстояния, каково расстояние между LAX и JFK» (это называется однократным вызовом), или они могут просто использовать намерение запуска: «Алекса, открыть мой собственный калькулятор расстояний . Этот последний пример обычно сопровождается ответом Alexa с запросом дополнительной информации. В этом руководстве преднамеренно отсутствует поддержка последнего. В частности, без изменения лямбда-функции вы можете вызвать навык только с помощью однократного вызова. Этот выбор дизайна позволяет модели быть более простой (не обязательно поддерживать намерения запуска или поток разговора), и я обнаружил, что обычно я обычно хочу взаимодействовать со своими гаджетами, используя однократные вызовы, поскольку они обычно быстрее.

Шаг 2. Зарегистрируйте гаджет в консоли разработчика Alexa Voice Service

Ниже приводится описание необходимых шагов. Я создал эквивалентное видео, в котором показано, как выполнить все эти шаги. Для выполнения этого шага вы можете использовать одно или оба варианта.

  1. Перейдите на
  2. Если у вас еще нет бесплатной учетной записи, сделайте ее
  3. Щелкните "Продукты"
  4. Заполните ярлыки и выберите «Alexa Gadget».
  5. Заполните все, что хотите, в остальных полях
  6. Нажмите Готово

Шаг 3. Создайте функцию AWS Lambda и специальный навык

Создание пользовательского навыка в консоли разработчика Alexa Skills Kit

Код для этого руководства можно найти здесь

Перед выполнением этого шага вам необходимо создать файл.zip, содержащий пакет развертывания для функции AWS Lambda, как показано в руководстве здесь.

  1. Загрузите папку «lambda» с моего Github, которая содержит «lambda_function.py» и «requirements.txt».
  2. Откройте терминал и измените текущий каталог, чтобы он находился внутри этой папки.
  3. Выполните следующую последовательность:

pip install -r requirements.txt -t skill_env

cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip

Ваш файл.zip теперь будет находиться в каталоге, где находилась папка лямбда, и будет называться "skill-code.zip".

Примечание о стоимости хостинга на AWS: для этого руководства требуется, чтобы у вас была учетная запись AWS (ее можно создать бесплатно). Лямбда-функции действительно стоят денег, однако их текущая цена в регионе Северная Вирджиния составляет 0,000000208 долларов США за 100 мс при использовании 128 МБ памяти. Для справки, каждый вызов моих навыков требует около 800 мс использования на этом уровне. Чтобы получить счет в 1 доллар США, вам нужно будет вызвать эту функцию около 600 000 раз, что (если на один вызов у вас уходит 5 секунд) потребует более 34 дней непрерывного вызова вашей функции. Стоимость не должна быть серьезной проблемой, если вы не опубликуете свой навык, и огромное количество людей не начнет им пользоваться. Если вас беспокоит получение счетов на AWS, подумайте о настройке сигналов об использовании, которые будут уведомлять вас, если использование превышает определенный порог.

Ниже приводится описание необходимых шагов. Я создал эквивалентное видео, в котором показано, как выполнить все эти шаги. Для завершения этого шага вы можете использовать любой из них или оба сразу.

  1. Перейдите на https://aws.amazon.com/ и войдите в консоль или создайте бесплатную учетную запись, если у вас ее нет.
  2. Найдите и нажмите "Лямбда" в разделе "Услуги".
  3. Нажмите «Создать функцию».
  4. Выберите «Автор с нуля», дайте ему имя и выберите последнюю версию Python 3 для выполнения.
  5. Измените "редактировать встроенный код" на "загрузить файл.zip" и выберите файл.zip, созданный выше.
  6. В новом окне перейдите на https://developer.amazon.com/alexa/console/ask и войдите в систему.
  7. Нажмите «Создать навык».
  8. Обозначьте его, выберите «Пользовательская» модель, «Предоставьте собственное» и нажмите «Создать навык».
  9. Нажмите «Начать с нуля» и нажмите «Выбрать».
  10. В разделе «Намерения» нажмите «Добавить».
  11. Создайте собственное намерение под названием «alexa_to_pi» и введите «написать {person}» в качестве образца высказывания.
  12. Создайте слот намерения под названием "человек" с типом "AMAZON. Person".
  13. Создайте собственное намерение под названием «pi_to_alexa» и введите «Проверить температуру от датчика {sensor_num}».
  14. Создайте слот намерения под названием "sensor_num" с типом "AMAZON. NUMBER"
  15. В разделе "Интерфейсы" включите "Контроллер пользовательского интерфейса".
  16. В разделе «Конечная точка» выберите «AWS Lambda ARN» и скопируйте «свой идентификатор навыка».
  17. Вернитесь в консоль AWS.
  18. Нажмите «Добавить триггер».
  19. Выберите «Alexa Skills Kit», установите флажок «Включить» в разделе «Проверка идентификатора навыка», вставьте идентификатор навыка, который вы только что скопировали, и нажмите «Добавить».
  20. Скопируйте Lambda ARN в верхний правый угол.
  21. Вернитесь в консоль разработчика Alexa и вставьте Lambda ARN в поле «Регион по умолчанию».
  22. В разделе «Вызов» установите для параметра «Имя вызова навыка» значение «мой гаджет».
  23. Нажмите «Сохранить модель», а затем «Построить модель».
  24. Нажмите «Тест» на верхних вкладках и измените селектор с «Выкл.» На «Разработка».
  25. Обратите внимание, что журналы для функции Lambda находятся в сервисе CloudWatch на AWS.

Шаг 4. Настройте код на Raspberry Pi

Чтобы ваш Raspberry Pi мог взаимодействовать с устройством Alexa, ему требуется некоторый код для облегчения передачи информации по Bluetooth и поддержания этого соединения в дополнение к нескольким другим файлам. Самый простой способ начать работу с самыми последними файлами с Amazon - это клонировать их репозиторий Raspberry Pi Gadgets. Перейдите в каталог вашего текущего проекта и запустите

git clone

Это загрузит весь их репозиторий со всем необходимым кодом на ваш Pi. В нем есть несколько примеров проектов, демонстрирующих некоторые возможности гаджетов Alexa. Если вам нужна дополнительная информация, см. Readme на их странице Github.

Запустите их функцию настройки, чтобы все было настроено.

cd / home / pi / Alexa-Gadgets-Raspberry-Pi-Samples

sudo python3 launch.py --setup

Следуйте инструкциям и ответьте «y», когда вас спросят, хотите ли вы выполнить настройку с использованием учетных данных гаджета. Вспомните Amazon ID и секрет гаджета из настройки вашего гаджета на консоли разработчика, так как они будут запрошены здесь. Я выбрал режим передачи «bt» для своего Raspberry Pi Zero W. BLE не поддерживается всеми старыми устройствами Echo, но вы можете узнать, на что способно ваше оборудование. Если вы используете Pi в режиме рабочего стола, Amazon рекомендует щелкнуть правой кнопкой мыши значок Bluetooth в правом верхнем углу и нажать «Удалить« Bluetooth »с панели», чтобы избежать проблем с подключением.

Примечание: этот шаг может занять некоторое время в зависимости от того, сколько нужно установить.

Теперь у вас будут все необходимые файлы поддержки, чтобы вернуться к вашему проекту и начать добавлять функции, позволяющие взаимодействовать с вашим Echo.

Если вы выберете, вы можете удалить папку «examples» в «Alexa-Gadgets-Raspberry-Pi-Samples / src».

Вы можете иметь код своего проекта где угодно, но я сделаю для него папку в домашнем каталоге, в качестве альтернативы вы можете загрузить папку с кодом из моего Github, просто не забудьте отредактировать файлы.ini, как описано ниже.

cd / home / pi

mkdir my_project cd my_project touch my_gadget.py touch my_gadget.ini

Теперь я создал два файла в папке «my_project». Файл.ini важен. Убедитесь, что он содержит следующее и замените его в вашем идентификаторе Amazon и секрете гаджета:

[GadgetSettings]

amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0

Теперь давайте взглянем на файл python, прежде чем вдаваться в подробности:

импортировать json

from agt import AlexaGadget

класс MyGadget (AlexaGadget):

def _init _ (сам):

супер ()._ init _ ()

def on_custom_mygadget_alexatopi (self, директива):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Полученные данные:" + str (payload)) write_text (str (payload ['data'] ['person'] ['value ']))

def on_custom_mygadget_pitoalexa (self, директива):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Полученные данные:" + str (payload)) payload = {'data': "Зонд читает" + str (get_temp (payload ['data'] ['sensor_num'] ['value'])) + «градусов»} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', payload) MyGadget (). main ()

Сначала вы заметите, что он вызывает две функции: write_text () и get_temp (). В своем коде я определяю эти функции в одном файле, но они зависят от моего оборудования, поэтому я решил их опустить. Я прикрепил этот файл с теми функциями, которые определены только для печати и возврата фиктивных данных на случай, если вы захотите запустить именно этот код. Я бы посоветовал протестировать этот точный код, прежде чем изменять его для работы с вашим проектом. Я также прикрепил файл.ini, но убедитесь, что вы зашли и изменили идентификатор и секрет гаджета. Верхняя функция получает данные, переданные от Alexa. Нижняя функция получает данные в том же формате, но устройство Alexa будет ждать пять секунд, пока событие не будет передано обратно с собственной полезной нагрузкой. Эта полезная нагрузка отличается тем, что устройство Alexa будет озвучивать ее содержимое.

Когда у вас есть эти файлы, перейдите в папку «my_project» и запустите файл python.

перезагрузка sudo

cd / home / pi / my_project sudo python3./my_gadget.py

Если вы запускаете программу впервые, вам необходимо подключить ее к устройству Echo. Убедитесь, что ваше устройство Echo находится рядом с Raspberry Pi, поскольку нам нужно разрешить подключение по Bluetooth.

В приложении Alexa на мобильном устройстве нажмите «устройства» в правом нижнем углу.

Нажмите «Эхо и Алекса» в левом верхнем углу.

Щелкните свое устройство Echo.

В разделе «БЕСПРОВОДНАЯ СИСТЕМА» нажмите «Устройства Bluetooth».

Нажмите «СОПРЯЖЕНИЕ НОВОГО УСТРОЙСТВА», и вы должны увидеть свой гаджет в списке.

Нажмите на свой гаджет. Вы должны увидеть отчет Pi об успешном сопряжении.

Наблюдая за выводом на вашем Pi, попробуйте дать голосовую команду Echo:

Вы: «Алекса, попроси мой гаджет проверить температуру по датчику номер один»

Если все работает правильно, вы должны услышать:

Эхо: «Датчик показывает 120,505 градусов».

Вы: «Алекса, скажи моему гаджету, чтобы он написал Джорджу Вашингтону».

Pi должен напечатать:

Полученные данные: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmStatus': 'NONE'}}}

Джордж Вашингтон"

Шаг 5: Заключение

Показанное здесь видео является примером работы гаджета с считыванием температуры (тот же датчик в F и C) и записью имен на простой дисплей.

Теперь, когда у вас, надеюсь, есть что-то работающее, вы должны попытаться настроить это, чтобы сделать ваш собственный проект более функциональным. Помните, что вы можете легко редактировать намерения в консоли разработчика Alexa и что все используемые вами слоты будут переданы вашему Pi в полезной нагрузке. Кроме того, вы можете заставить Alexa сказать все, что угодно, просто отредактировав полезную нагрузку, которую вы передаете обратно в событии из вашего кода Raspberry Pi.

Обратите внимание, что это руководство не является окончательным решением для всех возможностей, которые могут потребоваться от гаджета Alexa. Он намеренно ограничен двумя простыми функциями для передачи данных в каждом направлении между Alexa и гаджетом. Если вы заинтересованы в создании более сложных моделей взаимодействия, я бы посоветовал вам прочитать все файлы readme на https://github.com/alexa/Alexa-Gadgets-Raspberry-P… и попробовать все примеры, которые они предоставляют.. Я также предлагаю вам прочитать документацию для Alexa Gadgets Toolkit и Alexa Skills Kit.

Рекомендуемые: