Будучи адептом идеи "вкалывают роботы, а не человек", в попытках автоматизировать свой дом, с целью больше никогда не вставать с дивана понял, что облачные решения вроде Алисы и Гугла слишком медленны, ненадежны и дороги для студента. Так еще и какая-то злобная компания будет слышать все что происходит в моем доме! На постоянной основе! В общем, было решено делать своего голосового помощника, да чтобы не просто выполнял команды, а еще и поговорить с тобой мог. Еще несколько видео с демонстрацией работы в конце поста.
Для начала пара слов о том, что имеется в безумном доме:
cервер Intel NUC 5I3RYK - 2 шт.;
USB ZigBee координатор - 1 шт.;
умная беспроводная кнопка– 2 шт.;
электромеханический замок 12в – 1 шт.;
умные лампочки – 1 шт.;
умное реле – 1 шт.;
датчик температуры и влажности – 1 шт.;
камера видеонаблюдения – 2 шт.
Установлено все следующим образом, пока оборудована только любезно выделенное мне родственниками пространство в 9 квадратных метров, но имеем что имеем:
Подключить все планируется по этой схеме. Задумка сделать архитектуру клиент-сервер связана с тем, что будет один сервер голосового помощника, который взаимодействует с УД, внешним миром, и клиенты с речевым модулем на нескольких устройствах в разных точках дома:
Реализация на данный момент выглядит так:
Все объединено в Home Assistant:
камеры китайское Г, поэтому постоянно отваливаются. на момент написания поста заменены на нормальные
С системой УД разобрались, теперь к самому помощнику. Задачи перед ним стоят следующие:
выполнение сценариев УД, прописанных в хоум ассистант либо внутри самого помощника
управление устройствами УД по отдельности по именам
имитация диалога с пользователем, если в сказанной человеком фразе нет команды
поиск информации в Интернете
В качестве языка выбрал питон. ибо просто.
Для реализации распознавания голоса была использована библиотека Vosk с маленькой готовой речевой моделью для русского языка. Большая не запускалась. Ни на процессоре, ни на видеокарте, висит и все. Ну да и бог с ней.
Чтобы помощник мог разговаривать с пользователем, ему нужно знать, что ответить. Скачал несколько готовых баз для чат-ботов, объединил, адаптировал. Получилась система вопрос-ответ. Тупенькая, но для начала пойдет. Объем 78.000 пар вопрос-ответ. С этим помощник сможет хотя бы более-менее осмысленно отвечать на вопросы, и это полностью локально. А беседы я с ним водить и не собирался.
Логика работы, согласно поставленным задачам заключается в следующем:
Помощник распознает начало фразы, в качестве триггера - резкое повышение громкости звука относительно фона. За конец фразы принято возвращение громкости в норму, равное окружающему шуму.
При помощи языковой модели распознаются слова, и превращаются в массив данных, разделенных по слову
Распознанные слова сравниваются с массивом имен, чтобы однозначно определить, была ли адресована сказанная фраза помощнику. При этом не имеет значения, сказано имя в начале, в конце или в середине. (Робот, включи лампу. Включи лампу Бот.) Можно использовать несколько имен.
Распознаем, содержится ли в сказанной фразе какая-либо команда для бота. В коде команды представляют собой набор слов, которыми с наибольшей вероятностью пользователь задаст команду. Опытным путем выяснил, что при совпадении 2-х и более слов команды ее можно смело выполнять. (На этом этапе не помешало бы сделать управление каждым устройством по отдельности, то есть получение с сервера умного дома названий устройств и т.д.), но пока я до этого не дошел. Задал через "обычные" команды два сценария для управления замком двери - да и все пока. Распознал команду - отправил ее на серверную часть помощника. Серверная часть помощника провзаимодействовала с сервером Умного Дома, отправила ответ о выполнении/не выполнении команды обратно в клиент, клиент произнес ответ для пользователя.
В клиенте (первый элемент массива - название команды, последующие - содержание):
['погода на улице', 'погода','погодой','улице','за','окном','сегодня'],
close_door_and_turn_on_lock() - функция которая общается с сервером умного дома и что-то делает
Отдельно реализована функция поиска в Википедии, триггерящаяся на слова "что такое" или "кто такой", выполняет поиск в энциклопедии и зачитывает первые два предложения. Этого достаточно для отражения сути.
Говоря в общем о взаимодействии сервера и клиента, в данный момент я использую веб-сокеты для передачи информации между ними. Позднее планирую перейти на restAPI, чтобы сервер и клиент равноправно триггерили друг друга на выполнение каких-то действий. То есть чтобы например сервер, анализируя погодные условия, мог послать в клиент фразу для произношения "через два часа начнется дождь".
5. Если не нашли ни команды, ни триггера для поиска в википедии, включаем сценарий имитации диалога. Он работает по методу сопоставления гештальт-паттернов, придуманным в 1983 году Джоном У. Рэтклиффом и Джоном А. Обершелпом и опубликован в журнале доктора Добба в июле 1988 года. Простым языком, мы, имя базу вопрос-ответ, сравниваем сказанную пользователем фразу с каждым вопросом в этой базе, на выходе получая массив коэффициентов подобия (на сколько заданный вопрос соответствует конкретному имеющемуся) от 0 (нет ни одной совпадающей буквы) до 1 (полное совпадение), после чего ответ, где коэффициент подобия оказался наибольшим, выводим в речевой движок и пользователь слышит ответ.
Вот и вся суть. Ниже прикрепляю несколько видео с демонстрацией работы помощника. Планы на будущее этого проекта:
написать код для управления каждым умным устройством по отдельности, по именам получаемым с сервера Умного дома
заменить метод гештальт-паттернов на какой-никакой обучающийся ИИ
расширить парк умных устройств, написать новые сценарии взаимодействия с ними
В мире умных домов часто приходится выбирать между удобством и функционалом. Раздумывая над тем, каким может быть идеальный умный дом, мы пришли к идее MajorDom — системе, которая стремится изменить этот баланс и упростить быт без жертв. В этом посте поделимся нашим видением и некоторыми основными принципами новой экосистемы, включая приватность, автономность и широкую поддержку устройств.
automate smart — not hard (MajorDom)
В этой статье мы не будем вдаваться во все подробности технических деталей, реализаций и протоколов, а сосредоточимся на более общем, абстрактном, пользовательском описании системы, иначе статья выйдет слишком длинной, но мы обязательно вернемся ко всем деталям позже
Домашние гаджеты
Сегодня существует много разных гаджетов для дома: светильники, шторы, обогреватели, пылесосы, датчика безопасности и микроклимата. Они созданы для того, чтобы облегчить жизнь, но не всё так однозначно.
Раньше каждое устройство имело свой протокол управления, свои стандарты, свои методы безопасности и каждому из них нужно было отдельное приложение или пульт. Чем больше устройств в доме, тем больше времени нужно посвятить управлению ими, что превращается в новую рутину. Это похоже на жонглирование слишком большим количеством мячей.
Приложения для домашних гаджетов
Существующие решения
Системы "умного" дома (или домашней автоматизации) должны были решить эту проблему, но до идеала им еще далеко. Есть два типа таких систем: проприетарные от цифровых корпораций и народные с открытым кодом. К сожалению, и у тех, и у тех есть минусы. Предлагаю составить график, в котором по оси x будет легкость использования сложной к простой, а по оси y - умность и функциональность системы.
График: легкость использования к умности системы
Окажется, что все проприетарные системы находятся где-то в центре-внизу. Они дают некоторый функционал, с которым может справиться обычный человек, потратив какое-то время на изучение. Чаще всего эти системы являются закрытыми и поддерживают только свой ограниченный список устройств в своем специальном приложении. Их функциональность сводится к замене физического выключателя кнопкой в телефоне или простыми голосовыми командами. Иногда встречаются элементарные автоматизации, точнее скрипты, которые нужно писать вручную.
В то же время они слишком зависят от облачных решений. Сбой сервера, изменения в политике, новые регуляции или простое отсутствие интернета означают отключение умного дома.
Но, что хуже всего, самые популярные системы принадлежат рекламным или маркетплейсным гигантам, зарабатывающим на продаже персональных данных пользователей. Это основа их бизнес-модели, из-за чего они не могут измениться, поэтому о доверии и приватности здесь не может быть и речи.
Осьминог монополии (отсылка к "standard oil octopus")
Тем, кто хочет больше возможностей или не хочет слежки, приходится переходить на открытые решения и платить за это сложностью настройки и установки. Это область выше и левее центра, но часто это того стоит. Открытые системы предлагают больше свободы, возможности интеграции с любыми устройствами и протоколами благодаря плагинам, неограниченные кастомизации и полный контроль. Единственное, это задачка для технарей, желающих проводить вечера за изучением форумов и разработкой. Точно так же некоторым нравится проводить часы в гараже перебирая все детали машины. Я не говорю, что это плохо, ведь у каждого есть свои хобби, но большинство людей хочет автомобиль, чтобы просто на нем ездить. Конечно, вы можете нанять профессионала, который займется всеми устройствами и безопасностью, потратив на это целое состояние. Но что, если вы не хотите ни нанимать профессионала, ни становиться им самостоятельно?
Мы хотим сделать систему, которая займет правый верхний угол: будет работать прямо из коробки, поддерживать широкий спектр устройств, надежно хранить данные пользователей, при этом будет умнее и функциональнее остальных.
График: легкость использования к умности системы (мажордом)
Экосистема умного дома
Поговорим о том, как устроены экосистемы умного дома и чем они отличаются от систем домашней автоматизации. Все начинается с устройств, напрямую управляющих домом: лампы, реле, модули с мотором. Это первый "физический" уровень. Вторым уровнем пусть будет интерфейс "application layer". Свяжем их через wifi или bluetooth.
Экосистема умного дома: приложение и устройство
Но представим, что у нас несколько устройств, у каждого по своему приложению. Выглядит не очень удобно, да?
Экосистема умного дома: несколько приложений и устройств
Теперь переведем устройства на более энергоэффективные радиопротоколы. Но как подключить их к смартфону? Добавим посредника в виде хаба, у которого с одной стороны радиомодуль, а с другой - тот же wifi. В качестве бонуса подключим к хабу все устройства того же производителя. Теперь в приложении может быть несколько устройств, но только одного бренда. Так выглядят закрытые "экосистемы". Каждая использует свои протоколы и стандарты, так что они не совместимы между собой.
Закрытые экосистемы умного дома с хабом
Но, что хуже, далеко не все приложения умеют общаться с хабом напрямую в пределах локальной сети (LAN) и используют сервер даже когда вы находитесь дома. Это тот случай, когда отключение интернета означает полный блэкаут, а наличие интернета - возможность удаленного управления домом из облака (доверяете ли вы облаку компании, зарабатывающей на продаже ваших персональных данных, но не заботящейся об их сохранности?).
Закрытые экосистемы умного дома с хабом и облаком
Чтобы это исправить, заменим проприетарный хаб на raspberry pi с какой-нибудь open source системой домашней автоматизации, а также добавим плагины для интеграции устройств. Это позволяет объединить все устройства в одну систему, например, чтобы программировать общие автоматизации или продвинутые сценарии. Уже лучше, но пропала одна мелочь под названием интерфейс.
Универсальный open source хаб умного дома
К счастью, некоторые open source решения идут комплектом с вебным фронтендом или даже мобильным приложением (но не всегда с user-friendly интерфейсом). Добавив еще пару плагинов, мы можем пробросить часть устройств (или все, если очень повезет) в приложение какой-то из экосистем. В таком случае хаб выступает посредником или адаптером для устройств сторонних производителей. Но теперь мы зависимы от этой экосистемы и получаем те проблемы, о которых шла речь в начале статьи. В качестве альтернативы, мы можем подключить другой плагин с кастомным облаком, но это уже становится или слишком сложно, или все еще недостаточно безопасно.
Универсальный open source хаб умного дома c инфраструктурой экосистем
Хочу заметить, что не всегда проприетарный хаб можно полностью заменить на кастомный. Часто вам понадобится иметь оба хаба (проприетарный и кастомный), чтобы система поддерживала оригинальные приложения и устройства. В итоге это может превратиться в запутанный клубок технологий.
Универсальный open source хаб умного дома c инфраструктурой экосистем (сложности)
Кстати, этот пример мне кое-что напоминает:
Нестабильная цифровая инфраструктура
Итак, у нас есть 4 уровня: устройства, хаб (автоматизации, программное управление), сервера, интерфейс (приложения, голосовые ассистенты, итд). Экосистема — это все 4 уровня и их связь, а не какой-то один. Чтобы все работало идеально, мы делаем не просто один из уровней, например, систему автоматизации на уровне хаба. Мы делаем все три верхних уровня: приложение, голосовой ассистент, облако и хаб с максимальной поддержкой устройств других производителей, таким образом получая максимальную совместимость и интеграцию всей системы из коробки: автономную, приватную, независимую и безопасную. Это - МажорДом.
Архитектура экосистемы умного дома MajorDom
Чем наша система будет умнее: наша философия
В фундаменте своей работы мы закладываем следующие принципы:
Полная приватность личных данных — дом не место для чужих глаз. Конфиденциальность — базовое право каждого пользователя.
Автономность — максимальная независимость от внешнего мира, отключенный интернет не должен стать проблемой
Легкость настройки и использования — технологии должны служить человеку, а не наоборот
Максимальная поддержка разных устройств, протоколов и интеграций - в дополнение к предыдущему пункту
Никаких искусственных ограничений — не быть эпл и дать возможность глубокой настройки и кастомизации тем, кому это нужно
Итак, мы собираемся заново изобрести умный дом. По нашему мнению, настоящий умный дом состоит из невидимой армии устройств, которые работают автономно в фоновом режиме, улучшая вашу повседневную жизнь и прикрывая вашу спину. По сути это цифровой дворецкий.
Настоящий умный дом должен быть независимым от внешнего мира. Никаких сбоев из-за отказа интернета или случайного сервера. Это полностью автономная экосистема, которой больше ничего не требуется: ни интернета, ни облачных сервисов, ни даже человека.
В то же время система должна быть простой в использовании. Никаких долгих установок и настроек. Отсутствие периодического изменения настроек. Никакого написания кода. Просто достать из коробки и включить. Технологии должны работать на вас, помните?
Описание MajorDom
Но как нам это сделать? Прежде всего, системе нужно имя. Мы выбрали для неё название MajorDom, которое отлично отражает её сущность. (от англ. majordomo — мажордом, дворецкий, управляющий домом)
Приватность
Пока остальные системы представляют собой черные ящики, мы считаем, что MajorDom должен иметь открытый исходный код, чтобы не было никаких скрытых манипуляций, любой человек мог открыть его, прочитать, выделить проблемы, предложить изменения или даже внести свой вклад.
Хотя исходный код общедоступен, данные пользователя защищены как никогда раньше. Чтобы сделать систему приватной и автономной, большая часть данных хранится локально на устройствах, в основном хабе. Это гарантирует конфиденциальность, а поскольку все данные хранятся локально, автоматизация и все остальные функции прекрасно работают даже при отсутствии интернета в отличие от систем, которые всегда полагаются на подключение к серверу, поскольку все данные хранятся где-то в интернете.
Но в некоторых случаях данные необходимо передавать через интернет, например, с помощью удаленного управления, когда вы не дома. В этом случае данные надежно шифруются (end-to-end), а ключи хранятся только на физических устройствах пользователя. Это означает, что вы всегда можете получить удаленный доступ к своему дому, но только вы и никто другой, включая админов и разработчиков.
Поддерживаемые устройства
Конечно, прежде чем настраивать автоматизации, в доме нужны устройства. Zigbee Alliance, переименованный в Connectivity Standards Alliance или CSA, — это объединение различных компаний, занимающихся умным домом, которые решили создать универсальный протокол связи для всех устройств домашней автоматизации. Они назвали этот протокол Matter. И MajorDom с ним совместим. Это означает, что вы можете добавить любое совместимое с Matter устройство в свою систему MajorDom. И это еще не все.
matter протокол
Matter изначально поддерживает только самые распространенные базовые устройства, поэтому мы создали протокол связи Merlin. Благодаря более гибкой архитектуре он не только существенно расширяет список поддерживаемых устройств, но и делает его бесконечным.
Мерлин протокол
В то же время мы понимаем, что сегодня только малая часть уже выпущенных устройств поддерживает один из этих протоколов, поэтому мы также собираемся добавить интеграции устройств, использующих zigbee, z-wave, wifi и BLE, таким образом став самой универсальной экосистемой.
Умная комната с устройствами на разных протоколах в системе MajorDom
Интерфейс
Мобильное приложение MajorDom на фоне хаба
Мы наконец-то собрали в одном месте все устройства, но как с ними общаться? Для этого мы разработали красивое мобильное приложение, доступное практически на всех платформах, включая устройства Android — телефоны, планшеты и часы, а также устройства Apple — iPhone, iPad, Mac, Apple Watch, Apple TV, CarPlay и даже новый шлем Vision Pro. Приложения так же включают виджеты, которые можно разместить на домашнем экране, экране блокировки или в любом другом месте, поддерживаемом операционной системой, что позволит управлять домом даже не запуская приложение.
По-настоящему умный дом большую часть времени должен работать автономно, в фоновом режиме, чтобы вы этого даже не замечали. Но как мы собираемся это автоматизировать, если никто не хочет писать скрипты?
Вместо этого:
Скрипты для автоматизаций умного дома
Для автоматизации мы добавили в приложение вторую вкладку, которая поможет легко настроить любой сценарий. Но это было слишком просто и мы пошли дальше.
Приложение MajorDom: вкладка автоматизаций
Чтобы еще больше упростить этот процесс, мы изобрели технологию умных предложений, которая предсказывает, что вы хотите автоматизировать. Иногда она настолько умна, что даже не требует помощи пользователя. Например, вы можете просто добавить все устройства и начать использовать их, не добавляя никакой автоматизации или сценария. Через некоторое время эта технология предложит сцены и автоматизацию на основе ваших привычек. Вы даже можете разрешить ей добавлять сцены и автоматизации без подтверждения, полностью в фоновом режиме. Настоящие умные автоматизации.
Арчи — умный голосовой ассистент
Автоматизация — это хорошо для ежедневной рутины, но иногда требуется более индивидуальный подход. Арчи в этом профессионал. В отличие от других "ассистентов", он понимает вас с высокой точностью, знает контекст, улавливает по несколько сложных запросов за сообщение и общается так, будто вы разговариваете с настоящим помощником, а не просто диктуете голосовые команды!
Умная колонка MajoDom Audio с голосовым ассистентом Арчи.
Перевод: — Арчи, проверь мое расписание — У вас встреча с командой разработки в 3 часа и планы на ужин в 7. Также, не забудьте, что сегодня день рождения у вашей мамы. У вас есть достаточно времени на звонок между 4 и 6 часами вечера
Арчи предназначен не только для контроля дома, но и для каждого аспекта повседневной жизни, от управления заметками до предоставления общей информации и голосовых уведомлений.
Как настоящий профессиональный мажордом, Арчи говорит на многих языках. Он может одновременно слушать до трех заранее выбранных языков и отвечать на соответствующем.
Арчи унаследовал все основные ценности MajorDom: конфиденциальность, автономность, простота в использовании и настоящая умность. Он может работать офлайн, но интернет расширяет его возможности до неограниченного диапазона, а благодаря использованию крупных языковых моделей, навыки этого ассистента ближе к настоящему искусственному интеллекту, чем когда-либо прежде в истории человечества.
Демонстрация голосового ассистента Арчи в мобильном приложении MajorDom на фоне умной колонки MajorDom Audio и хаба MajorDom Hub.
Работа из коробки: делаем свои устройства
"Люди, серьезные на счет софта, должны делать своё железо" — эта цитата особенно актуальна для умного дома. Это единственный способ обеспечить беспроблемную интеграцию множества протоколов из коробки. То же самое касается ассистента: не каждая платформа потянет офлайн распознавание, обработку и синтез речи. К тому же, полностью доверять ему можно только тогда, когда знаешь, что на устройстве нет постороннего ПО с доступом к микрофону. Вот почему мы разрабатываем два собственных устройства: хаб MajorDom Hub для управления устройствами, автоматизацией и порталом в экосистему — это как руки дома. И колонка MajorDom Audio для голосового ассистента — уши и голос дома.
Умная колонка MajorDom Audio и хаб MajorDom Hub
И еще кое-что… для активных пользователей
Мы хотим максимально упростить интеграцию идей пользователей — будь то аппаратное или программное обеспечение. С этой целью мы спроектировали два основных инструмента, позволяющих каждому внести свой вклад.
«Idea Forge» (Кузница идей)
Во-первых, при разработке MajorDom мы создали «Idea Forge» (Кузницу идей). Эта платформа превращает предложения пользователей в реальные фичи. Любой желающий может предоставить идеи через форму на сайте. Необязательно быть программистом; достаточно одной светлой мысли. Эти предложения затем появляются на доске голосования сообщества, что позволяет каждому влиять на процесс разработки. Демократия в действии. Самые популярные идеи рассматриваются к реализации командой MajorDom. Речь идет не только о пользователях; речь идет о превращении пользователей в создателей.
Но это не просто игра в ожидание. Если вы любите приключения или просто не можете дождаться, вы можете засучить рукава и написать любую фичу самостоятельно.
Во-вторых, мы максимально упрощаем работу для всех разработчиков. Разрабатываем модульную прошивку хаба с поддержкой плагинов и удобные библиотеки с подробной документацией.
Заключение
На данный момент проект находится в стадии активной разработки, но большая часть упомянутого уже реализована, включая ядро системы, интеграции некоторых протоколов, удаленное управление, автоматизации, офлайн часть Арчи и мобильное приложение. Дальнейшие новости будем публиковать здесь, но так же рекомендую подписаться на соответствующие страницы проекта в социальных сетях. Записаться на ранний доступ можно на сайте majordom.io в один клик.
Присоединиться к проекту
Проект является довольно сложным и масштабным, а качественный результат требует много часов работы профессиональных инженеров, программистов и дизайнеров. В современном капиталистическом мире только коммерческая разработка может гарантировать стабильный результат.
Предзаказы, Кикстартер, Донаты
В будущем проект будет опубликован на кикстартер — платформу краудфандинга, на которой можно будет оформить самые ранние предзаказы устройств, но поддержать проект финансово можно уже сейчас на patreon или buymeacoffee.
Стать частью команды
В нашей команде уже есть дизайнеры, инженеры софта для фронта, бэка, мобильных приложений, хаба и голосового ассистента. В то же время мы ищем промышленных дизайнеров, embedded инженеров для железа, а так же программистов, разбирающихся в низкоуровневых деталях популярных протоколов в сфере умного дома. Если вы занимаетесь чем-то другим, но хотите присоединиться к проекту, пишите свои предложения, будем рады всем.
Инвесторам
Мы также рассматриваем получение инвестиций от $50k pre-seed раунда за долю компании. Говоря о цифрах, текущий рынок умного дома оценивается в 100 миллиардов долларов США, с прогнозируемым ростом до 600 миллиардов в 2033 году. Похоже на отличную возможность вложения.
А знаете, я считаю голосовое управление умным домом эффектным, но не эффективным. Это когда молод, и делать нечего - можно поиграться - поуправлять светом голосом.
В свое время были простые решения типа управления светом хлопаньем рук, и где это все? Это не практично. В семье из нескольких человек, особенно если есть маленькие дети, всегда стоит шум, голосове управление при шуме - это еще тот геморрой.
Более того, если приходится часто включать/выключать свет, то ничего нет удобнее и практичнее простого выключателя на стене, просто поверьте. Проще пройти миммо нажав кнопку, чем произнести фразу. Да и фраза будет не краткой, если у вас больше одного светильника кооторым Вы управляете.
Я вообще не представляю дествительно умный дом с голосовым управлением, потому что в действительно умном доме огромное количество устройств управления и датчиков.
И если это действительно умный дом, значит его прозрачность должна быть максимальная.
Т.е. Вы не должны ощущать его присутствие. И тем более не должны больтать безумолку.
Просто должны выполняться сценарии без вашего участия. Все что вне сценариев должно управляться привычными, простыми органами управления типа выключателя. В том числе, удаление 'умного дома' не должно никак сказаться на основных функциях дома - свет как могли включить выключателем, так и включаем.
Умный дом - это прозрачное дополнение, которое информирует в случае проблем и выполняет элементарные действия, которые не могут быть негативны, типа выклчения всех не основных приборов после ухода всех из дома.
А иначе - весь этот рынок просто пиар бесполезных решений, с которыми интересно поиграться и не более того.
Я еще не говорю о вопросах безопасности, надежности и прочего устройств на базе WIFI и других безпроводных решений, особенно которые завязаны на заруюежные сервисы(в том числе на сервисы не дружественных стран).
В свете широкого внедрения систем домашней автоматизации возникает потребность в более естественном взаимодействии с «умным домом». Как средство натурального взаимодействия между человеком и машиной, голосовой интерфейс заслуженно занимает высокую популярность. В данной статье я поделюсь своим опытом создания бюджетного автономного голосового ассистента для систем умного дома.
❯ Небольшая предыстория
Больше года назад я нашел в своих закромах одноплатный компьютер Raspberry Pi 4 Model B 8 ГБ. Устройство было куплено за небольшую цену в то время, когда человечество ещё не сошло с ума. Без долгих размышлений, я принял решение создать голосового ассистента на базе этого одноплатного компьютера, чтобы управлять своей системой домашней автоматизации. Бонусом к этой идее шли приватность и автономность. В итоге у меня «родилось» устройство под кодовым именем «Мария».
Но в этой статье не пойдет речь об использовании Raspberry Pi 4 Model B, так как в современных реалиях использование данного одноплатного компьютера стоимостью более $190, трудно назвать бюджетным решением.
❯ Давайте изобретать
Недавно компания Xunlong Software, которая занимается выпуском одноплатных компьютеров под маркой Orange Pi, представила интересное решение — плату Orange Pi Zero 2W с 4 ГБ оперативной памяти, стоимостью $27.
Данное решение вполне подходит для нашего проекта, как в техническом, так и в экономическом плане.
Итак, определимся с конструкцией устройства. Изучив спецификацию Orange Pi Zero 2W, у нас формируется следующий список дополнительных компонентов:
Динамик 52мм (просто он у меня уже был $1,3)
Усилитель низкой частоты (буду использовать PAM8403 $0,9 за 10 шт)
USB микрофон (xingzhaotong $1,5)
Шлейф FFC FPC 24pin тип B ($1)
RGB светодиод
❯ Разработка звуковой платы
Согласно документации, аудиовыходы реализованы на боковом разъеме FPC, а интерфейс I2S отсутствует. По крайней мере, мне не удалось его реализовать на этой плате. Таким образом, в качестве аудиовхода мы будем использовать USB-микрофон. В версии «Мария» я использовал I2S-микрофон, который продемонстрировал отличные результаты. Ниже предоставлена распиновка бокового разъёма.
Исходя из вышесказанного, в процессе разработки у нас получается следующая схема «звуковой платы»:
Так могла бы выглядеть плата при производстве на китайской фабрике:
❯ Изготовление звуковой платы
На тот момент, я разрабатывал прототип, и не было известно, как поведет себя схема звуковой платы. Поэтому пришлось выполнять изготовление прототипа платы в домашних условиях, для меня это дело привычное. Плата изготавливалась с помощью фоторезиста и вытравливалась в растворе перекиси водорода, лимонной кислоты и соли.
Немного были переживания относительно качества вытравливания мелких дорожек, но фоторезист не подвёл, всё получилось хорошо.
Ниже показано тестовое подключение звуковой платы к одноплатному компьютеру с помощью шлейфа FFC FPC:
❯ Настало время творчества! Проектируем корпус
Обычно в своих разработках я использую естественный интеллект. Поэтому пришлось придумывать дизайн корпуса самостоятельно, учитывая особенности печати 3D принтера. Разработку модели корпуса выполнял с помощью FreeCAD, результат моделирования вы можете видеть ниже.
Корпус в собранном виде
Вид снизу
Элементы корпуса были спроектированы с учетом оптимизации процесса печати, при этом качество не пострадало. В процессе печати не используются структуры поддержки. Ножки корпуса выполнены из TPU-пластика, использование флекс пластика предотвращает скольжение умной колонки по поверхности стола.
❯ Сборка умной колонки
Подключение элементов устройства выполняется по следующей схеме:
Как видно из схемы, для управления усилителем используется выход 28 (wPi 18) RPI разъёма, данный выход подключается к контакту звуковой платы с обозначением «SOUND EN». К выходам 26, 24, 22 подключается управление RGB светодиода, который выполняет функцию индикатора при выполнения запросов.
Как я упоминал ранее, в качестве микрофона используется USB микрофон марки xingzhaotong, который выглядит так:
Для установки в корпус колонки, нам необходимо его полностью разобрать и оставить только плату. Данная плата подключается согласно распиновки к соответствующим контактам на звуковой плате GND, DP, DM, VCC.
Давайте приступим к сборке устройства. Предварительная примерка платы Orange Pi Zero 2W:
Примерка динамика
Установка динамика и резонатора. Резонатор одновременно выполняет функцию фиксатора
Вид снизу
Вид сверху без верхней крышки, на верхней поверхности резонатора виден прикрепленный USB микрофон в центре будет размещен RGB светодиод.
Распечатанная на 3D принтере часть корпуса
Вид снизу собранной умной колонки. Также снизу располагаются вентиляционные отверстия для охлаждения платы
Для питания устройства используется модуль с разъёмом USB Type C, который фиксируется в специальном адаптере
❯ Немного программной части
В этой статье я не планировал описывать программную часть устройства, так как это занимает большой объем информации, лучше это сделать в отдельной статье. Но ниже будут предоставлены некоторые моменты по программной настройки устройства.
Операционная система:
В качестве операционной системы я использовал Debian Bullseye c версией ядра 6.1.31, скачать можно на официальном сайте Orange Pi.
Управление GPIO:
Для управления GPIO используется официальная библиотека Orange Pi wiringPi.
После успешной установки Orange Pi wiringPi, мы можем вывести таблицу GPIO:
gpio readall
В итоге мы увидим следующее:
Обратите внимание, что в колонке «V» указано текущее состояние пина RPI. Чтобы изменить состояние, мы можем воспользоваться следующими командами:
gpio mode 18 out # Изменение типа пина вход/выход (in/out) gpio write 18 0 # Изменение уровня пина низкий/высокий (0/1) gpio read 18 # Чтение состояние пина
Пример одного из вариантов управления GPIO из Python скрипта:
import os os.system("gpio mode 18 out") # Изменение типа пина вход/выход (in/out) os.system("gpio write 18 0") # Изменение уровня пина низкий уровень os.system("gpio write 18 1") # Изменение уровня пина высокий уровень os.system("gpio read 18") # Чтение состояние пина
Проверка наличия микрофона в системе:
Чтобы убедиться в правильности подключения микрофона, в консоли необходимо выполнить следующую команду:
Как видим из вывода, устройство USB PnP Sound Device успешно определилось в системе, если устройство отсутствует, то необходимо убедиться в его корректном подключении.
Настройка аудиовыхода:
Чтобы сконфигурировать аудиовыход под наши задачи, в терминале необходимо выполнить следующую команду:
alsamixer
В консоли появится окно с аудио устройствами, нажав F6 необходимо выбрать наше устройство с именем audiocodec и выполнить настройку как отображено ниже на картинке:
После этого можно выполнить алгоритм теста аудиосистемы.
Мы используем линейный выход, поэтому наше устройство имеет имя CDC PCM Codec-0 [CDC PCM Codec-0]. Давайте протестируем вывод звука через наше устройство.
Первое что нужно сделать — это включить наш усилитель с помощью команд:
gpio mode 18 out gpio write 18 1
Далее нам необходимо запустить тест с помощью генератора шума, командой в терминале:
speaker-test -c2 -Dplughw:0,0 # plughw:0,0 - это адрес нашего звукового устройства
Вывод команды:
speaker-test 1.2.4
Playback device is plughw:0,0 Stream parameters are 48000Hz, S16_LE, 2 channels Using 16 octaves of pink noise Rate set to 48000Hz (requested 48000Hz) Buffer size range from 32 to 131072 Period size range from 16 to 16384 Using max buffer size 131072 Periods = 4 was set period_size = 16384 was set buffer_size = 131072 0 - Front Left 1 - Front Right Time per period = 2.742858 0 - Front Left 1 - Front Right Time per period = 5.461073 0 - Front Left 1 - Front Right Time per period = 0.580064
Во время теста должен наблюдаться «белый» шум из динамика, если это произошло, то подключение и настройка аудиосистемы была выполнена корректно.
❯ Итог
В этой статье я попытался описать реализацию аппаратной части своего DIY проекта голосового ассистента для умного дома. Написание статьи отнимает большое количество времени, поэтому программную часть проекта постараюсь описать в следующем материале, если вам будет интересно.
Предугадывая ваш вопрос — «Почему бы не использовать Yandex Алису и подобные коммерческие решения?», сразу же изложу свою мысль:
Я сторонник автономных решений в плане их использования в критической инфраструктуре. А системы умного дома я отношу к этим категориям, поэтому, с моей точки зрения, использование устройств, зависящих от внешних систем, недопустимо. Описанное в статье решение не использует внешних сервисов для распознавания речи, векторизации запросов, синтеза речи и управления устройствами. И, конечно, я имею полный контроль над алгоритмами моего устройства, включая приватность.
Спасибо за ваше внимание! Ниже под спойлером несколько видео работы собранного устройства.
Привет, любители технологий! Сегодня я рад представить вам S.T.A.R.K. (Speech and Text Algorithmic Recognition Kit). Если вы когда-либо мечтали создать голосового ассистента, который будет современным, продвинутым и невероятно интуитивным, S.T.A.R.K. - лучшее решение.
Почему именно S.T.A.R.K.?
Автономность и конфиденциальность: S.T.A.R.K. работает полностью на устройстве, гарантируя сохранность ваших данных.
Распознавание контекста: С S.T.A.R.K. вы можете легко определять контекст и параметры для последующих запросов, а также одновременно выполнять несколько команд.
Асинхронные команды: Запустите задачу и продолжайте использовать ваш голосовой ассистент. S.T.A.R.K. уведомит вас о завершении.
Множественные ответы: Получайте обновления в реальном времени для текущих задач, будь то мониторинг процесса загрузки или отслеживание доставки.
Продвинутый синтаксический анализ: Специальная синтаксическая система упрощает извлечение любого параметра из строк.
Расширяемость с помощью ведущих языковых моделей: Улучшите когнитивные способности S.T.A.R.K., интегрируя его с ведущими языковыми моделями, такими как ChatGPT.
Поддержка нескольких языков: Взаимодействуйте со своим голосовым ассистентом на нескольких языках.
Полная настройка: Создавайте сложные команды, интегрируйте различные голосовые или текстовые интерфейсы и даже переопределяйте существующие классы.
Поддержка сообщества: Присоединяйтесь к репозиторию STARK-PLACE и пользуйтесь библиотекой расширений от сообщества.
Присоединяйтесь к нам
Для более подробного изучения каждой функции и понимания всех возможностей S.T.A.R.K. посетите официальную документацию и репозиторий на GitHub. Если вам понравился фреймворк, не забудьте добавить звезду ⭐ репозиторию.
В предыдущей статье я рассказал о том, как возникла идея создания умного дома. Теперь я хочу более подробно рассмотреть архитектуру первой версии этой системы.
МажорДом состоит из нескольких ключевых компонентов: девайсы, хаб, облако, мост, мобильное приложение и голосовой ассистент.
Девайсы обеспечивают управление физическими устройствами в доме. С помощью радиомодулей и протокола "Мерлин", они обмениваются данными, получают команды от хаба и отправляют ему события.
Хаб является центральным элементом системы. Он обеспечивает управление девайсами и координирует их работу. Хаб хранит основную базу данных с информацией о пользователях, доме, комнатах и девайсах. Через локальный HTTP-сервер и WS-сервер, хаб предоставляет API для работы с базой данных и высокоуровневого управления девайсами.
Облако является серверной частью и играет важную роль в обеспечении авторизации пользователей. На облаке хранится база данных пользователей, домов, хабов и их права доступа. Так же в облаке хранятся модели устройств со списком параметров и система обновлений прошивок.
Мост представляет собой WS-сервер, который обеспечивает связь между хабом и удаленными пользователями через интернет. Он позволяет отправлять команды и получать информацию с хаба, не находясь в домашней локальной сети.
Таких мостов в системе может быть несколько и они могут располагаться в разных местах. Клиенты выбирают ближайший или наименее загруженный мост для минимизации задержек при обмене данными.
Одна из главных особенностей системы "МажорДом" - ее отказоустойчивость. Даже при сбое работы одного или нескольких мостов, система продолжает функционировать. Остальные доступные мосты берут на себя задачи вышедших из строя мостов, обеспечивая непрерывность обмена данными между хабом и клиентами.
Нестрашна даже полная потеря интернет-соединения на хабе. Вся логика и обработка команд происходят локально, что обеспечивает независимость от интернет-соединения и сохраняет возможность управления устройствами в локальной сети. Но такой сценарий редкость, ведь хаб может подключаться одновременно по wifi и ethernet кабелю, а в будущем будет добавлена поддержка сим-карт сотовой сети.
Управление умным домом осуществляется через мобильное приложение, которое предоставляет удобный интерфейс для пользователей. Однако на практике, роль мобильного приложения часто сводится к настройке системы, а ежедневное управление устройствами осуществляется с помощью автоматических сценариев и голосового ассистента.
Как и хаб, голосовой ассистент может работать полностью офлайн, что обеспечивает безопасность, конфиденциальность и надежность использования.
Самое главное: теперь установить систему "МажорДом" могут даже те, кто не имеет опыта в программировании. В следующей статье я поделюсь подробным руководством о том, как это сделать.
В 2019 году я впервые узнал про возможность распознавания и синтеза речи на языке python. Гугл ассистент, сири, кортана и другие ассистенты тогда были еще более ограниченными и беспомощными, чем сейчас. О добавлении своих команд речи не шло от слова совсем. Тогда я и загорелся идеей создать своего голосового помощника, который не будет уступать даже Джарвису Тони Старка.
В процессе работы над ядром, начал задумываться, где этого ассистента хостить. Держать ноут постоянно включенным не вариант, а других компьютеров у меня не было. На помощь пришли одноплатные компьютеры raspberry pi. Я хотел, чтобы мой голосовой ассистент мог включать и выключать свет, управлять светодиодной лентой и шторами. С такими задачами отлично справляется ардуино. Оставалось только найти способ передавать команды с распбери. Использовать wifi и bluetooth не хотел с самого начала. Нашел в интернете информацию про модули nrf24l01, попробовал, понравилось.
Такая система работала довольно неплохо. Но было два ключевых недостатка:
Радиус действия ограничивался чувствительностью микрофона. С хорошим микрофоном все работало идеально в пределах комнаты, но не дальше.
Для каждого параметра каждого устройства надо было добавлять одинаковые голосовые команды, в которых отличались только адрес и сообщение. Неудобно, но пока терпимо.
Для решения первой задачи, в голосового ассистента я добавил http интерфейс на джанго, который мог принимать аудиофайл или строку. В комбинации с мобильным приложением на котлине, я получил беспроводной микрофон, таким образов расширив зону работы до радиуса действия роутера, то есть с комнаты до всей квартиры и даже чуть больше. Носить телефон по дому не всегда было удобно, так что через пару дней появилось приложение и на часах на wear os, что оказалось невероятно удобным решением.
Но я захотел большего: иметь доступ к своему помощнику всегда, а не только дома. Самым простым вариантом оказалось использование телеграм-бота как интерфейс ввода-вывода. Но меня не покидало ощущение, что бот — это что-то не то. Я решил оставить его только как временное решение, пока занят разработкой чего-то лучше.
Я хотел получить возможность использовать свое мобильное приложение для доступа к ассистенту на расстоянии. Надо было всего лишь придумать способ отправить запрос на локальный джанго сервер, не находясь при этом в локальной сети. Я был готов открывать и пробрасывать порты на роутере, но провайдер не дал мне белый ip. Тогда я попробовал ngrok. В первое время работало хорошо, но в бесплатной версии сервер периодически падал и менял адрес. Вариант с впн-туннелем я отбросил почти сразу. Стоимость vps была равна стоимости подписки на ngrok, но реализация была в разы сложнее.
Тогда я вспомнил, что у меня есть бесплатный хостинг для php сайтов на beget и переизобрел Long Polling и очереди. Реализация была максимально простой: приложение отправляло запрос на хостинг. Там php код добавлял тело (json) запроса в конец массива и записывал в локальный файл. Малина дома каждую секунду отправляла запрос на чтение этого файла, после чтения массив чистился. Таким образом мне удалось отправлять команды домой из любой точки планеты страны! Аналогичным образом я сделал получение ответа от ассистента: продублировал реализацию и поменял роли. Два файла и четыре эндпоинта на бесплатном хостинге на пыхе дали мне стабильную двустороннюю связь с моим домашним помощником. Чуть позже научил ассистента самостоятельно отправлять мне сообщения, например, с номером аудитории следующей пары в начале каждой перемены. Не успел всем похвастаться в колледже, как кто-то стал спамить мне домой. Пришлось добавить авторизацию: логин и пароль задавались хардкодом в приложении, а на сервере была проверка в стиле.
if ($login == 'markparker' && $password == 'MyVeryStrongP@ssw0rd!') {};
Репозитории приложения были приватные, а сервер был вообще без репы (зачем репа на один файл до 100 строк?), так что такого уровня безопасности мне более чем хватало.
Чуть позже в системе появился первый автоматический триггер команды. Через небольшой костыль в моем приложении я смог ловить событие, когда на телефоне срабатывает будильник. Этот триггер запускал первый полноценный сценарий: одновременно открывались шторы, ассистент озвучивал время, погоду и расписание пар в колледже. Если в комнате все еще было темно, плавно включалась лампа. В этот момент я чувствовал себя настоящим Тони Старком.
Тогда я захотел добавить больше автоматических сценариев, используя датчики движения, присутствия, освещенности и так далее. В этот момент стал сильнее ощущаться второй недостаток, о котором я писал ранее. Появилось много дублирования кода, работать с которым становилось уже не так удобно. В проекте была только сущность команды, не было понятия устройств и триггеров. И тогда до меня дошло, как сильно вырос мой голосовой ассистент: я уже делал полноценный умный дом, а не вопросно-ответного помощника.
Это осознание привело меня к решению отделить голосового ассистента и сделать умный дом самостоятельным проектом, ориентируясь уже на управление устройствами, а не на голосовые команды. И я решил делать это сразу по-взрослому, с полноценным сервером, базами данных, авторизацией и мобильным приложением. Чуть позже преподаватель в колледже подсказал, что вместо моего костыля с записью массива в файл на php, можно использовать вебсокеты. Именно так я и реализую позже управление устройствами через интернет. Спасибо, Александр Анатолиевич!
В остальном общая концепция не изменилась: хаб в виде одноплатного компьютера управляет ардуинами через радиомодуль nrf24l01. Подробнее про архитектуру я расскажу в следующей статье.