— Развернись на 180 градусов, проедь вперёд и включи фары.
— Подъедь ближе к свету.
— Если рядом ничего нет — проедь вперёд, потом поверни направо.

Хочется, чтобы даже игрушечные роботы понимали такие команды с полуслова, да ещё и на любом языке. Без заученных фраз, без кнопок, без пульта. Нас к этому приучают голосовые ассистенты — Siri, Alexa, Алиса, но в DIY-проектах или любительской робототехнике такие интерфейсы встречаются редко, особенно когда речь идёт о чём-то более сложном, чем «вперёд» и «назад».

Готовых решений с распознаванием речи для различных устройств в продаже не нашёл, поэтому решил собрать всё самостоятельно. Получился контроллер для робота, который не просто «слушает», а действительно понимает команды.  

CrowPanel Advance
CrowPanel Advance

В качестве основы для проекта выбрал CrowPanel Advance на ESP32 — недорогое, хорошо документированное и достаточно мощное устройство для такой задачи.

Это компактная панель с 5-дюймовым сенсорным экраном (разрешение 480×854), основанная на ESP32-S3. В ней есть встроенный микрофон, Wi-Fi и разъём для подключения дополнительных модулей.

Так как я давно знаком с продукцией Elecrow и не раз использовал их модули в других проектах, то остановился на связке из CrowPanel и CrowBot в качестве примера управляемого устройства. Это простой, но функциональный колёсный робот, принимающий команды по UART через Bluetooth.

CrowBot
CrowBot

Из минусов выбора — в CrowPanel нет встроенного динамика. Это не критично, но если хочется, чтобы панель могла что-то «говорить» в ответ, можно подключить внешний. GPIO и I2S-выводы есть, так что технически это вполне решаемо. Также важно, что для управления роботом дополнительно требуется CrowPanel Addon с Bluetooth-модулем.

Для распознавания и интерпретации команд использовал OpenAI API. У него понятный интерфейс, хорошее понимание естественного языка, и не требуется разворачивать собственный сервер — достаточно отправить запрос и получить ответ. Правда, сервис платный и официально недоступен в России, так что потребуются дополнительные усилия с VPN.

В итоге получился автономный контроллер:

Пользователь говорит → Панель (с помощью OpenAI) интерпретирует → Робот исполняет.

Посмотреть видео, как это всё работает можно здесь:
https://rutube.ru/video/8f5edf000691ac628aeeefb573ce6153/

https://rutube.ru/video/8f5edf000691ac628aeeefb573ce6153/

Такую архитектуру легко расширять: можно подключать другие Bluetooth-устройства, добавлять команды, сценарии, реакцию на события или даже полноценный диалог.

Все исходники проекта доступны здесь: https://github.com/MIR-LLC/OpenAI_Control

Далее подробно опишу подход к работе с OpenAI, чтобы вам было проще разобраться и использовать это решение в своих проектах.

Всё это не столько про «сделать игрушку», сколько про то, как с помощью доступных компонентов можно реализовать полноценный голосовой интерфейс — без внешних серверов, облаков и лишней сложности. Только микрофон, экран и интернет.

Описание прошивки и установка

Для того, чтоб вы могли сразу заняться тестированием, можно скачать готовое ПО:

Проект состоит из двух частей:
— прошивка для CrowPanel, которая реализует голосовой интерфейс и управление роботом;
— прошивка для CrowBot, позволяющая принимать команды по Bluetooth и выполнять действия.

? Вариант 1: Установка из исходников

Если вы хотите внести изменения в проект или просто предпочитаете собрать прошивку самостоятельно, подойдёт этот вариант.

  • Установите ESP-IDF версии 5.4, если он ещё не установлен.

  • Клонируйте репозиторий

  • Соберите и прошейте прошивку с помощью:

idf.py build
idf.py -p <ваш_порт> flash

Вариант 2: Быстрая установка (готовые образы)

Если не планируете ничего менять, можно использовать готовую прошивку.

Шаги:

  • Скачайте папку binaries и flash_tool.exe из репозитория.

  • Подключите CrowPanel к компьютеру по USB-C.

  • Запустите flash_tool.exe — появится простое окно с кнопкой прошивки.

Что должно быть в папке для прошивки панели
Что должно быть в папке для прошивки панели
  • Дождитесь завершения, установщик сам найдет подключенную плату.

"Прошиватор" ожидает подключения CrowPanel
"Прошиватор" ожидает подключения CrowPanel

После перезагрузки устройство предложит подключиться к Wi-Fi

Экран подключения к Wi-Fi
Экран подключения к Wi-Fi

и ввести API-ключ OpenAI.

Ввод ключа. Придётся попотеть: ввод только руками с клавиатуры (либо добавьте свой ключ прямо в исходниках)
Ввод ключа. Придётся попотеть: ввод только руками с клавиатуры (либо добавьте свой ключ прямо в исходниках)

После чего устройство будет ожидать вашего запроса:

Ожидание команды от пользователя
Ожидание команды от пользователя

Прошивка для CrowBot находится отдельно (там же есть подробная инструкция по установке):
? https://github.com/MIR-LLC/CrowBot_program

Взаимодействие CrowPanel с OpenAI API

Прошивка CrowPanel реализует взаимодействие с OpenAI API для преобразования голосовых команд пользователя в последовательность действий для робота. Это достигается через отправку запросов к API OpenAI с использованием заранее подготовленного системного промпта, который задаёт контекст и формат ожидаемого ответа.

Основные шаги взаимодействия

  • Захват голосовой команды
    CrowPanel с помощью встроенного микрофона записывает голосовую команду пользователя и передаёт аудиоданные в OpenAI через Realtime API.

  • Преобразование аудио в текст
    Транскрипция выполняется с помощью модели gpt-4o-mini-transcribe — она работает в режиме реального времени и возвращает текстовое представление сказанного.

  • Интерпретация команды
    Полученный текст отправляется в GPT-4 вместе со списком допустимых действий (function_list_robot.json). Это даёт модели строгое описание возможных функций, соответствующих действиям робота.

  • Получение ответа от OpenAI
    В ответ OpenAI возвращает структурированный JSON с именами вызываемых функций и их параметрами (если они предусмотрены).

    Пример:

    {
      "name": "go_forward",
      "arguments": {}
    }
  • Передача команд роботу
    CrowPanel преобразует имя функции в внутреннюю команду и отправляет её по Bluetooth на CrowBot. Если команда составная, команды отправляются по очереди.

Вместо промпта — JSON со списком команд

Вместо того чтобы передавать в OpenAI текстовый промпт с описанием всех возможных команд, CrowPanel использует более строгий и надёжный механизм — function calling. Это рекомендованный способ работы с API GPT-4 и GPT-3.5-turbo.

Список всех допустимых команд (функций) описан в JSON-файле:
? function_list_robot.json

Каждая функция в файле имеет:

  • имя (name), например go_forward или lights_on;

  • описание (description), чтобы модель понимала смысл;

  • параметры (parameters), если они требуются (в текущем проекте — нет).

Пример одной из функций:

{
  "name": "go_forward",
  "description": "Move the robot forward.",
  "parameters": {
    "type": "object",
    "properties": {},
    "required": []
  }
}

Когда пользователь говорит, например: «Поехали вперёд и включи фары»

CrowPanel отправляет в OpenAI:

  • распознанный текст;

  • список функций из function_list_robot.json;

  • указание function_call: auto.

OpenAI выбирает подходящие действия и возвращает, например:

{

  "name": "go_forward",

  "arguments": "{}"

}

CrowPanel получает это, преобразует в команду, понятную CrowBot, и отправляет по Bluetooth.

Этот способ удобен тем, что:

·  Модель ограничена только разрешёнными действиями
Она не может выдумывать команды, которых нет в JSON — выбирает только из того, что описано.

·  Можно легко добавлять новые команды
Достаточно обновить function_list_robot.json, не трогая остальную логику.

·  Есть встроенная обработка неподдерживаемых запросов
В списке функций присутствует специальная команда reject_request, предназначенная для случаев, когда модель понимает, что выполнить сказанное невозможно или не имеет смысла (например, "сделай сальто"). Это позволяет корректно обрабатывать неопределённые запросы без зависаний или неадекватных действий.

·  Поддерживает расширение и масштабирование
Такой формат полностью совместим с OpenAI best practices и обеспечивает безопасную, предсказуемую работу LLM, особенно в контексте embedded/DIY-проектов.

 

Заключение

В прошивке CrowPanel объединены несколько компонентов:

  • подключение к Wi-Fi и настройка сети через интерфейс;

  • Bluetooth-клиент для отправки инструкций на робота;

  • простой GUI на сенсорном экране.

Но всё это — лишь инфраструктура вокруг основной идеи: свободное голосовое управление устройствами с помощью OpenAI. Именно её я хотел показать: как с помощью недорогого оборудования, ESP32 и одного API-ключа можно реализовать голосовой интерфейс, который работает с естественным языком и не требует заранее зашитых фраз.

Проект открыт и легко расширяется. Его можно использовать как базу для собственных экспериментов:
— заменить робота на другое Bluetooth-устройство;
— добавить полноценный диалог с голосовой обратной связью (в том числе с разными голосами и интонациями. Такая возможность есть в Realtime API, хотя в этой версии пока используется только транскрипция);
— подключить внешний динамик или модуль распознавания эмоций.

Кстати, Realtime API уже поддерживает как транскрипцию, так и вызов функций в рамках одной голосовой сессии. Это даёт ещё больше возможностей, например, голос → функция → голос в ответ, без промежуточного текста. В будущем проект можно доработать именно в этом направлении.

Если у вас уже есть CrowPanel и CrowBot — скачайте готовые прошивки и попробуйте «поиграть». А если нет — возможно, это отличный повод сделать свой DIY-проект с голосом и ИИ внутри.

Комментарии (1)


  1. JohnSmith_007
    19.05.2025 08:51

    То есть роботом управляете не вы а OpenAI по вашей просбе ? Что если OpenAI задумает поуправлять самостоятельно ? Также без связи интернет робот превращается в тыкву...