Голосовой помощник Xiaozhi на SF32¶
Что такое Xiaozhi?¶
Xiaozhi — это чат-бот с голосовым управлением на основе MCP с открытым исходным кодом, получивший широкую известность благодаря реализации для ESP32 в 2025 году. Он объединяет устройство голосового взаимодействия с облачными сервисами больших языковых моделей и расширениями MCP на устройстве или в облаке. Поэтому проект служит практической отправной точкой для создания аппаратуры разговорного ИИ, а не только текстового чат-приложения.
Почему реализация на SF32?¶
78/xiaozhi-sf32 — реализация для SF32 с намеренно изменённой схемой подключения. В исходном проекте для ESP32 поддерживаются Wi-Fi и другие варианты прямого доступа к сети, а версия для SF32 использует классический Bluetooth PAN, чтобы выходить в Интернет через сопряжённый телефон. Таким образом, подключение к внешней сети обеспечивает телефон, что в конструкции с привязкой к телефону может заметно снизить энергопотребление сетевых функций самого устройства. Фактическая экономия зависит от телефона, радиосреды, доли времени, приходящейся на диалоги, а также политики управления питанием. Такой подход особенно подходит для персональных портативных устройств с питанием от аккумулятора: кулонов, значков, компактных ассистентов и небольших носимых устройств.
Это особенно полезный пример продукта, поскольку он объединяет задачи, которые часто рассматривают по отдельности: дисплей и аудиотракт, сетевое подключение через телефон, облачный голосовой сервис, активацию устройства пользователем, органы управления устройством и обновление в полевых условиях.
Результат, область применения и условия начала¶
На этой странице описан полный инженерный маршрут превращения этого примера в основу продукта. Здесь не утверждается, что Xiaozhi — это локальная LLM, работающая без сети, что все функции исходного проекта готовы к производству или что поддерживаемая отладочная плата равнозначна сертифицированному готовому изделию. Устройство получает доступ в Интернет через Bluetooth PAN сопряжённого телефона и использует для диалога облачные сервисы Xiaozhi. До принятия решения о продукте проверьте условия сервиса, владельца учётной записи, требования к конфиденциальности и безопасности, стоимость, доступность и пригодность для целевых регионов.
Результат: воспроизводимо работающий голосовой ассистент с дисплеем, который настраивается через телефон, ведёт диалог с использованием облака, управляет одной безопасной функцией устройства, восстанавливается после потери PAN-соединения и позволяет собрать данные для решения о разработке собственной аппаратуры.
Для кого: инженеры по прошивке, аппаратуре и продукту, которые уже умеют собирать и прошивать базовую конфигурацию SF32 и готовы работать с C/C++, схемами платы, настройкой Bluetooth и интеграцией облачных сервисов.
| Область | Базовая конфигурация проекта | Что подтвердить перед следующим этапом |
|---|---|---|
| Аппаратура | Один документированный целевой вариант Xiaozhi на SF32LB52, его аудио- и дисплейный тракты, загрузка через USB и источник питания. | Холодный запуск, кнопки, дисплей, микрофон, динамик, индикация зарядки/аккумулятора, если предусмотрена. |
| Подключение | Телефон, который сопрягается как sifli-pan и предоставляет Интернет через Bluetooth PAN. |
Интерфейс платы подтверждает работу PAN; потеря связи и повторное подключение воспроизводимы. |
| Сервис | Учётная запись Xiaozhi, активация устройства и настроенный агент в консоли Xiaozhi. | Запрос диалога поступает в сервис, а ответ возвращается на плату. |
| Прошивка | Зафиксированы коммит исходного проекта, ревизия подмодуля SDK, целевая плата и способ сборки/загрузки. | Чистая воспроизводимая сборка, прошивка, последовательный журнал и файл прошивки. |
| Адаптация продукта | Одно намеренно ограниченное изменение: например, оформление интерфейса, имя устройства, кривая аккумулятора или безопасный выход под управлением MCP. | После изменения исходный голосовой цикл по-прежнему проходит проверку. |
Аппаратные и программные спецификации¶
В перечне ниже задана конкретная конфигурация для сборки из исходного кода: SF32LB52-DevKit-Nano-R16N16 V1.0.0 с внешним дисплеем и аудиосхемой, описанными SiFli. Это не универсальный перечень компонентов (BOM) для всех поддерживаемых плат Xiaozhi. Если выбрана DevKit-ULP, DevKit-LCD или Xiaotangyuan, замените весь перечень на документированную конфигурацию этой платы и зафиксируйте точные компоненты поставщика и ревизию платы.
Аппаратная спецификация¶
| Компонент | Требуемые характеристики | Назначение | Статус | Где получить | Совместимость и замена |
|---|---|---|---|---|---|
| SF32LB52-DevKit-Nano-R16N16 V1.0.0 | SF32LB52JUD6, 16 MB OPI PSRAM и 16 MB SPI NOR Flash | Вычисления SF32, Bluetooth PAN, загрузка/отладка через USB, интерфейс и аудиоинтерфейсы | Обязательно | Страница продукта SiFli; официальный магазин SiFli | Не заменяйте плату вариантом Nano N4, не проверив цель сборки прошивки и бюджет памяти. Запишите ревизию PCB и ссылку на заказ у поставщика. |
| AMOLED-дисплей 1,85 дюйма, 390 × 450, и адаптер FPC с 16 на 22 контакта | QSPI-дисплей и разводка FPC из официальной схемы подключения Xiaozhi Nano | Пользовательский интерфейс | Обязательно | Официальная страница аппаратуры Xiaozhi Nano | На официальной странице нет ссылки для заказа. До признания конфигурации воспроизводимой зафиксируйте контроллер панели, ориентацию FPC, номер детали поставщика и ссылку на покупку. |
| Аналоговый MEMS-микрофонный модуль | Аналоговый выход, совместимый с MIC_BIAS, MIC_ADC и GND |
Захват голоса | Обязательно | Ссылка на компонент из официального руководства | Для замены проверьте смещение, уровень выходного сигнала, шум и акустические характеристики. |
| Усилительный модуль PAM8302 | Дифференциальный вход от DACP/DACN; выключение управляется PA30 |
Управление динамиком | Обязательно | Ссылка на компонент из официального руководства | Считайте другой усилитель изменением аппаратуры и повторно проверьте полярность включения, усиление, ток покоя и шум. |
| Динамик в корпусе | 8 Ω, 2–3 W | Воспроизведение голоса | Обязательно | Ссылка на компонент из официального руководства | При замене корпуса или импеданса повторно проверьте акустическую отдачу, температуру усилителя и ток. |
| Перемычки и макетная плата на 400 точек | Набор проводов и макетная плата, соответствующие описанному прототипу Nano | Соединения прототипа | Обязательно для описанного прототипа | Перемычки; макетная плата на 400 точек | Переходите на проверенную PCB только после успешной проверки исходных соединений и точного переноса распиновки. |
| Кабель USB Type-C с передачей данных и компьютер разработчика | Кабель Type-C с передачей данных; компьютер под Windows, Linux или macOS | Питание, прошивка, сборка и сбор последовательных журналов | Обязательно | Требования к подготовке SiFli SDK | Кабель только для зарядки не подходит для прошивки и сбора журналов. Запишите ОС и архитектуру компьютера. |
| Телефон Android или iOS с раздачей Интернета по Bluetooth | Должен сопрягаться как sifli-pan и предоставлять доступ к Интернету через Classic Bluetooth PAN |
Устройство для предоставления сетевого подключения | Обязательно | Официальная настройка PAN для Xiaozhi | Запишите модель телефона и версию ОС. Проверьте потерю соединения, повторное сопряжение и раздачу на каждой поддерживаемой комбинации телефона/ОС. |
Приведённые выше ссылки на сторонние компоненты ведут на торговые площадки и опубликованы в официальном руководстве SiFli Nano; это не гарантированные постоянные номера деталей производителя. Сохраните снимки экрана или записи заказов для проверенных компонентов, а до проектирования изделия замените каждую такую зависимость на номер детали поставщика, прошедшей квалификацию, и паспорт компонента.
Программная спецификация¶
| Пакет или сервис | Требуемая версия или ревизия | Назначение | Статус | Где получить | Совместимость и обновления |
|---|---|---|---|---|---|
| Предварительно собранная прошивка Xiaozhi для SF32 | v1.4.0 | Неизменённый образ для исходной проверки и восстановления | Обязательно на этапах 1–2 | Релиз v1.4.0 | Для Nano R16N16 выберите sf32lb52-nano_52j.zip. Не смешивайте архивы для разных плат. |
Исходный код 78/xiaozhi-sf32 |
Коммит 1d3ef641ace47fae68227e9173647fd5db01f6f5 |
Исходный код приложения и конфигурация платы | Обязательно на этапах 3–4 | Репозиторий | В статье рассмотрен этот снимок исходников. Более поздний коммит фиксируйте как новую базовую версию и повторяйте все проверки. |
| Подмодуль SiFli-SDK | Коммит 0d2de1480f735e05017c41436e655a1688063881 |
Драйверы SF32, RTOS, промежуточное ПО, скрипты инструментов и среда сборки SCons | Обязательно на этапах 3–4 | OpenSiFli/SiFli-SDK через подмодуль sdk репозитория |
Используйте ревизию подмодуля, зафиксированную выбранным коммитом приложения; не обновляйте SDK отдельно в сохранённой базовой конфигурации. |
| Графическая утилита sftool | v1.2.1; сохраните SHA-256 файла для нужной ОС со страницы релиза | Запись предварительно собранного образа и локальное восстановление | Обязательно для описанного графического сценария v1.4.0 | Релиз v1.2.1 и файлы для платформ | Запишите ОС компьютера, имя файла и контрольную сумму. Перед заменой проведите квалификационную проверку более поздней версии. |
| Инструменты на компьютере сборки | Скрипты установки/экспорта из зафиксированного SiFli-SDK; среда SCons, созданная этими скриптами | Настройка и компиляция исходного кода | Обязательно на этапах 3–4 | Официальное руководство по сборке Xiaozhi | Запишите ОС и архитектуру, результаты скриптов и экспортированную среду. Глобально установленная утилита не должна незаметно подменять среду зафиксированного SDK. |
| Облачная консоль и сервис Xiaozhi | Сервис размещён на xiaozhi.me; запишите дату проверки, владельца учётной записи, настройки агента и адрес конечной точки |
Активация, потоковые ASR/LLM/TTS и MCP в облаке | Требуется для диалога | Консоль Xiaozhi | Для размещённого сервиса пользователь не может зафиксировать версию. Считайте его работу, условия, доступность и региональный доступ внешними зависимостями. |
Выбор поддерживаемой базовой конфигурации¶
В документации SiFli по быстрому запуску Xiaozhi перечислены четыре платы с готовой прошивкой: SF32LB52-DevKit-ULP (Huangshan), SF32LB52-DevKit-LCD, SF32LB52-DevKit-Nano и плата расширения Xiaotangyuan. В руководстве по сборке из исходников сейчас указаны DevKit-ULP, DevKit-LCD и DevKit-Nano. Если проекту нужна адаптация исходного кода, выбирайте плату из списка для сборки из исходников: наличие готового образа само по себе не означает, что для платы документирована сборка из исходников.
| Плата | Когда выбрать | Что проверить перед разработкой изделия |
|---|---|---|
| SF32LB52-DevKit-ULP | Нужен документированный пример сборки ULP из исходников и сценарий оценки с питанием от аккумулятора. | Для аккумулятора, отличного от указанного в базовой конфигурации, заново откалибруйте кривую аккумулятора. |
| SF32LB52-DevKit-LCD | Нужен явный пример подключения дисплея и динамика. | Указания для AMOLED 390 × 450, ориентации FPC, разъёма SPK и кнопок KEY1/KEY2 относятся именно к этой плате. |
| SF32LB52-DevKit-Nano | Нужна компактная документированная базовая конфигурация SF32LB52. | Перед переносом разводки с другой платы уточните точную конфигурацию дисплея, аудио, питания и пользовательских органов управления. |
| Плата расширения Xiaotangyuan | Вы используете соответствующий сценарий быстрого запуска с готовой прошивкой. | Перед выбором платы в качестве продуктовой базы уточните актуальный статус сборки из исходников и возможностей адаптации. |
Этапы проекта¶
Рассматривайте этапы как контрольные точки принятия решений, а не как список функций. По итогам каждого этапа должен оставаться артефакт, позволяющий обоснованно и повторяемо принять следующее решение.
| Этап | Какое решение помогает принять | Что должно быть подготовлено |
|---|---|---|
| 1. Эталонная конфигурация | Работают ли вместе описанные плата, телефон, учётная запись и сервис без изменений? | Запись успешного контрольного диалога. |
| 2. Проверка восстановления | Сохраняет ли базовая конфигурация работоспособность при типичных пользовательских сбоях? | Протокол успешно пройденных тестов отказов и восстановления. |
| 3. Сборка из исходников | Может ли команда самостоятельно воспроизвести прошивку, не полагаясь на готовый образ? | Артефакт сборки с зафиксированными версиями и журналы. |
| 4. Контролируемая адаптация | Можно ли внести одно изменение, не нарушив эталонное поведение? | Проверенное изменение и результаты регрессионных тестов. |
| 5. Решение о продукте | Достаточно ли изучены риски аппаратуры, сервиса, безопасности и восстановления для дальнейших инвестиций? | Согласованный отчёт о готовности к продукту и передача требований на разработку аппаратуры. |
Архитектура системы и зависимости¶
flowchart LR
U["Пользователь: ключевое слово или кнопка диалога"] --> D["Устройство SF32LB52\nмикрофон, интерфейс, локальное управление"]
D --> E["Аудиотракт\nOPUS / AEC / VAD при включении"]
D <-->|"Classic Bluetooth PAN\nBNEP + IP"| P["Сопряжённый телефон\nраздача Интернета по Bluetooth"]
P <-->|"WebSocket; отдельные HTTP API"| S["Облачные сервисы Xiaozhi\nпотоковые ASR / LLM / TTS"]
S --> P --> D
D --> O["Динамик, дисплей\nи локальные действия MCP"]
В официальном руководстве по архитектуре сетевым каналом указан Bluetooth PAN поверх Classic Bluetooth; на устройстве используется облегчённый IP-стек. Основным каналом обмена данными в реальном времени служит WebSocket, а HTTP используется для отдельных вызовов API. В обзоре SiFli среди реализованных функций перечислены пробуждение по ключевому слову (KWS), непрерывный диалог, AEC/VAD, динамические выражения, векторные шрифты и локальный MCP. В других официальных материалах также описаны экранный интерфейс, управление питанием и аккумулятором, облачные расширения MCP и OTA через PAN; конкретную поддержку следует проверять для выбранной платы и версии прошивки.
В этой схеме есть четыре области отказа, которые нужно диагностировать независимо: локальная аппаратура и аудиотракт; сопряжение Bluetooth и соединение PAN; доступ к Интернету и облачному сервису; конфигурация приложения и сервиса. Успешное сопряжение по BLE само по себе не подтверждает, что плата получила доступ в Интернет или что голосовой сервис активирован.
Этап 1 — Зафиксируйте исходную эталонную конфигурацию¶
- Соберите аппаратную конфигурацию по официальной инструкции для выбранной платы. Для DevKit-LCD это включает описанное подключение AMOLED-дисплея и FPC, динамика к
SPK, использованиеKEY1для пробуждения/диалога и длительное нажатиеKEY2для выключения. - Загрузите поддерживаемую готовую прошивку по официальной инструкции Xiaozhi. В руководстве быстрого запуска рекомендуется графическая утилита; на момент публикации инструкции для версии прошивки 1.4.0 и новее загрузка из терминала не поддерживалась.
- На телефоне до сопряжения включите параметр Bluetooth Internet sharing («раздача Интернета по Bluetooth»). Выполните сопряжение с устройством
sifli-pan, затем проверьте по интерфейсу платы и статусу телефона, что установлено именно PAN-соединение, а не только сопряжение Bluetooth. В официальном руководстве отмечено: если на iOS устройствоsifli-panне отображается, может потребоваться перезапуск телефона. - Выполните официальную процедуру активации в консоли Xiaozhi на xiaozhi.me: создайте или настройте агента и добавьте код устройства, отображаемый платой.
- Проведите диалог с помощью кнопки платы или настроенного механизма пробуждения. Запишите в карточку проекта версию прошивки, модель платы, модель и ОС телефона, идентификаторы учётной записи и агента.
Критерий выхода из контрольной точки 1: после холодного запуска устройство устанавливает PAN-соединение, отображает статус активации, принимает запрос на диалог, воспроизводит ответ и показывает ожидаемое состояние интерфейса.
Этап 2 — Проверьте восстановление и критичные для продукта функции¶
Проведите эти тесты до любых изменений исходного кода. Они превращают демонстрацию в надёжную базовую конфигурацию:
| Проверка | Метод | Критерий успешного прохождения |
|---|---|---|
| PAN отсутствует | Выполните сопряжение, не включая раздачу Интернета по Bluetooth. | Интерфейс или журнал явно указывает на отсутствие PAN; после включения раздачи и повторного подключения сервис восстанавливается. |
| Потеря PAN | Отключите раздачу, разорвите Bluetooth-соединение или выйдите из зоны действия во время ожидания и диалога. | Устройство обнаруживает сбой, возвращается в состояние, из которого можно восстановиться, и подключается повторно по документированной процедуре пробуждения/переподключения. |
| Сон и пробуждение | Оставьте устройство бездействовать до перехода в сон, затем используйте предусмотренный орган пробуждения. | Пробуждение, повторное подключение и следующий диалог повторяются без перепрошивки. |
| Аудио и интерфейс | Проведите несколько диалогов при реалистичной громкости. | Речь с микрофона разборчива, воспроизведение чистое, интерфейс не зависает, сбросов нет. |
| Индикация аккумулятора | Зарядите и разрядите аккумулятор до нескольких характерных уровней. | Индикация правдоподобна; для аккумулятора, отличного от базового, требуется калибровка кривой. |
| Граница сервиса | Проверьте учётную запись/агента с заведомо отсутствующей необходимой настройкой. | Сбой сервиса можно отличить от проблем PAN и аппаратуры. |
В официальном руководстве предупреждают, что заданная для конкретной платы кривая в battery_table.c может быть неточной для другого аккумулятора. Для аккумулятора изделия запросите у поставщика данные о заряде и разряде или измерьте их самостоятельно, обновите charging_curve_table и discharge_curve_table, пересоберите прошивку и повторите аккумуляторные тесты.
Критерий выхода из контрольной точки 2: для каждой проверки записан результат, сбои отнесены к соответствующей области отказа, а каждый описанный сценарий восстановления работает без перепрошивки и ручного исправления состояния.
Этап 3 — Подготовьте воспроизводимую исходную конфигурацию¶
В репозитории SiFli-SDK подключён как подмодуль. Клонируйте репозиторий рекурсивно и зафиксируйте коммит Xiaozhi и коммит подмодуля SDK:
git clone --recursive https://github.com/78/xiaozhi-sf32.git
cd xiaozhi-sf32
git checkout 1d3ef641ace47fae68227e9173647fd5db01f6f5
git submodule update --init --recursive
cd sdk
# Windows: .\install.ps1, then .\export.ps1
# macOS/Linux: ./install.sh, then . ./export.sh
Для официального примера сборки DevKit-ULP с помощью скриптов перейдите в app/project и используйте документированный путь к внешним описаниям плат:
Точную цель сборки и скрипт загрузки ищите на официальной странице выбранной платы. Не переносите имя платы ULP или путь к собранному файлу на другую плату. В протоколе воспроизводимой сборки укажите ОС хост-компьютера, результат установки инструментов, экспортированную среду, аргумент платы, ревизии исходного проекта и SDK, журнал сборки, загруженный образ и последовательный журнал.
Критерий выхода из контрольной точки 3: чистая копия репозитория на втором компьютере (или после удаления каталога сборки) создаёт образ, проходящий все проверки этапа 2.
Этап 4 — Вносите изменения целенаправленно¶
Вносите по одному изменению, сохраняя прошивку проверенной базовой конфигурации. В официальных материалах по адаптации описаны имя Bluetooth-устройства, статическая и анимированная графика, шрифты, DFU через PAN и MCP.
| Класс изменений | С чего начать | Обязательные регрессионные проверки |
|---|---|---|
| Фирменный стиль продукта | Имя Bluetooth-устройства, статичное изображение, шрифт или анимация. | Прошивка, активация, PAN, интерфейс и диалог. |
| Аккумулятор и аппаратная часть | Кривая аккумулятора, параметры дисплея, аудиотракт, поведение кнопок. | Питание, пробуждение, аудио/интерфейс и повторные диалоги. |
| Локальное управление устройством | Узко ограниченный инструмент MCP с допустимыми диапазонами параметров и безопасной функцией обратного вызова. | Авторизация команды, недопустимые входные данные, обрыв связи во время действия, аппаратный переход в безопасное состояние и журнал аудита. |
| Облачное расширение | Внешний сервис MCP. | Аутентификация конечной точки, хранение секретов, доступность и восстановление после перезапуска, минимально необходимые привилегии и явное согласие пользователя. |
| Обновление в эксплуатации | DFU_PAN и OTA-сервер. | Определение версии, корректность CRC и разделов, прерывание обновления, откат/восстановление и происхождение образа. |
В примере локального MCP в официальном руководстве используется McpServer::AddCommonTools() из app/src/mcp/mcp_server.cc. Запрос действия от LLM следует считать недоверенным: проверяйте допустимый диапазон и состояние в функции обратного вызова, задавайте безопасные значения выходов по умолчанию и не предоставляйте необратимые, опасные или критичные для безопасности функции без предусмотренной для изделия авторизации.
В документации по OTA через PAN описаны три независимо загружаемых типа образов: код, графические ресурсы и шрифты. Адрес и размер образа следует брать из таблицы разделов. Перед включением OTA для пользователей необходимо определить правила версионирования, ограничить доступ к серверу, проверять целостность образа, протестировать прерывание обновления и предусмотреть восстановление через кабель или локальный интерфейс.
Критерий выхода из контрольной точки 4: зафиксированы выбранное изменение, способ отката или восстановления и результаты всех применимых регрессионных тестов; исходный цикл диалога и ограничения безопасности для действий устройства по-прежнему соблюдаются.
Этап 5 — Оцените готовность к продукту¶
Не переходите к разработке собственной аппаратуры, пока команда не сможет ответить на следующие вопросы:
- Какие версии телефона и ОС поддерживают выбранную процедуру подключения PAN и что делать, если они её не поддерживают?
- Каковы параметры подключения: облачная конечная точка, учётная запись, агент, конечная точка MCP и учётные данные? Кто отвечает за каждый из этих компонентов и за ротацию учётных данных?
- Какие аудиоданные, данные устройства и пользовательские данные передаются за его пределы? Как запрашивается согласие и какие действуют требования к хранению и регионам обработки?
- Каковы измеренные токи во время активного диалога, ожидания с подключением, сна, зарядки и пробуждения при использовании целевого аккумулятора и корпуса?
- Как устройство восстановится после сбоя обновления, потери телефона, недоступности облака, повреждения ресурса или неверной конфигурации?
- Какие части кода исходного проекта, сервиса, поведения модели и OTA-инфраструктуры контролирует команда продукта, а какие зависят от внешних поставщиков?
Критерий выхода из контрольной точки 5: ответы, ответственные лица и остаточные риски зафиксированы и приняты командой продукта; для каждого нерешённого вопроса определены мера снижения риска, явный перенос на более поздний этап или решение остановиться.
Передача материалов для проектирования изделия¶
Передайте выбранный компонент SF32, архитектуру питания, решения для дисплея и аудио, стратегию RF, план хранения данных и разделов, производственные тесты и допущения по восстановлению в раздел «Разработка для серийного производства». Используйте путь интеграции SF32LB52, чтобы выбрать подходящие микросхему, модуль, плату, руководство и контрольный список.
Критерий завершения проекта: этот материал выполнил свою задачу, если новый участник команды может воспроизвести выбранную базовую конфигурацию, связать каждый наблюдаемый сбой с ответственным или способом восстановления, пересобрать адаптированный образ и проверить доказательства, необходимые для решения о собственной аппаратуре. После этого материал служит руководством по разработке продукта, а не демонстрационным примером, который без проверки переносят в производство.
Основные источники¶
- Репозиторий 78/xiaozhi-esp32
- Репозиторий 78/xiaozhi-sf32
- SiFli Wiki: описание AI Xiaozhi (на китайском)
- Быстрый запуск Xiaozhi от SiFli
- Сборка Xiaozhi из исходников от SiFli
- Архитектура Xiaozhi от SiFli
- Адаптация Xiaozhi от SiFli
- Руководство SiFli по DFU_PAN для Xiaozhi
- Руководство SiFli по MCP для Xiaozhi
Последнее обновление: