8

ИИ для управления системой "Умный дом". Мой дипломный проект

Будучи адептом идеи "вкалывают роботы, а не человек", в попытках автоматизировать свой дом, с целью больше никогда не вставать с дивана понял, что облачные решения вроде Алисы и Гугла слишком медленны, ненадежны и дороги для студента. Так еще и какая-то злобная компания будет слышать все что происходит в моем доме! На постоянной основе! В общем, было решено делать своего голосового помощника, да чтобы не просто выполнял команды, а еще и поговорить с тобой мог. Еще несколько видео с демонстрацией работы в конце поста.

Для начала пара слов о том, что имеется в безумном доме:

  • cервер Intel NUC 5I3RYK - 2 шт.;

  • USB ZigBee координатор - 1 шт.;

  • умная беспроводная кнопка– 2 шт.;

  • электромеханический замок 12в – 1 шт.;

  • умные лампочки – 1 шт.;

  • умное реле – 1 шт.;

  • датчик температуры и влажности – 1 шт.;

  • камера видеонаблюдения – 2 шт.

Установлено все следующим образом, пока оборудована только любезно выделенное мне родственниками пространство в 9 квадратных метров, но имеем что имеем:

ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост

Подключить все планируется по этой схеме. Задумка сделать архитектуру клиент-сервер связана с тем, что будет один сервер голосового помощника, который взаимодействует с УД, внешним миром, и клиенты с речевым модулем на нескольких устройствах в разных точках дома:

ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост

Реализация на данный момент выглядит так:

ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост
ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост

Все объединено в Home Assistant:

ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост

камеры китайское Г, поэтому постоянно отваливаются. на момент написания поста заменены на нормальные

С системой УД разобрались, теперь к самому помощнику. Задачи перед ним стоят следующие:

  • выполнение сценариев УД, прописанных в хоум ассистант либо внутри самого помощника

  • управление устройствами УД по отдельности по именам

  • имитация диалога с пользователем, если в сказанной человеком фразе нет команды

  • поиск информации в Интернете

В качестве языка выбрал питон. ибо просто.

Для реализации распознавания голоса была использована библиотека Vosk с маленькой готовой речевой моделью для русского языка. Большая не запускалась. Ни на процессоре, ни на видеокарте, висит и все. Ну да и бог с ней.

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

ИИ для управления системой "Умный дом". Мой дипломный проект Гаджеты, Умный дом, Голосовой помощник, Разработка, Искусственный интеллект, Программирование, Железо, Видео, Длиннопост

Логика работы, согласно поставленным задачам заключается в следующем:

  1. Помощник распознает начало фразы, в качестве триггера - резкое повышение громкости звука относительно фона. За конец фразы принято возвращение громкости в норму, равное окружающему шуму.

  2. При помощи языковой модели распознаются слова, и превращаются в массив данных, разделенных по слову

  3. Распознанные слова сравниваются с массивом имен, чтобы однозначно определить, была ли адресована сказанная фраза помощнику. При этом не имеет значения, сказано имя в начале, в конце или в середине. (Робот, включи лампу. Включи лампу Бот.) Можно использовать несколько имен.

    names = ['саша','саня','сашка','сашенька','санечка','александр','железяка','консерва','бот',"саш","сша","сани"]

  4. Распознаем, содержится ли в сказанной фразе какая-либо команда для бота. В коде команды представляют собой набор слов, которыми с наибольшей вероятностью пользователь задаст команду. Опытным путем выяснил, что при совпадении 2-х и более слов команды ее можно смело выполнять. (На этом этапе не помешало бы сделать управление каждым устройством по отдельности, то есть получение с сервера умного дома названий устройств и т.д.), но пока я до этого не дошел. Задал через "обычные" команды два сценария для управления замком двери - да и все пока. Распознал команду - отправил ее на серверную часть помощника. Серверная часть помощника провзаимодействовала с сервером Умного Дома, отправила ответ о выполнении/не выполнении команды обратно в клиент, клиент произнес ответ для пользователя.

В клиенте (первый элемент массива - название команды, последующие - содержание):

['погода на улице', 'погода','погодой','улице','за','окном','сегодня'],

['вошел в дом', 'я','дома','пришёл'],

['вышел из дома', 'я','ухожу','до','вечера'],

['доброе утро', 'доброе','утро'],

['спокойной ночи', 'спокойной','ночи'],

['вопрос вики', 'что', 'такое', 'кто', 'такой', 'такая'],

['закрыть дверь', 'закрой', 'дверь', 'заблокируй'],

['открыть дверь', 'открой', 'дверь', 'разблокируй'],

['зигби заряд', 'заряд','оставшийся','батарейки', 'заряда', 'остаток']

На сервере логика простая:

if final_command == 'закрыть дверь':

close_door_and_turn_on_lock() - функция которая общается с сервером умного дома и что-то делает

Отдельно реализована функция поиска в Википедии, триггерящаяся на слова "что такое" или "кто такой", выполняет поиск в энциклопедии и зачитывает первые два предложения. Этого достаточно для отражения сути.

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

5. Если не нашли ни команды, ни триггера для поиска в википедии, включаем сценарий имитации диалога. Он работает по методу сопоставления гештальт-паттернов, придуманным в 1983 году Джоном У. Рэтклиффом и Джоном А. Обершелпом и опубликован в журнале доктора Добба в июле 1988 года. Простым языком, мы, имя базу вопрос-ответ, сравниваем сказанную пользователем фразу с каждым вопросом в этой базе, на выходе получая массив коэффициентов подобия (на сколько заданный вопрос соответствует конкретному имеющемуся) от 0 (нет ни одной совпадающей буквы) до 1 (полное совпадение), после чего ответ, где коэффициент подобия оказался наибольшим, выводим в речевой движок и пользователь слышит ответ.

Вот и вся суть. Ниже прикрепляю несколько видео с демонстрацией работы помощника. Планы на будущее этого проекта:

  • написать код для управления каждым умным устройством по отдельности, по именам получаемым с сервера Умного дома

  • заменить метод гештальт-паттернов на какой-никакой обучающийся ИИ

  • расширить парк умных устройств, написать новые сценарии взаимодействия с ними

  • отказаться от web-сокетов в пользу restAPI