Технологии
«Hey Jack»: в блоге OpenAI для разработчиков показали голосового ассистента на Raspberry Pi с GPT-Live-1 и Codex
23 сентября 2026 года в официальном блоге OpenAI для разработчиков вышел разбор личного проекта: из LED-табло, которое автор подарил соседу по квартире, вырос голосовой ассистент Jack на Raspberry Pi с панелью HUB75 128 × 64. Разговор ведёт GPT-Live-1, полнодуплексная голосовая модель из API, поиск, календарь и картинки берёт на себя GPT-5.6 Luna через Responses API, а кадры уходят на контроллер WLED-MM по DDP.

Как подарок стал проектом
23 сентября 2026 года в блоге OpenAI для разработчиков вышел рассказ о личном проекте: LED-табло показывало пролетающие рядом самолёты, а вопрос «а что если оно умеет больше» превратил подарок в голосового ассистента.
Из железа в проекте Raspberry Pi, панель HUB75 128 × 64, контроллер на ESP32 и ассистент, которого автор со временем стал называть Jack.
Разговор идёт на GPT-Live-1 — полнодуплексной голосовой модели, недавно выпущенной в API; ещё одна модель помогает с исследованием, а рендерер отвечает за пиксели.
Автор отмечает, что не имел опыта ни с панелями HUB75, ни с контроллерами ESP32, ни с Raspberry Pi, ни с голосовыми моделями, и собирал всё вместе с Codex.
Первая версия жила на ноутбуке
На старте Codex помог разобраться с железом: по фотографиям определить важные подключения, понять роль контроллера на ESP32 и то, как панель HUB75 получает данные для отображения.
Затем контроллер заработал на WLED-MM с подтверждённым разрешением 128 × 64, после чего появились рендерер и кастомный skill: автор через Voice в десктопном приложении ChatGPT говорил, что показать на стене.
Табло умело выводить погоду, календарь, прибытие поездов метро, финансовые графики, сообщения, обратные отсчёты, фотографии, иллюстрации и собственную анимацию.
Кадры рендерер складывал в 128 × 64 RGB и отправлял по локальной сети через DDP, а контроллер на ESP32 под управлением WLED-MM выводил их на панель.
Ноутбук убрали из схемы
Слабое место было очевидным: рендерер и голосовое взаимодействие жили на ноутбуке, и стоило ему уснуть или уехать вместе с автором, как стена переставала отвечать.
Codex перенёс нужные части на Raspberry Pi: код лёг в приватный репозиторий, появились резервная копия и возможность отката, если что-то сломается.
Теперь на плате работают два небольших сервиса: голосовой отвечает за микрофон, аудио на PipeWire, эхоподавление через WebRTC, поведение при пробуждении и сне, прерывания, соединение с GPT-Live-1 и client-side delegation.
Рендерер держит анимированный экран ожидания, обновляет погоду и прибытие поездов MTA, работает с очищенными данными календаря, проверяет описания сцен и отправляет кадры на стену.
Кто что делает: GPT-Live-1, GPT-5.6 Luna и рендерер
Разделение сложилось такое: GPT-Live-1 ведёт разговор, слушает, пока говорит, позволяет себя перебить и решает, когда запросу нужно что-то за пределами самой беседы.
В этом случае Raspberry Pi получает delegation и запускает client-side запрос к Responses API с моделью GPT-5.6 Luna при низком уровне reasoning effort.
Инструменты у Luna такие: поиск в открытом вебе, подключение к календарю только для чтения, подбор переиспользуемых изображений в Wikimedia Commons и обновление стены.
Официальная документация описывает два режима: при Responses delegation запрос к бэкенд-модели готовит сам GPT-Live, а при client delegation контекст, запуск агента и возврат результата берёт на себя приложение.
Документация также уточняет, что GPT-Live слушает и говорит одновременно — это и есть полный дуплекс — и что передача работы бэкенду называется delegation.
Дальше рендерер проверяет JSON сцены и превращает его ровно в 128 × 64 RGB-пикселя, после чего кадры уходят по DDP на контроллер WLED-MM, который управляет панелью HUB75.
Что пришлось чинить
Первая заметная поломка случилась с картинками: рендерер их поддерживал, но у голосового ассистента не было инструмента, чтобы найти и отправить изображение.
Codex подключил Wikimedia Commons с проверкой лицензии и атрибуции, а изображения научились вписываться в 128 × 64 пикселей с сохранением пропорций, чтобы не растягиваться по дисплею.
Второй баг нашёлся в самой обычной реплике: после просьбы «покажи это на стене» ассистент не понимал, что означает «это», потому что приложение отправляло модели обновления экрана только последний запрос — передачу переписали так, чтобы в неё попадали недавняя переписка и предыдущие результаты.
Почему это принципиально, объясняет документация: событие delegation содержит метаданные, а не текст задачи, поэтому контекст разговора должно вести само приложение.
Что здесь полезного
Автор описывает проект как простой сайд-проект и признаёт, что в другой раз, скорее всего, остановился бы сразу после вскрытия табло, а с Codex разбирался по ходу и предлагает спрашивать Codex, если непонятно, с чего начать.
Практический вывод для голосовых интерфейсов: разговорная часть может быть управляемой моделью, но контекст, инструменты и права доступа остаются в приложении, а не в модели.