В своё время тема голосовых ассистентов как-то обошла меня стороной, и я не особо следил за их развитием. Но в какой-то момент я всё же плотно погрузился в вопрос и, наконец, наверстал упущенное. Теперь хочу поделиться знаниями с вами.
Лично у меня сходу не получилось разобраться в том, как работают эти самые ассистенты. Всё потому, что система состоит из множества взаимозаменяемых компонентов, и поначалу не совсем ясно, как они взаимодействуют, что именно нужно и куда ставить. Эта статья для тех, кто не знаком с голосовыми ассистентами, но уже имеет базовый опыт работы с Home Assistant: понимает, что такое аддоны, немного знаком с Linux или ESPHome и умеет устанавливать интеграции через HACS.
Но прежде чем перейти к ассистентам в Home Assistant, отвечу на вопрос, который может у вас возникнуть:
Зачем, если есть Алиса?
Основная причина создать своего ассистента — это возможность кастомизации:
- Персонализированного ассистента можно обучить тому, чего не умеет Алиса. Например, мой Тамагочи умеет отвечать на вопросы вроде: «Где я сейчас?», «Как далеко от дома?», «Я возвращаюсь домой или только вышел?». А ещё он знает, что у меня запланировано в календаре и когда придут заказы с Wildberries. 🙂
Да, навыки Алисы тоже многое позволяют делать, но с кастомным ассистентом всё проще: достаточно описать нужную информацию в системном промпте, а нейросети сами «переварят» её в понятный ответ. - Синтез речи тоже можно кастомизировать и использовать любые другие голоса.
- Так же свой ассистент подойдет параноикам, которые не хотят, чтобы Алиса их постоянно подслушивала. Даже если вы используете облачное распознавание речи, активация по фразе всё равно происходит локально, а софт для колонки — опенсорсный.
- Наконец, все компоненты ассистента взаимозаменяемы, что превращает его в своеобразный конструктор.
Но признаюсь честно: для управления умным домом я не использую ни Алису, ни кастомных ассистентов. Всё же я сторонник автоматизации, которая не требует голосового управления.
Тем не менее я понимаю пользу голосовых ассистентов: они дают ощущение контроля, позволяют поставить таймер, когда руки заняты на кухне, или быстро получить информацию, не отвлекаясь от дел. Ну а лично мне голосовой помощник пригодился для стримов — получился прикольный болтун, который добавляет интерактивности.
В итоге, если вы готовы собирать своего кастомного ассистента, то первое, с чем нужно разобраться, — это железо.
Что из себя представляет колонка для Home Asssitant?
По железу вариантов великое множество, но основные выглядят вот так:

Если у вас завалялась лишняя «Малинка», то можно использовать её. Нужно будет подключить к ней микрофон и динамик, а затем установить Wyoming Satellite и openWakeWord.
Если интересует более бюджетный вариант, то можно взять недорогую колонку на базе ESP32:

Это по сути уже готовая колонка от M5Stack, остаётся только накатить ESPHome с нужными компонентами и поддержкой microWakeWord. Хотя, если хочется пособирать конструктор, то можно даже спаять DIY-вариант.
Наконец, если ваш домашний сервер находится не в чулане, можно подключить микрофон напрямую к нему.
С основой колонки, надеюсь, всё понятно, давайте теперь разбираться с голосом и обработкой команд.
Софт для ассистента: распознавание, синтез речи и языковые модели
Работу голосового ассистента можно представить в виде конвейера (pipeline), где каждый этап отвечает за свою задачу: от распознавания речи до генерации ответа. Вот как это выглядит схематично:

Всё начинается с активации по фразе: колонка постоянно «слушает» происходящее вокруг и ждёт, когда вы произнесете «Окей Набу», «Джарвис» или, например, «Алиса». При этом активация по фразе всегда выполняется локально: либо прямо на самой колонке (с помощью openWakeWord или microWakeWord), либо колонка может отправлять аудиопоток на ваш домашний сервер, где и будет происходить распознавание активационной фразы.
Остальные этапы могут выполняться как локально (на подходящем железе), так и в облаке:

Локально
Когда я говорю «локально», это не значит, что всё должно выполняться прямо на колонке. После активации по фразе колонка может начать передачу аудио на ваш домашний сервер, где и будет происходить дальнейшая обработка. То есть под «локально» я подразумеваю «на домашней инфраструктуре».
Для локального распознавания и синтеза речи могут использоваться различные компоненты. Чаще всего это VOSK или Whisper для распознавания и Piper для синтеза речи — оба доступны в виде аддонов.

А для обработки диалогов можете развернуть языковую модель, например, Llama, или использовать встроенное в Home Assistant распознавание интентов.
При этом отдельные компоненты необязательно устанавливать на один сервер — их можно «раскидать» по разным железкам. Все локальные компоненты работают как микросервисы, а Home Assistant взаимодействует с этим «зоопарком» через унифицированный протокол Wyoming. По этому протоколу работают не только VOSK и Piper, но и, например, openWakeWord и Wyoming Satellite.
Если вы устанавливаете локальные компоненты в виде аддонов, то Home Assistant сам их подхватит и предложит интегрировать. Но при необходимости можно вручную прописать ссылки на все микросервисы в настройках.

Локальные ассистенты дают полный контроль над вашими личными данными и позволяют не зависеть от сторонних сервисов. Однако у них есть свои недостатки: для комфортной работы требуется мощное железо — на слабом оборудовании всё будет работать не так отзывчиво. Кроме того, поддержка русского языка оставляет желать лучшего. Если эти минусы перевешивают для вас плюсы, то можно посмотреть в сторону облачных технологий.
В облаке
С использованием облачных сервисов можно выполнять распознавание речи, синтез ответов и обработку диалогов. Схематично это выглядит так:

Разработчики Home Assistant предлагают в качестве варианта по умолчанию подписку на своё облако, но вы можете использовать и сторонние интеграции.
Например, для распознавания и синтеза речи есть вот такие опции:
А для обработки диалогов можно использовать большие языковые модели:
Их можно комбинировать с локальным распознаванием интентов: например, использовать языковые модели для сложных запросов, а локальное распознавание для простых команд и управления устройствами.

Наконец, после того как все аддоны и интеграции установлены, остается только собрать из них полноценного голосового ассистента. Давайте кратко разберём, как это сделать.
Настройка голосового ассистента
Лучше один раз увидеть, чем сто раз услышать 🙂
Надеюсь, мне удалось рассказать про голосовых ассистентов в Home Assistant хотя бы в общих чертах. Я не стал прям уж сильно углубляться и расписывать, какие кнопки нажимать — всё-таки это вводная статья. Но если у вас остались вопросы и вы хотите, чтобы я подробнее показал какие-то моменты, то напишите об этом в комментариях. 👇
Если наберётся достаточно вопросов, то можно будет устроить стрим с ответами на ваши вопросы. Будем считать, что эта статья — лекция, а стрим будет практическим занятием. 🙂
Сам стрим анонсирую позднее в Telegram: