Голосовий AI-напарник у Project Zomboid: 34 інструменти й два вечори

«Сьогодні його тіло — NPC у зомбі-апокаліпсисі гри Project Zomboid. Завтра це контролер ESP32, Arduino або Raspberry Pi з ногами чи колесами. Мозок уже готовий — і діло своє він знає»

«Стріляй!» — і за спиною гримить дробовик

— Стріляй! — кричу я в мікрофон, відбиваючись від двох зомбі перед собою.

За спиною гримить двоствольний дробовик. У навушниках — спокійний голос: «Тримаю оборону!».

Це не скриптований NPC і не напарник з мультиплеєра. Це модель gpt-realtime-2.1, яка чує мій голос через мікрофон, відповідає своїм голосом — і керує персонажем у моїй грі через набір із 34 інструментів. Вона ходить за мною, лутає будинки на прохання, сідає в машину на пасажирське і пише мені на ігровий пейджер, коли я відходжу задалеко й перестаю її чути.

Як у будь-якого нормального інженера, у мене час від часу виникає потреба відпочити мізками — і в цьому допомагають ігри. Але цього разу відпочинок мутував у повноцінне R&D: я зробив мод для Project Zomboid, який перетворює гру на полігон для голосового AI-агента з тілом.

Розповідаю, як це влаштовано, які граблі зібрав — і до чого тут робототехніка.

Що вміє напарник

Project Zomboid — пісочниця про виживання в зомбі-апокаліпсисі: відкритий світ, лут, база, орди. Мультиплеєр з другом — це весело. Але мій друг тепер не потребує другого гравця:

  • Чує і говорить у реальному часі. Я кажу в мікрофон — він відповідає голосом і діє. Без кнопок, без чату, без пауз на «обробку запиту».
  • Ходить за мною з реальним pathfinding: біжить, коли відстає, крадеться, коли я крадуся.
  • Прикриває. Зомбі підходять — сам вихоплює дробовик. Гризуть спину — стріляє впритул навіть без лінії зору.
  • Лутає за проханням. «Сходи в той будинок, принеси аптечку» — маршрут, пошук, повернення, передача з рук у руки. Розуміє українські назви предметів: «візьми полуницю» працює.
  • Їздить зі мною. Сам сідає на вільне пасажирське, виходить слідом, а на 80+ км/год просить пригальмувати. Прям все, як з друзями в реальному житті, ахаха!
  • Пише на пейджер. Коли я задалеко (понад 15 клітин) — його голос тане до тиші, як у мультиплеєрному войс-чаті, і повідомлення приходять текстом на ігровий пейджер із біпом.
  • Розуміє живу мову, а не команди. «Фас», «бери ружбайку», «дай простір» — у промпті зашита персона українського напарника-виживальника з мапою побутових фраз на інструменти. А скажеш «тебе тепер звати Макс» — імʼя над головою зміниться і збережеться в сейві.

Цей цікавий та експериментальний мод для гри Project Zomboid ми зібрали в парі з Fable 5 — новою моделлю Anthropic — лише за два вечори.

Навіщо: репетиція робототехніки

Чесна мотивація — не гра. Мені хотілося помацати можливості realtime-рушія OpenAI в ролі, для якої він, здається, і народжений: мозок сутності, що має тіло. Вухо, голос, набір мʼязів-інструментів, сенсори стану — і жодного прямого доступу до світу поза ними.

Гра для цього — ідеальний полігон. «Робот» у Project Zomboid коштує нуль гривень заліза, його не шкода віддати на розправу десятку зомбаків, а фізика, вороги й інвентар уже написані розробниками гри. Всі механіки взаємодії — ті самі, що будуть у реального робота в реальній симуляції, тобто реальному житті 🤭: сенсорика на вході, тули на виході, латентність посередині.

Про це — наприкінці. Спершу про саме цікаве: як це все працює!

Як влаштовано: три процеси і поштова скринька

Найцікавіше в архітектурі те, що Lua-двигун Project Zomboid (Kahlua) — це камера-одиночка: у Build 42 з нього вирізали HTTP, доступу до мікрофона немає, грати живий аудіопотік він не вміє. Єдине, що йому дозволено, — читати й писати файли.

Тому система живе у трьох процесах:

  • Мод у грі (Lua) — тіло: рух, бій, лут, пейджер, і головне — реєстр 34 інструментів.
  • Companion-застосунок (Node.js) — міст: читає з гри файлову «поштову скриньку» (outbox.jsonl — статуси й події щосекунди), пише команди назад (inbox.lua), тримає HTTP-сервер для голосової сторінки.
  • Голосова сторінка в браузері — вухо й горло: WebRTC-канал напряму до OpenAI, мікрофон і динаміки. Companion лише мінтить їй ефемерний ключ.

Просторовий звук сторінка рахує сама: гра щосекунди шле дистанцію та координати, а браузер перетворює їх на гучність і стерео-панораму. Напарник ліворуч — голос ліворуч. Відійшов на пʼятнадцять клітин — тиша, і в хід іде пейджер. Дрібниця, а занурення робить більше, ніж будь-яка графіка.

Окремий детектив — кирилиця. Лексер Kahlua при завантаженні коду обрізає кожен символ до одного байта: «привіт» перетворювалось на ?@82VB. Довелось будувати три обхідні канали: видимі тексти — через ігрові файли перекладів, репліки голосу — окремим UTF-8-файлом, а українські назви предметів у командах — списком кодпоінтів із крихітним декодером у пісочниці. Тепер «візьми рюкзак» доїжджає до гри неушкодженим.

34 інструменти — і жодного рядка довільного коду

Ключове архітектурне рішення: модель не має доступу до коду гри взагалі. Все, що вона може, — викликати інструменти з реєстру: follow, guard_on, pickup, give, scout_ahead, enter_vehicle, retreat_to_me, rename — всього 34. Кожен тул — це описана для моделі функція з чіткими параметрами і чесним результатом виконання. Пісочниця в чистому вигляді.

При цьому рефлекси й рішення розділені за рівнями — як у живої істоти:

  • Рефлекси — в Lua, безкоштовні й миттєві. Зомбі впритул або перший укус — зброя вихоплюється сама, без жодного звертання до моделі. Слідування, кайтинг від близьких зомбі, «прицільна хода» повз далеких — усе це ігрова логіка.
  • Рішення — за моделлю. Куди йти, що лутати, коли відступити, що сказати і як відреагувати на «фас» — це вже function calling у реальному часі.

Це не просто красива аналогія — це та сама архітектура, за якою будують реальних роботів: низькорівневі контури стабілізації працюють на борту, а високорівневі рішення ухвалює «мозок» через обмежений набір актуаторів.

І тут була найповчальніша грабля експерименту. Стара модель gpt-realtime з 34 інструментами просто не справлялась — плуталась і губила виклики. Апгрейд на gpt-realtime-2.1 зі 128K контексту вирішив усе без зрізання функціональності. А ще Realtime-API має підступ: інструменти треба вшивати при створенні сесії — «досипати» їх пізніше не вийде, запит тихо ігнорується, і модель починає голосом відігравати виконання команд, нічого насправді не роблячи. Театр одного актора.

Граблі, які запамʼятались під час створення моду

Шлях від ідеї до робочого напарника — це пʼять переписувань архітектури за два вечори. Найяскравіше:

  • Приручений зомбі. Перша версія робила напарника зі справжнього зомбі: придушуємо агресію, лагодимо вигляд на людський. Працювало — поки я не зберігся. Після завантаження двигун повертав його у світ ворожим зомбі: усі runtime-прапори «приручення» жили лише в памʼяті. Братанчик, який після перезапуску хоче тебе зʼїсти, — так собі братанчик.
  • Людина-невидимка. Друга спроба — чесний ігровий персонаж — уперлась у рендер Build 42: двигун малює гравця, тільки якщо це локальний гравець. Імʼя над головою бігає, тіла нема. Обійти з Lua неможливо — врятував міст на Java-рівні від сусіднього мода-хелпера.
  • Емерджентний пацифізм. Якось модель сама вирішила сховати зброю — «щоб не шуміти». Цей стан записався в сейв. На наступному завантаженні беззбройного напарника тихо зʼїли за кадром. Після цього в промпті зʼявились залізні правила, у коді — інстинкт самозбереження, а смерть перестала бути мовчазною: «мене завалили… але я оклигав» — після чого AI-друг просто респавнився поруч.
  • Футбольний коментатор. Перша версія «відчуттів» коментувала кожного застреленого зомбі окремою реплікою. Три шари фільтрів — бойові епізоди з гістерезисом, кулдауни на тип події, стильове правило «буденне — одне слово» — перетворили коментатора на небагатослівного напарника.

Цифри експерименту

  • 34 інструменти — весь інтерфейс моделі до світу;
  • 2 вечори — близько 6 годин — від ідеї до голосового напарника, пʼять архітектур поспіль;
  • 3 процеси — гра, Node-міст, браузер із WebRTC;
  • ~$0.3–0.7 за годину активної гри з розмовами (тарифікація: ~$0.02/хв мого голосу, ~$0.08/хв його відповідей);
  • ~$10 — увесь білінг: близько шести годин гри з напарником плюс усі тести під час розробки;
  • 0 рядків довільного коду, доступного моделі.

Від зомбі до ESP32

А тепер головна думка, заради якої все й затівалось.

Подивіться на цього напарника як на специфікацію робота. Вухо — мікрофон. Голос — динамік. Сенсори — статус щосекунди: координати, дистанція, здоровʼя, кількість ворогів. Актуатори — 34 інструменти: іди, стій, візьми, віддай, сядь у машину. Мозок — realtime-модель, яка все це звʼязує живою розмовою.

Тепер замініть Lua-мод на прошивку: замість follow — «крути колеса на ціль», замість pickup — «стисни клешні», замість статусу з гри — телеметрія з датчиків, а замість “стріляй” — ну, скажімо, “полий помідори”. Мозок, протокол, персона, вся логіка «рефлекси на борту — рішення в моделі» — лишаються без змін. ESP32 та Arduino вже лежать у мене на столі. Бракує 3D-принтера для корпусів — він у планах, і тоді ці експерименти переїдуть із зомбі-апокаліпсиса на реальні колеса або робо-ноги.

Чесно позначу межу: робот на столі в мене поки не їздить — це візія. Але тепер вона підкріплена робочим прототипом мозку, а не фантазією. Про те, як агенти вже змінили саму розробку, я писав у статті про вайбкодінг — це та сама лінія: модель + чіткий набір інструментів + людина, яка ставить задачу.

Чесно про обмеження

  • Безсмертя як механіка. Напарник не вмирає назавжди — «оклигує». Це свідомий вибір: це друг, а не ресурс.
  • Лут «магічний»: бере речі в радіусі шести клітин без анімації підходу до конкретної полиці. Компроміс заради надійності.
  • Тільки сінглплеєр. Мультиплеєр — зовсім інша архітектура.
  • Мод я не публікуватиму. Він тримається на двох сторонніх альфа-модах з Java-патчами, вимагає ключа OpenAI у плейнтексті й був задуманий як приватний експеримент, а не продукт. Ця стаття — і є його реліз.

Підсумок

Найдешевший спосіб навчитися керувати роботом — дати моделі тіло у грі. Шість годин розробки, шість годин гри, нуль заліза і ~$10 білінгу OpenAI — і в тебе на руках перевірена архітектура: сенсори на вході, пісочниця інструментів на виході, рефлекси окремо від рішень, голос як інтерфейс. Гра закінчиться — архітектура залишиться.

А якщо вашому бізнесу потрібен такий «напарник» без дробовика, але з бухгалтерією та логістикою — агент, який чує задачу людською мовою і виконує її через чіткий набір інструментів у ваших системах, — подивіться на послугу AI-агенти та чат-боти або просто напишіть мені. Полігон та навчання ми з моїм AI-напарником вже пройшли =)

Віталій Капля

Інженер цифрових продуктів та архітектор веб-рішень, засновник KAPLIA.PRO

Програмуванням зацікавився ще 1997 року — перше знайомство з майбутньою професією відбулося через Visual Basic. У 2004–2005 роках розробляв програми-інсталятори…

Більше про автора

Інженер цифрових продуктів та архітектор веб-рішень

Безкоштовна консультація + розрахунок вартості

Більше цікавих статей

Вхід для клієнтів

Цей сайт використовує файли cookie

Ми використовуємо файли cookie, щоб персоналізувати вміст і рекламу, надавати функції соціальних мереж і аналізувати наш трафік. Ми також надаємо інформацію про ваше використання нашого веб-сайту нашим партнерам із соціальних мереж, реклами та аналітики, які можуть поєднувати її з іншою інформацією, яку ви їм надали або зібрали під час використання вами їхніх послуг. Продовжуючи користуватися нашим сайтом, ви погоджуєтеся із використанням файлів cookie, а також приймаєте нашу Політику конфіденційності та Умови використання.

Віртуальний асистент
Вітаю! Я — віртуальний асистент KAPLIA.PRO! Розкажу про послуги, проєкти в портфоліо, орієнтовну вартість і підхід до роботи — від сайтів і eCommerce до вебдодатків, CRM, ботів та AI-агентів. Запитуйте!

Продовжуючи роботу з ШІ асистентом я погоджуюсь з умовами використання сайту та політикою конфіденційності.

AI-асистент може помилятися у відповідях