
В этой статье я расскажу, как сделать своими руками две умные колонки, полностью поддерживающие русский язык:
1) На микроконтроллере esp32s3, используя XiaoZhi
2) На Raspberry Pi автономную голосовую колонку с камерой, которая будет работать и распознавать всё, что не только слышит, но и видит перед собой, даже при отсутствии Интернета! Без облаков, без API-ключей. С локально запущенными моделями ИИ, связка Ollama+Gemma3:1b+Moondream+OpenWakeWord+Whisper.cpp+Silero TTS
А также расскажу, как подключить обе эти колонки к Home Assistant для управления устройствами умного дома.
Содержание статьи:
Умная колонка с ESP32S3 и XiaoZhi
Сборка своей прошивки
Интеграция с Home Assistant
Видео работы готового устройства
Что можно улучшить
Умная колонка на Raspberry Pi и Ollama
Интеграция с Home Assistant
Видео работы готовой колонки
Что можно улучшить
Если не хватает производительности
Ссылки по теме
Умная колонка с ESP32S3 и XiaoZhi
XiaoZhi - это платформа, которая позволяет использовать большие языковые модели в собственных разработках. Благодаря этой платформе можно использовать модели ИИ в микроконтроллерах esp32 (и не только), создавая чатботы, роботы и тому подобные устройства. При этом это полностью бесплатно, не нужно платить за использование токенов! Нужен лишь номер телефона либо учётная запись Google для регистрации.
Поддерживаются модели: Xiaozhi Lite и DeepSeek Quantized (без ограничений), а также поддерживается модель для распознавания изображений (с лимитом по времени использования).
После привязки к своей учётной записи на Github становятся также доступны модели Qwen 3, DeepSeek Full, Doubao, а также ограниченные по времени использования GLM 4.7 и Kimi K2.
Самое главное - поддерживается русский язык, причём даже есть варианты выбора спикера - "женщина", "брутальный мужик", "ребёнок", "сумасшедшая королева", "амбициозная женщина", и звучат все эти голоса просто шикарно =)
Для реализации при помощи XiaoZhi голосовых ассистентов на микроконтроллерах предназначен open-source проект XiaoZhi-ESP32. Поддерживается offline-распознавание слова пробуждения (wake word) при помощи ESP-SR. Можно подключить OLED / LCD - экраны для отображения анимированных эмоций и озвучиваемого ответа языковой модели. Реализовано распознавание говорящего по голосу (3D-Speaker).
Благодаря поддержке MCP (Model Context Protocol) можно подключать свои самодельные устройства на esp32 к Home Assistant и управлять устройствами умного дома. Чем мы с вами в этой статье и воспользуемся. Также можно подключить к esp32 свои исполнительные устройства - реле, сервоприводы и т.д., и датчики, и управлять ими голосом через XiaoZhi.
Помимо общения и управления умными устройствами, можно просто попросить модель включить музыку - в общем, всё, как и в заводских умных колонках. :)
Есть уже готовые прошивки как для работы через Wi-Fi, так и через мобильную связь, используя модуль 4G ML307.
Вот что нам понадобится для сборки нашей умной колонки:
Плата с микроконтроллером ESP32-S3 N16R8 (16Mb Flash, 8Mb Psram), 44 контакта
Всенаправленный MEMS-микрофон INMP441
i2s усилитель MAX98357A
Динамик 4/8 Ом 2-3Вт
Экран 1.54" 240х240 на контроллере ST7789, 8 контактов
Беспаечная макетная плата (например, BB-801-2S-3P) + набор перемычек
usb type-c кабель для питания/программирования
Собираем по схеме на сайте:

Далее скачиваем прошивку (файл v2.0.2_bread-compact-wifi-lcd-240x240.zip) и софт для прошивки - Flash Download Tool. Всё распаковываем, после чего запускаем flash_download_tool_3.9.9_R2.exe и выбираем в появившемся окне ESP32-S3, WorkMode Develop и LoadMode UART:

Нажимаем "ОК", и в новом окне указываем путь к прошивке - файлу v2.0.2_bread-compact-wifi-lcd-240x240.bin, ставим галку напротив пути, указываем адрес 0х0, скорость порта 230400, номер виртуального ком-порта, к которому подключена плата (можно посмотреть в диспетчере устройств), и нажимаем кнопку "START":

После появления надписи "FINISH" нажимаем на плате кнопку RST - на экране устройства должно появится название Wi-Fi-сети и IP-адрес для подключения:

Со своего телефона или компьютера подключаемся по Wi-Fi к указанной сети, после чего с браузера открываем страницу по адресу http://192.168.4.1, где выбираем из списка Wi-Fi-сеть, через которую устройство может выходить в Интернет, вбиваем пароль и нажимаем "Connect":

Если устройство самостоятельно не перезагрузилось - принудительно нажимаем кнопку RST, после чего плата подключиться к Wi-Fi и отобразит на экране данные для подключения к платформе XiaoZhi:

Через браузер заходим на xiaozhi.me, нажимаем кнопку "Console", и регистрируемся, указав номер телефона либо авторизуясь через Google.
После регистрации нажимаем на сайте кнопку "+ Add Device" и во всплывающем окне указываем шестизначный код с экрана нашего устройства:

После нажатия на "Confirm" отобразиться карточка устройства. Нажимаем в ней кнопку "Configure Role" и выбираем роль ассистента (например, учитель по английскому), его имя, язык, спикера:

После нажатия на "Save" нас попросят перезагрузить вручную кнопкой RST устройство, чтобы настройки вступили в силу. После этого наша умная колонка начнёт наконец работать по назначению. :)
Но есть нюанс - по-умолчанию голосовая активация не работает. Чтобы начать общение с колонкой, каждый раз нужно нажимать кнопку "BOOT" на плате устройства. Если мы хотим, чтобы устройство пробуждалось по ключевому слову, без нажатия на кнопку, то нам нужно перейти на страницу Manage Devices:

Далее выбираем Theme Settings: Customize, жмём Next, и попадаем в раздел Theme Design:

Здесь мы можем как выбрать уже предобученную модель (Preset Wake Word), так и задать своё собственное слово пробуждения (Custom Wake Word). В данном примере я выбрал Sophia модели WakeNet9.
Далее выбираем Next -> Generate assets.bin, и начнётся загрузка новой прошивки в память устройства. После перезагрузки больше не нужно нажимать на кнопку для начала общения - достаточно произнести вслух ключевое слово "Софья", и устройство сразу проснётся.
Сборка своей прошивки
Готовая прошивка - это, конечно, хорошо, но как насчёт того, чтобы собрать свою?
Для этого нам нужно скачать среду разработки ESP-IDF отсюда: https://dl.espressif.com/dl/esp-idf/
выбираем ESP-IDF v.5.5.3 Offline Installer (там есть 5.3 и другие - они нам не подойдут) и устанавливаем.
Теперь нам нужно скачать репозиторий xiaozhi esp32 с исходниками прошивки нашей умной колонки: https://github.com/78/xiaozhi-esp32
Распаковываем его в уже существующую папку с примерами ESP-IDF: Espressif\frameworks\esp-idf-v5.5.3\examples\
Далее на рабочем столе выбираем "ESP-IDF 5.5 CMD" и в открывшемся окне переходим в паку Espressif\frameworks\esp-idf-v5.5.3\examples\xiaozhi-esp32-main\:

После этого нам нужно выбрать цель для сборки, указав наш микроконтроллер esp32s3. Делается это следующей командой в терминале:
idf.py set-target esp32s3
После того, как всё будет готово, вводим следующую команду:
idf.py menuconfig
Попадаем в меню конфигурации для сборки нашей прошивки:

Переходим в раздел Xiaozhi Assistant и выбираем:
Default Language: Russian
Board Type: Bread Compact WiFi + LCD
LCD Type: ST7789 240x240
Wake Word Implementation Type: Wakenet model with AFE

Далее возвращаемся в главное меню и переходим в раздел ESP Speech Recognition. Выбираем:
Load Multiple Wake Words (WakeNet9): Sophia (wm9_sophia_tts)
English Speech Commands Model: english recognition (mn5q8_en)

Благодаря этому наша колонка будет откликаться на слова "Софья / София".
Для сохранения настроек нажимаем клавишу "S", далее выходим по нажатию "ESC".
Для сборки прошивки вводим:
idf.py build
Последний шаг - загрузка прошивки в нашу колонку:
idf.py -p COM8 flash
Поменяйте "COM8" на номер ком-порта своей платы esp32. После загрузки прошивки устройство сразу будет готово к работе.
Кстати, есть расширение ESP для редактора VS Code, поэтому можно работать не из консоли, а из редактора. Про установку и настройку рассказано в этом видео: https://www.youtube.com/watch?v=XEmlCJrlPBA
Если хотите проект под эту плату отредактировать под свои нужды - файлы находятся в Espressif\frameworks\esp-idf-v5.5.3\examples\xiaozhi-esp32-main\main\boards\bread-compact-esp32-lcd
Файл локализации на русском - Espressif\frameworks\esp-idf-v5.5.3\examples\xiaozhi-esp32-main\main\assets\locales\ru-RU\language.json
Интеграция с Home Assistant
Наша умная колонка отлично работает, но ей кое-чего не хватает. Она не умеет то, что умеют колонки вроде Яндекс.Станции - управлять устройствами умного дома. Для решения этой проблемы нашу колонку можно подключить к серверу умного дома Home Assistant через MCP (Model Context Protocol). Работать это будет по следующей схеме:

Чтобы это всё работало, нужно установить и настроить Xiaozhi MCP Integration for Home Assistant, как указано в документации: https://github.com/mac8005/xiaozhi-mcp-ha
После установки задаем русские имена устройствам Home Assistant (например, "розетка"), и можно управлять голосовыми командами через нашу колонку (например, "включи розетку в спальне").
Видео работы готового устройства
Что можно улучшить
Существуют версии модулей ESP32S3 N16R8 с камерой:

Для них уже есть готовые прошивки Xiaozhi, которые вместе с инструкцией по сборке находятся здесь: https://my.feishu.cn/docx/GoGBdLVUooHARPxyTLhc9AjdnFh
У меня не было плат с камерой, поэтому в этой статье описал колонку с платой без камеры.
Умная колонка на Raspberry Pi и Ollama
А теперь давайте сделаем полностью автономную умную голосовую колонку с ИИ, которая будет работать даже без Интернета! И более того - даже без внешнего питания, при пропадании электричества =)
Зачем делать свою колонку, когда можно пойти в магазин и купить готовую? В отличии от готовых устройств, тут локальное распознавание и синтез речи, локальный ИИ, работающий даже без Интернет.
Плюсы самодельной колонки по сравнению с теми решениями, которые предлагает рынок:
финансовый вопрос использования - другие колонки работают по подписке. А наша колонка будет работать без подписок, без облаков и без API-ключей.
вопрос конфиденциальности и безопасности данных - не всегда хочется и приемлемо передавать данные третьей стороне
без интернета не работают, наша - легко
гибкость: что вам дали - тем и пользуетесь, нет возможности кастомизации под себя
Вот что нам нужно для сборки умной колонки:
Raspberry Pi 5 4-16Гб
USB-микрофон
I2S-усилитель MAX98357A
X1002 NVME HAT
NVME M.2 диск
5" LCD-экран с DSI или HDMI-интерфейсом
Raspberry Pi камера
Собираем по схеме:

Почему бы не использовать гораздо более дешёвую SD-карту? Тут дело не только в том, что SSD-диски ощутимо быстрее по скорости, но в основном в том, что при активном использовании ИИ SD-карты быстро выходят из строя, месяц-два - и карту на выброс. Так что определённо стоит раскошелиться. :)
Подключаем SSD-диск через USB NVMe-переходник к компьютеру, запускаем Raspberry Pi Imager, выбираем Raspberry Pi OS (64-bit), записываем на диск.
После загрузки Raspberry Pi 5 с диска у нас скорость чтения с него будет около 400Мб/с, проверить это можно командой:
sudo hdparm -t --direct /dev/nvme0n1
Чтобы разогнать диск с Gen.2 до Gen.3, открываем файл /boot/firmware/config.txt и добавляем в него:
[all] dtparam=nvme dtparam=pciex1_gen=3
После перезагрузки проверяем скорость:
sudo hdparm -t --direct /dev/nvme0n1
Увидим, что она поднялась в два раза - около 800Мб/с :) Важно, чтобы диск получал дополнительное питание - для этого на переходнике X1002 предназначены дополнительные контакты pogo pin, подключающиеся к пинам +5V и GND на Raspberry Pi.
Устройство собрано, теперь пора установить приложение для нашей умной колонки. Оно будет работать по следующей схеме:

Давайте разберём составляющие более подробно.
Для пробуждения колонки и определения необходимости записи речи используется OpenWakeWord. Доступны уже обученные модели (одну из таких, "Алекса", мы будем использовать в нашей умной колонке), также можно обучить свои модели, и для этого есть два пути:
Google Colab - наиболее простой и быстрый вариант, обучение занимает около часа
Notebook - более сложный и продвинутый, позволяет создавать высококачественные модели
Для преобразования речи в текст выбран Whisper.cpp. Используется модель ggml-base.bin, которая работает с русским языком.
Для обратного преобразования, из текста ответа языковой модели в речь, выбран Silero TTS. Наиболее распространён Piper TTS, который просто летает на Raspberry Pi, и у которого просто шикарно звучащие английские модели, но вот модели на русском совсем не понравились - звучат уныло. Я начал искал варианты, которые хорошо звучат на русском, и в итоге остановился на Silero TTS - работает помедленнее, плюс имеет ряд проблем (например, не проговаривает числа, для этого их приходится переводить предварительно в текст), зато модели звучат просто шикарно. :) Я использовал модель v5_ru и спикера baya для озвучки на русском и модель v3_en со спикером en_0 для озвучки на английском.
Отмечу, что тут поддерживается SSML - при помощи расстановки тёгов в тексте можно контролировать паузы и произношение (например, говорить быстро/медленно, тоном выше/ниже, делать паузы в нужном месте в N секунд).
Также существует Silero-VAD - модель для обнаружения голосовой активности (определяет, где в аудиозаписи речь, а где - тишина, когда пользователь начал либо закончил говорить).
В качестве платформы (роутера) для локального запуска моделей искусственного интеллекта выбрана широко распространённая Ollama. Из альтернатив существуют KoboldCpp и LM Studio.
В качестве текстовой модели ИИ выбрана модель gemma3:1b - из всех моделей, доступных для загрузки на Ollama, она оказалась самой быстрой на Raspberry Pi. Плюс поддерживает русский язык.
Для распознавания изображения со встроенной камеры выбрана модель Moondream. Причина - не удалось найти другую модель, которая распознавала бы изображение на Raspberry Pi за приемлемое время. На версии с 8Гб памяти она выдаёт ответ за минуту, другие модели - существенно дольше. Но есть проблема - Moondream не поддерживает русский язык. Для решения этой проблемы пришлось создать "бутерброд" - gemma3:1b вначале переводит запрос пользователя с русский на английский, далее получаем картинку с камеры при помощи rpicam-still, и вместе с запросом на английском передаём на вход модели Moondream. Полученный от неё на английском ответ также при помощи gemma3:1b переводим обратно на русский и при помощи Silero TTS озвучиваем пользователю. Получается всё равно гораздо быстрее в плане производительности, чем использовать другую модель зрения, поддерживающую нативно русский.
Собственно говоря, умная колонка не является полностью автономной - если модель не знает ответа, она берёт данные извне, используя Api поисковика Duck Duck Go (через библиотеку ddgs). Но если отключить такую возможность, колонка станет полностью автономной. :)
Установка
После сборки схемы умной колонки нам нужно установить весь необходимый софт. Исходный проект автором brenpoly выложен здесь: https://github.com/brenpoly/be-more-agent
Но он не поддерживает русский язык, работу с умным домом и некоторые другие вещи, поэтому я сделал форк и выложил в свой репозиторий: https://github.com/tzirulnicov/be-more-agent
Для начала, обновляем пакеты и ставим git:
sudo apt update && sudo apt upgrade -y
Устанавливаем необходимые библиотеки и приложения:
sudo apt install -y python3-tk libasound2-dev libportaudio2 libatlas-base-dev cmake build-essential espeak-ng git rpicam-apps
Далее, устанавливаем Ollama:
curl -fsSL https://ollama.com/install.sh| sh
Когда установка будет завершена, загружаем модели:
ollama pull gemma3:1b ollama pull moondream
Теперь нужно загрузить к себе репозиторий проекта, создать виртуальную среду и установить необходимые пакеты:
git clone https://github.com/tzirulnicov/be-more-agent.git cd be-more-agent python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Установить Whisper.cpp
cd be-more-agent git clone https://github.com/ggerganov/whisper.cpp.git cd whisper.cpp sh ./models/download-ggml-model.sh base cmake -B build cmake --build build --config Release
Чтобы заработал динамик, подключенный к Raspberry Pi через усилитель MAX98357A, нужно выполнить команды, описанные здесь: https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp?view=all
Тут появится проблема - динамик работает, а вот микрофон - нет, выводится ошибка "The dmix plugin supports only playback stream". Решение - использовать asym, для этого возьмите файл be-more-agent/asound.conf, и замените им уже существующий /etc/asound.conf и запустите sudo /etc/init.d/alsa-utils restart.
Проверить работу микрофона можно командой arecord -d 5 test.wav
Работу динамика - aplay test.wav
Если будет ошибка, что устройство не найдено - вызвать aplay / arecord c параметром --list-devices, найти своё устройство записи/воспроизведения, и внести соответствующие настройки в /etc/asound.conf
Запускаем колонку:
source venv/bin/activate python agent.py
Интеграция с Home Assistant
Управлять голосом через умную колонку устройствами умного дома через сервер Home Assistant ��ы будем, используя REST API и библиотеку home-assistant-rest-driver

Для этого нужно получить токен доступа, для этого на странице Home Assistant переходим в свой профиль, далее вкладка "Безопасность", в самом низу блок "Долгосрочные токены доступа". Создаём токен и прописываем настройки в config.yaml на нашей колонке:
home_assistant: enable: 1 url: http://[ip-адрес сервера home assistant]:8123 token: [долгосрочный токен доступа] device_id: [id устройства, которым хотим управлять голосом]
Видео работы готовой колонки
Можно распечатать корпус для этой колонки, вот конечное изделие (файлы для печати - в be-more-agent/stl):

Чтобы устройство было полностью законченным в плане функционала, реализуем работу от аккумуляторов при пропадании питания, а также возможность играть в видеоигры при помощи кнопок на корпусе. Для этого нужно добавить компоненты:
WaveShare UPS HAT 18650
Аккумуляторы 18650 2шт высокотоковые (например, Molicel 18650-P30B)
Arduino Nano
тактовые кнопки 7шт

Гербер-файлы для печати платы кнопок расположены в be-more-agent/pcb репозитория.
Если нет необходимости, чтобы кнопки работали, то можно распечатать заглушку - be-more-agent/stl/dummy-pcb.stl
Для работы кнопок можно использовать Arduino Nano, которая будет эмулировать USB-клавиатуру. Для этого предназначена библиотека Алекса Гайвера EasyHID - помимо примеров кода там же можно посмотреть схему подключения к USB (используется обвязка из стабилитрона, диодов и резисторов).
Что можно улучшить
От используемого микрофона за 100 рублей ждать хорошей работы не приходится, фразы приходится произносить вблизи микрофона. Как вариант - использовать микрофоны подороже:

конференц usb-микрофон - наиболее бюджетный вариант из представленных (около 500р), обеспечивает дальность порядка трёх метров
ReSpeaker 2-mic HAT - два микрофона, чуть дороже предыдущего варианта, требует порой танцев с бубном, чтобы заработало
Respeaker XMOS AI-powered 4-mic array - сразу определяется в системе, предназначен как раз для общения с ИИ, хорошее качество звука и дальность, но цена кусается - в 10 раз дороже предыдущего варианта
SiPeed 6+1 mic array - массив из 7 mems-микрофонов, вместе с платой с usb аналогичен по цене с предыдущим вариантом
Если не хватает производительности

Локальные модели ИИ требуют больших вычислительных ресурсов, для решения этой проблемы выпускаются платы расширения - HAT - для Raspberry PI.
В продаже есть платы расширения на базе ускорителя Hailo-8 производительностью 13 и 26 TOPS - сразу оговорюсь, что они НЕ подходят для генеративных моделей ИИ, т.к. предназначены для ускорения распознавания объектов на изображении.
Для наших нужд подходит плата расширения с ускорителем Hailo-10H - Raspberry Pi AI HAT 2+, имеющая на борту 8Гб памяти. Поддерживает запуск как больших языковых моделей (LLM), так и визуально-языковых (VLM). На данный момент поддерживаются DeepSeek-R1-Distill, Qwen2.5-Coder, Qwen2.5-Instruct, Qwen2 и Llama3.2 до 1,5 млрд параметров, но проект активно развивается.
Ещё один вариант ускорения - подключить к Raspberry Pi внешнюю видеокарту благодаря поддержки PCIe Gen 3 x1, используя плату-переходник M.2 Key E to PCIe x16. На продакшен такое - не вариант, но для экспериментов - почему бы и нет.
Если хочется большей производительности, можно использовать одноплатные компьютеры серии Jetson - например, линеек Nano B01, Orig Nano, Orin NX Super, AGX Orin, производительностью до 275 TOPS, которые как раз предназначены для запуска и использования моделей ИИ:

Вместо послесловия
В этой статье мы познакомились с платформой ИИ XiaoZhi, open-source проектом xiaozhi-esp32, запустили оффлайн языковые модели с использованием Ollama и собрали две колонки - на микроконтроллере esp32 с XiaoZhi и полностью (при условии отключения поисковика Duck Duck Go) автономную колонку на Raspberry Pi, работающую не только без Интернета, но даже и без внешнего питания. Рассмотрели возможность подключения устройств умного дома с использованием сервера Home Assistant.
Ссылки по теме:
Сборка умной колонки на ESP32: https://my.feishu.cn/wiki/Zq62wST38iuNxZkwg9JcjkSSnSd
Xiaozhi-esp32: https://github.com/78/xiaozhi-esp32
Руководство по использованию XiaoZhi на русском: https://xiaozhi.dev/ru/docs/usage/
Xiaozhi MCP Integration for Home Assistant: https://github.com/mac8005/xiaozhi-mcp-ha
Репозиторий умной колонки на Raspberry Pi: https://github.com/tzirulnicov/be-more-agent/
