Камчатка. Касатки
прислал товарищ. работает на туристическом судне
прислал товарищ. работает на туристическом судне
Будучи адептом идеи "вкалывают роботы, а не человек", в попытках автоматизировать свой дом, с целью больше никогда не вставать с дивана понял, что облачные решения вроде Алисы и Гугла слишком медленны, ненадежны и дороги для студента. Так еще и какая-то злобная компания будет слышать все что происходит в моем доме! На постоянной основе! В общем, было решено делать своего голосового помощника, да чтобы не просто выполнял команды, а еще и поговорить с тобой мог. Еще несколько видео с демонстрацией работы в конце поста.
Для начала пара слов о том, что имеется в безумном доме:
cервер Intel NUC 5I3RYK - 2 шт.;
USB ZigBee координатор - 1 шт.;
умная беспроводная кнопка– 2 шт.;
электромеханический замок 12в – 1 шт.;
умные лампочки – 1 шт.;
умное реле – 1 шт.;
датчик температуры и влажности – 1 шт.;
камера видеонаблюдения – 2 шт.
Установлено все следующим образом, пока оборудована только любезно выделенное мне родственниками пространство в 9 квадратных метров, но имеем что имеем:
Подключить все планируется по этой схеме. Задумка сделать архитектуру клиент-сервер связана с тем, что будет один сервер голосового помощника, который взаимодействует с УД, внешним миром, и клиенты с речевым модулем на нескольких устройствах в разных точках дома:
Реализация на данный момент выглядит так:
Все объединено в Home Assistant:
камеры китайское Г, поэтому постоянно отваливаются. на момент написания поста заменены на нормальные
С системой УД разобрались, теперь к самому помощнику. Задачи перед ним стоят следующие:
выполнение сценариев УД, прописанных в хоум ассистант либо внутри самого помощника
управление устройствами УД по отдельности по именам
имитация диалога с пользователем, если в сказанной человеком фразе нет команды
поиск информации в Интернете
В качестве языка выбрал питон. ибо просто.
Для реализации распознавания голоса была использована библиотека Vosk с маленькой готовой речевой моделью для русского языка. Большая не запускалась. Ни на процессоре, ни на видеокарте, висит и все. Ну да и бог с ней.
Чтобы помощник мог разговаривать с пользователем, ему нужно знать, что ответить. Скачал несколько готовых баз для чат-ботов, объединил, адаптировал. Получилась система вопрос-ответ. Тупенькая, но для начала пойдет. Объем 78.000 пар вопрос-ответ. С этим помощник сможет хотя бы более-менее осмысленно отвечать на вопросы, и это полностью локально. А беседы я с ним водить и не собирался.
Логика работы, согласно поставленным задачам заключается в следующем:
Помощник распознает начало фразы, в качестве триггера - резкое повышение громкости звука относительно фона. За конец фразы принято возвращение громкости в норму, равное окружающему шуму.
При помощи языковой модели распознаются слова, и превращаются в массив данных, разделенных по слову
Распознанные слова сравниваются с массивом имен, чтобы однозначно определить, была ли адресована сказанная фраза помощнику. При этом не имеет значения, сказано имя в начале, в конце или в середине. (Робот, включи лампу. Включи лампу Бот.) Можно использовать несколько имен.
names = ['саша','саня','сашка','сашенька','санечка','александр','железяка','консерва','бот',"саш","сша","сани"]
Распознаем, содержится ли в сказанной фразе какая-либо команда для бота. В коде команды представляют собой набор слов, которыми с наибольшей вероятностью пользователь задаст команду. Опытным путем выяснил, что при совпадении 2-х и более слов команды ее можно смело выполнять. (На этом этапе не помешало бы сделать управление каждым устройством по отдельности, то есть получение с сервера умного дома названий устройств и т.д.), но пока я до этого не дошел. Задал через "обычные" команды два сценария для управления замком двери - да и все пока. Распознал команду - отправил ее на серверную часть помощника. Серверная часть помощника провзаимодействовала с сервером Умного Дома, отправила ответ о выполнении/не выполнении команды обратно в клиент, клиент произнес ответ для пользователя.
В клиенте (первый элемент массива - название команды, последующие - содержание):
['погода на улице', 'погода','погодой','улице','за','окном','сегодня'],
['вошел в дом', 'я','дома','пришёл'],
['вышел из дома', 'я','ухожу','до','вечера'],
['доброе утро', 'доброе','утро'],
['спокойной ночи', 'спокойной','ночи'],
['вопрос вики', 'что', 'такое', 'кто', 'такой', 'такая'],
['закрыть дверь', 'закрой', 'дверь', 'заблокируй'],
['открыть дверь', 'открой', 'дверь', 'разблокируй'],
['зигби заряд', 'заряд','оставшийся','батарейки', 'заряда', 'остаток']
На сервере логика простая:
if final_command == 'закрыть дверь':
close_door_and_turn_on_lock() - функция которая общается с сервером умного дома и что-то делает
Отдельно реализована функция поиска в Википедии, триггерящаяся на слова "что такое" или "кто такой", выполняет поиск в энциклопедии и зачитывает первые два предложения. Этого достаточно для отражения сути.
Говоря в общем о взаимодействии сервера и клиента, в данный момент я использую веб-сокеты для передачи информации между ними. Позднее планирую перейти на restAPI, чтобы сервер и клиент равноправно триггерили друг друга на выполнение каких-то действий. То есть чтобы например сервер, анализируя погодные условия, мог послать в клиент фразу для произношения "через два часа начнется дождь".
5. Если не нашли ни команды, ни триггера для поиска в википедии, включаем сценарий имитации диалога. Он работает по методу сопоставления гештальт-паттернов, придуманным в 1983 году Джоном У. Рэтклиффом и Джоном А. Обершелпом и опубликован в журнале доктора Добба в июле 1988 года. Простым языком, мы, имя базу вопрос-ответ, сравниваем сказанную пользователем фразу с каждым вопросом в этой базе, на выходе получая массив коэффициентов подобия (на сколько заданный вопрос соответствует конкретному имеющемуся) от 0 (нет ни одной совпадающей буквы) до 1 (полное совпадение), после чего ответ, где коэффициент подобия оказался наибольшим, выводим в речевой движок и пользователь слышит ответ.
Вот и вся суть. Ниже прикрепляю несколько видео с демонстрацией работы помощника. Планы на будущее этого проекта:
написать код для управления каждым умным устройством по отдельности, по именам получаемым с сервера Умного дома
заменить метод гештальт-паттернов на какой-никакой обучающийся ИИ
расширить парк умных устройств, написать новые сценарии взаимодействия с ними
отказаться от web-сокетов в пользу restAPI
1) Принесли со словами «купили в сервисе в ТЦ, что-то сенсор на дисплее тупить стал и FaceID плохо работает»
замена дисплея на оригинальный переклей, замена АКБ, полная чистка под микроскопом. для разборки аппарат пришлось буквально разрывать)
2) Принесли из другого сервиса - «наш сборщик профи, это по любому запчасти бракованные, посмотри что именно сдохло»
Денег взял как за полноценное восстановление сокета. Ибо нехер.
3) Человек сам менял тачскрин. «Чет не заработало, что-то из него высыпалось помню, я думал это мусор»
Кроме коннектора благо ничего не оторвали.
4) Последствия самостоятельной чистки старичка HP. Хорошо хоть акб у аппарата мертвый, и матрицу с питанием не получилось у человека передернуть…
Шлейф восстановили.
пришла с зависанием на синем огоньке смерти. со слов клиента не ронял, не бил. :)
был помню похожий случай - пришла мадам с убитым в хлам «самсунгом». половины кнопок на клавиатуре не хватает, петли вырваны, ноутбук хрустит, пердит, разъем питания выломан под корень, матрица моргает…… в общем потенциальный труп, отнести бы на помойку да забыть. пришла и слезно умоляла восстановить именно его. объявил стоимость в 7.500 за все работы, причем уже с учетом большой скидки. мадам все равно торгуется, упрашивает сделать подешевле, не менять клавиатуру и обойтись всем самым дешевым и необходимым. все мы люди, и ситуации бывают разные - подумал я. может ей учиться надо, а возможности купить другой нет. взялся восстановить за смешные 3 тыс. за два дня выправил ей корпус, заменил разъем питания, шлейф матрицы, очистил плату от грязи, поменял термоинтерфейсы и восстановил петли, даже весь ноут тряпочкой со специальным очистителем протер, чтобы человеку приятно было. это был максимум, который можно было сделать с этим трупом. топкейс ноутбука получилось закрыть только с зазором примерно в 0.5мм со стороны матрицы - такая особенность конструкции ноутбука, что вырванные петли нельзя ослабить, и соответственно клея и пластика для их восстановления пришлось лепить ну очень уж много. в итоге пришла мадам эта, вся из себя… и началось… и разъем ей не такой впаяли (я устанавливал оригинальный))), и выглядит все хуже чем было, и не работает ничего…. напоминаю, за 3 тыс рублей при стоимости работ в десятку минимум. бодались мы с этой дамой минут 15, сначала я пытался обьяснить, что матрица не моргает, ноут заряжается, крышку теперь можно спокойно открыть…. все без толку. забрал у нее документы о сдаче ноутбука в сервис и со словами «не платите, и идите туда где вам сделают лучше» отправил восвояси, ибо нервы дороже себестоимости запчастей, которые я под него закупил.