MonsterHouse - интерактивная проекция для Хэллоуина: говорящая гаражная дверь, которая слушает посетителей, отвечает голосом ворчливого старого пиратского корабля и смягчается, когда к ней обращаются вежливо. Автор проекта, инженер NVIDIA, собрал её на открытых моделях семейства Nemotron и запустил локально на одной рабочей станции. Описание сборки опубликовано в блоге NVIDIA на Hugging Face.
Пайплайн укладывается в четыре шага. Nemotron 3 ASR превращает речь посетителя в текст. Nemotron 3.5 Bolt E4B 4GB, небольшая открытая языковая модель для разговорных агентов, пишет ответ, а LoRA-адаптер задаёт характер персонажа. Magpie TTS Zeroshot озвучивает реплику по короткому референсному образцу голоса. Audio2Face-3D превращает чистую речь в анимацию рта в Unreal Engine 5. Всем процессом координирует NVIDIA Nemotron Voice Agent, а работают модели на двух GPU: NVIDIA RTX PRO 6000 Blackwell Max-Q и NVIDIA RTX PRO 4000 Blackwell.
Для практики здесь ценна карта сборки: какой компонент что делает, где узкие места и какие решения переносятся на собственный голосовой агент. Код проекта не опубликован, тесты на реальных посетителях ещё предстоят, так что воспринимать кейс стоит как инженерный разбор, а не как инструкцию на вечер.
Что такое MonsterHouse и как работает весь пайплайн
Формально MonsterHouse - это проекция двери с нарисованным персонажем. Фактически это голосовой агент с лицом: микрофон ловит речь, модель отвечает, синтез речи отдаёт звук, а неподвижная текстура получает мимику. Автор называет персонажа ворчливым старым пиратским кораблём, и это не только про тембр: характер проявляется в лексике и в реакции на вежливость.
Слушает, думает, говорит, анимирует: четыре этапа пайплайна
Разбивка по этапам с указанием моделей выглядит так:
| Этап | Модель | Задача |
|---|---|---|
| Listening | Nemotron 3 ASR | Речь посетителя превращается в текст |
| Thinking | Nemotron 3.5 Bolt E4B 4GB плюс LoRA-адаптер | Генерация ответа с заданной личностью |
| Speaking | Magpie TTS Zeroshot | Озвучивание по короткому образцу голоса персонажа |
| Animating | Audio2Face-3D в Unreal Engine 5 | Анимация рта по чистой речи |
| Seeing (опционально) | Nemotron 3 Nano Omni, YOLO, ByteTrack | Описание костюмов, подсчёт и трекинг посетителей |
Ключевой момент: готовую основу для слушания, разговора и речи дал Nemotron Voice Agent. Автор описывает это как фундамент «из коробки», благодаря которому голосовая часть собиралась итеративно и без переписывания всего цикла с нуля. Основная ручная работа ушла в контент: риг персонажа, датасет диалогов, анимационные ассеты.
Ветка зрения вынесена за пределы базовой петли. Nemotron 3 Nano Omni описывает костюмы, YOLO и ByteTrack считают и отслеживают посетителей. Дверь умеет реагировать на наряд и понимать, сколько людей стоит перед ней, но без этого слоя разговор с персонажем продолжает работать.
Почему это интересно за пределами Хэллоуина
Схема «ASR → компактная LLM → TTS по референсу → лицевая анимация» повторяется в музейных стендах, выставочных инсталляциях, NPC в играх и голосовых интерфейсах киосков. Отличие MonsterHouse от облачных демо в том, что весь цикл крутится локально: модели открытые, данные посетителей не уходят в сеть, а поведение не зависит от лимитов внешнего API.
Ограничение тоже честное. Это разбор реального кейса, а не готовый шаблон: репозитория с кодом нет, конфигурация заточена под профессиональные карты. Полезный вывод здесь - архитектурный, а не «клонируй и запусти».
Железо: две GPU NVIDIA RTX PRO Blackwell на одной рабочей станции
Конфигурация кейса: NVIDIA RTX PRO 6000 Blackwell Max-Q и NVIDIA RTX PRO 4000 Blackwell в одной машине. Точные объёмы VRAM, цены и энергопотребление автор не приводит, поэтому опираться на эти карты как на обязательное требование нельзя. Важнее логика распределения нагрузки.
RTX PRO 6000 Blackwell Max-Q держит языковой и голосовой пайплайн: распознавание речи, генерацию ответа, синтез. RTX PRO 4000 Blackwell отвечает за графику и анимацию: сцену в Unreal Engine 5 и работу Audio2Face-3D. Смысл разделения простой - рендер и инференс не отбирают друг у друга ресурс в самый неудачный момент.
Зачем две GPU, а не одна
В интерактивной инсталляции два независимых бюджета: частота кадров и задержка отклика. Рендер сцены в Unreal Engine 5 грузит GPU короткими пиками, инференс LLM и синтез речи занимают память и вычислители продолжительное время. На одной карте эти задачи начинают конкурировать, и просадка видна сразу: анимация дёргается, ответ приходит с паузой.
Разделение по картам даёт предсказуемость обоих показателей. Трезвая оговорка: конкретных замеров FPS и латентности по отдельным этапам в описании проекта нет, а на одной карте схема остаётся рабочей, просто с менее стабильными показателями. Насколько большим будет компромисс, зависит от разрешения проекции, длины ответа и квантования моделей.
Насколько конфигурация воспроизводима на менее мощном железе
Стек разбирается на независимые части, и это главный аргумент в пользу воспроизводимости. ASR, небольшую LLM, TTS и анимацию можно запускать по отдельности и проверять каждую на своём железе. Nemotron 3.5 Bolt E4B 4GB - компактная модель для разговорных агентов по названию и позиционированию, что снижает требования к видеопамяти по сравнению с крупными LLM. NVIDIA выпустила открытые модели семейства Nemotron, включая две компактные версии Bolt, рассчитанные на локальный запуск, о чём сообщалось в обзоре релиза.
Дальше начинается зона без гарантий. Обещать конкретный FPS или задержку на потребительской карте по этому кейсу нельзя: замеров на другом оборудовании нет. Ориентиры по VRAM для локальных голосовых пайплайнов и границу между комфортным ассистентом и экспериментом разбирает отдельный материал о локальных voice-to-voice моделях на 12-24 ГБ VRAM.
Личность персонажа: LoRA-адаптер и 5000+ диалогов
Из общей модели ворчливый пират получается не промптом, а данными. LoRA-адаптер обучен на 5000+ многоходовых диалогов: именно объём и многошаговость отличают такой подход от набора реплик-примеров. Характер должен держаться десятки ходов подряд, а не только в первом ответе.
Почему LoRA, а не только системный промпт
Системный промпт задаёт инструкцию: говори грубо, но не оскорбляй, упоминай море. LoRA закрепляет манеру в весах модели: ритм фраз, любимые обороты, степень раздражения. На длинной беседе разница заметна сильнее, потому что промпт размывается контекстом, а адаптер продолжает работать на каждом шаге.
Цена решения прямая: нужен датасет сопоставимого объёма и цикл обучения, то есть время и подготовка данных. Для инсталляции на один вечер это избыточно. Для персонажа, который должен узнаваться по голосу текста, вложение оправдано. Как личность агента складывается из промпта, памяти и голоса, разобрано в статье о слоях, из которых собирается характер LLM-агента.
Как бэкстори превращается в поведение
Автор придумал предысторию: дом построен из древесины затонувшего пиратского корабля, которого преследует его штормовое прошлое. Морские жалобы получили причину. Это не украшение лора, а инструмент консистентности: бэкстори объясняет, почему персонаж говорит именно так, и служит фильтром при отборе диалогов для датасета.
Вторая поведенческая черта - смягчение в ответ на вежливость. Такое правило нужно закладывать в данные, иначе модель не узнает, на что реагировать. Гиперпараметры обучения, точный размер датасета сверх указанных 5000+ диалогов и метрики качества в описании проекта не раскрыты.
Задержка: как кэш реплик меняет отклик
В кейсе приведены две цифры: медиана отклика 1,70 с на полном цикле и 0,72 с для кэшированных реплик. Разница больше чем в два раза, и достигается она без замены моделей и без перехода на более мощную карту. Это внутренние замеры конкретной сборки, а не бенчмарк всего стека.
Механика простая. Если сценарий известен заранее (посетитель подошёл, поблагодарил, попросил конфету), готовый ответ уходит в кэш вместе с синтезированной речью, и шаги генерации LLM и TTS на этом ходе не выполняются. Остаётся определить ситуацию и воспроизвести заготовку. Уникальный ответ по-прежнему проходит полный путь, поэтому кэш не отменяет задержку, а срезает её на типовых сценариях.
Что именно кэшировать
Кандидаты очевидны: приветствие, реакция на вежливость, сезонные фразы, короткие подколки. Критерий отбора - высокая частота и низкая вариативность. Чем реже фраза и чем сильнее зависит от контекста, тем меньше смысла её кэшировать.
Риск тоже понятен: слишком агрессивный кэш делает персонажа повторяющимся. Посетитель слышит одну и ту же шутку дважды, и иллюзия живого собеседника рассыпается. Разумная стратегия - держать в кэше несколько вариантов одной реплики и чередовать их.
Где ещё теряется время в голосовом цикле
Каждый этап добавляет свою долю: распознавание речи ждёт конца фразы, LLM генерирует токены, TTS синтезирует звук, Audio2Face-3D строит анимацию по готовой чистой речи, затем сцена рендерится. Анимация зависит от выхода синтеза, поэтому экономия на TTS напрямую влияет на то, как быстро дверь начнёт шевелить ртом. Замеров по отдельным этапам в описании проекта нет, так что раскладывать 1,70 с на составляющие пришлось бы гаданием.
Практическая сторона задержки в продакшене, с VAD, стримингом и воспроизводимыми замерами, разобрана в материале о пути голосового AI-сервиса от демо до продакшена.
Голос и лицо: Magpie TTS Zeroshot и Audio2Face-3D в Unreal Engine 5
Magpie TTS Zeroshot озвучивает каждый ответ по короткому референсному образцу голоса персонажа. Практический смысл zero-shot подхода в том, что не нужно записывать многочасовой датасет: достаточно образца, по которому модель воспроизводит тембр и манеру. Для персонажа с одной репликой за раз этого хватает.
Дальше включается анимация. Audio2Face-3D берёт чистую речь и превращает её в движение рта в Unreal Engine 5. Связка «синтез → анимация» означает, что любая правка голоса автоматически меняет мимику, и синхронизацию не нужно чинить руками.
Риг как самая дорогая часть работы
Цепочка производства ассетов выглядит так: SkelMesh создан в Autodesk Maya, экспортирован в Unreal Engine, где за дверью добавили виртуальный огонь и эффекты. Затем потребовался кастомный анимационный риг, и автор называет эту часть одной из самых трудоёмких во всей сборке. Только после рига можно было экспортировать формы мимики, которые потом анимирует Audio2Face-3D.
Вывод для планирования: модели - половина задачи. Вторая половина - 3D-конвейер, и она съедает время независимо от того, насколько хорош инференс.
Почему персонаж без глаз оказался удачным решением
У персонажа нет глаз, бровей и моргания. Автор называет его на удивление экономичным монстром, и это точная формулировка: чем меньше мимических каналов, тем меньше элементов нужно анимировать и синхронизировать с речью. Ошибки в движении бровей заметны сразу, отсутствие бровей их исключает.
Приём переносится на любой бюджетный проект: упрощайте лицо там, где упрощение не ломает образ. Дверь с ртом и огнём за ней читается как персонаж не хуже, чем полностью анимированная модель.
Опциональный слой зрения: Nemotron 3 Nano Omni, YOLO и ByteTrack
Зрение в MonsterHouse решает две разные задачи. Nemotron 3 Nano Omni, мультимодальная модель, описывает костюмы посетителей: это даёт персонажу тему для реплики помимо стандартного «кого принесло». YOLO и ByteTrack считают и отслеживают людей, чтобы дверь понимала, сколько народу перед ней и не обращается ли она к одному ребёнку дважды.
Для инсталляции это заметное улучшение опыта: реакция на костюм выглядит как внимание, а не как случайная фраза. Слой при этом опциональный. Петля «слушает, отвечает, анимирует рот» работает без камеры и без VLM, что удобно для отладки: сначала голос, потом зрение.
Точность детекции, требования к освещённости и стоимость обработки видео в описании проекта не раскрыты, поэтому обещать стабильную работу на улице в темноте по этому кейсу нельзя.
Ограничения кейса и стоит ли повторять
Границы описаны самим автором: код проекта не опубликован, тесты на реальных посетителях ещё предстоят, конфигурация построена на двух профессиональных GPU Blackwell. Часть стека закрыта готовым фреймворком Nemotron Voice Agent, часть осталась ручной работой: риг, данные, анимационные эффекты.
Что можно перенести в свой проект уже сейчас
- LoRA-адаптер личности на 5000+ многоходовых диалогов вместо длинного системного промпта, если персонаж должен держать характер в долгой беседе.
- Кэширование частых реплик: в кейсе это разница между медианой 1,70 с и 0,72 с на типовых фразах.
- Разделение нагрузки: языковой и голосовой пайплайн на одной GPU, рендер и анимация на другой, если нужен стабильный FPS.
- Дизайнерское упрощение персонажа, например отказ от глаз и моргания, чтобы снизить стоимость анимации.
Чего в кейсе нет
Нет опубликованного кода, нет замеров на потребительском железе, нет результатов обкатки на живых посетителях. Нельзя выводить из него обещания по латентности или FPS на другой конфигурации: цифры 1,70 с и 0,72 с принадлежат конкретной сборке. Общий контекст, почему голосовые агенты пока отстают от текстовых по надёжности, разобран в статье о барьерах голосового AI.
Практический вывод: MonsterHouse стоит читать как карту пайплайна и набор инженерных приёмов. Начните со своей петли на одной карте, проверьте задержку на типовых репликах, затем добавляйте LoRA и зрение. Такой порядок даёт работающий прототип раньше, чем производство 3D-рига.