Возможности AI: что делает устройство и что делает сервер
Прошивка XiaoZhi — это точка входа голосового диалога, а не среда для запуска больших моделей. Устройство отвечает за пробуждение, обработку звука, кодирование и декодирование, отображение и выполнение инструментов; распознавание речи (ASR), диалог с LLM и синтез речи (TTS) выполняет сервер. Страница составлена по исходному коду прошивки v2.5.2 и документам апстрима: где проходит эта граница, где находятся нужные переключатели и какие заблуждения встречаются чаще всего.
Как проходит один диалог
flowchart LR
A[Слово пробуждения или кнопка] --> B[Устройство: захват и обработка звука]
B --> C[Кодирование Opus, исходящий поток]
C --> D[Сервер: ASR, LLM, TTS<br>или сквозная модель Realtime]
D --> E[Opus, входящий поток]
E --> F[Устройство: декодирование и воспроизведение]
D -. сообщения stt / llm / tts .-> G[Устройство: текст и мимика]
D -. вызовы MCP .-> H[Устройство: выполнение инструментов]
- Исходящий поток: устройство кодирует моно-звук микрофона 16 кГц в Opus (кадры по 60 мс) и отправляет его серверу.
- Входящий поток: сервер присылает звук Opus; в примере из документа протокола частота дискретизации входящего потока — 24000 Гц.
- JSON-сообщения:
sttсодержит распознанный текст,llm— мимику (emotion),ttsотмечает начало синтеза речи, текст каждой фразы и конец. Поля описаны в разделе Протокол связи WebSocket. - Схемы диалога: поддерживаются и классическая потоковая схема ASR + LLM + TTS, и сквозная речевая модель Realtime; обе реализуются на стороне сервера.
За что отвечает устройство
| Этап | Что делает устройство | Условия и переключатели |
|---|---|---|
| Слово пробуждения | Офлайн-детекция на базе ESP-SR: WakeNet, для собственных слов — MultiNet; конфигурация ESP32-S3 по умолчанию использует модель «你好小智» | Kconfig WAKE_WORD_TYPE; собственное слово требует ESP32-S3 / P4 / S31 с PSRAM; записывается пиньинем через пробел, порог 1–99 (меньше — чувствительнее, по умолчанию 20) |
| Эхоподавление и VAD | ESP32-S3 / P4 / S31 используют AFE: при включённой обработке звука работают AEC и VAD; ESP32 / C3 / C5 / C6 отдают необработанный моно-PCM без AEC и VAD | USE_AUDIO_PROCESSOR включён по умолчанию; AEC на устройстве USE_DEVICE_AEC выключен по умолчанию и доступен только для плат из списка в Kconfig; AEC на сервере помечен в Kconfig как нестабильный |
| Кодирование и передача | Кодирование и декодирование Opus; WebSocket или MQTT + UDP | Протокол выбирает сервер в ответе OTA, см. Первый запуск |
| Режим прослушивания | Автоостановка, ручная остановка, Realtime; для Realtime нужна поддержка AEC | Поле mode сообщения listen принимает auto, manual или realtime |
| Отправка звука слова пробуждения | После пробуждения последние около 2 секунд звука отправляются серверу как первые данные диалога | SEND_WAKE_WORD_DATA включён по умолчанию, доступен только для слова пробуждения AFE и собственного слова |
| Отображение и мимика | Переключает мимику по полю emotion в сообщении llm | См. Отображение эмоций Emoji |
Какие типы слов пробуждения, звуковые движки и требования к PSRAM действуют для каждого чипа — в разделе Поддержка чипов и спецификации хранилища; точки расширения — в разделе Точки расширения.
Управление устройством и камера
MCP на стороне устройства позволяет LLM вызывать инструменты устройства (громкость, свет, моторы, GPIO и другое), а облачный MCP расширяет возможности самой LLM. Протокол и порядок использования — в документации MCP.
Платы с камерой регистрируют инструмент self.camera.take_photo с параметром question. Когда LLM решает его вызвать, устройство делает снимок, кодирует его в JPEG и отправляет POST-запросом multipart/form-data (поля question и file) на адрес, который задал сервер, а полученный текст возвращает как результат инструмента. Адрес и токен сервер передаёт в capabilities.vision запроса MCP initialize, см. протокол MCP; если они не переданы, инструмент возвращает «Image explain URL or token is not set». Анализ изображения выполняет сервер.
Распознавание говорящего по голосу
В README апстрима распознавание говорящего на основе 3D Speaker указано как реализованная функция. В исходном коде прошивки v2.5.2 кода для этого нет, она упоминается только в README и других документах, поэтому доступность зависит от документации сервера, к которому вы подключаетесь.
Языки интерфейса
В menuconfig в пункте Default Language 40 вариантов, и в main/assets/locales тоже 40 каталогов языков; в тексте README апстрима указано 38. Каталог языка (например, en-US) содержит OGG-звуки подсказок для цифр, приветствия, активации, настройки Wi-Fi, обновления, ошибок PIN и регистрации, а также language.json. Голосовые подсказки берутся из локализованных ресурсов, а при их отсутствии используется английский. Слова пробуждения, шрифты, мимику и фон чата можно настроить онлайн в генераторе Assets апстрима, см. Руководство по пользовательским Assets.
Частые заблуждения
- «Устройство локально запускает большую модель или TensorFlow Lite»: в репозитории v2.5.2 нет файлов TensorFlow Lite, а в исходном коде прошивки и списке зависимостей нет и ESP-DL. На устройстве работают только слово пробуждения ESP-SR и обработка звука AFE; диалог ведёт сервер.
- «В прошивку встроено подключение к конкретной LLM или голосовому сервису»: прошивка реализует только протоколы связи с сервером (WebSocket, MQTT + UDP). Какая модель используется, определяет настройка сервера; о различии между официальным и собственным сервером см. Собственный сервер.
- «У точности распознавания, задержки и энергопотребления есть стандартные значения»: апстрим не публикует показателей точности, задержки и энергопотребления для устройства; они зависят от сервера, сети и платы. На этом сайте нет цифр без источника в апстриме.
Что читать дальше
- Руководство по использованию функций: что реализовано в прошивке;
- Собственный сервер: запуск распознавания, диалога и синтеза на своём сервере;
- Протокол связи WebSocket и протокол MQTT + UDP: сообщения между устройством и сервером;
- Поддержка чипов и спецификации хранилища: звуковой движок и варианты слов пробуждения по чипам.
Источник: 78/xiaozhi-esp32 v2.5.2: main/audio/README.md, main/Kconfig.projbuild, main/mcp_server.cc, main/boards/common/esp32_camera.cc, sdkconfig.defaults.esp32s3 и README.md.