Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Игровые видео и стримы dan4ik37, живой чат и бесплатные онлайн-игры: «5 букв», морской бой, города, шашки — с ботом или с другом по ссылке.
Translation pending
GamesJavaScript · PLpgSQLGitHub @dan4ik37OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Config files for my GitHub profile.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Минимальный рабочий каркас по плану: Electron-окно, орбитальная камера, загрузка любого .vrm-файла, персонаж стоит и моргает. Для теста уже лежит assets/AvatarSample_A.vrm (VRoid Hub, лицензия CC0). (setup.ps1 делает npm install и pip install -r tools/requirements.txt одной командой; если Python не найден — просто предупредит и продолжит, автоанализ музыки включится позже, когда Python появится в PATH.)Read the full README ↗
Минимальный рабочий каркас по плану: Electron-окно, орбитальная камера,
загрузка любого .vrm-файла, персонаж стоит и моргает. Для теста уже лежит
assets/AvatarSample_A.vrm (VRoid Hub, лицензия CC0).
.\tools\setup.ps1
npm start
(setup.ps1 делает npm install и pip install -r tools/requirements.txt одной
командой; если Python не найден — просто предупредит и продолжит, автоанализ
музыки включится позже, когда Python появится в PATH.)
.vrm по умолчанию (config.js → defaultVRMPath,
assets/AvatarSample_A.vrm) или через кнопку «Загрузить .vrm…»
(диалог выбора файла — путь не зашит в код).OrbitControls): ЛКМ — вращение, колесо — зум
(лимит 0.5–8, синхронизирован с camera.far = 20), ПКМ — панорама.happy/angry/sad/surprised) через
expressionManager — работает одинаково для VRM 0.x и VRM 1.0, так как
@pixiv/three-vrm сам абстрагирует разницу пресетов.Кнопка «Загрузить аудио и петь» открывает системный диалог выбора файла.
Если рядом с аудиофайлом лежит <файл>.dance.json — партитура найдётся
автоматически, и лип-синк/танец пойдут по ней точно, а не «на глаз».
pip install -r tools/requirements.txt
python tools/analyze_song.py "путь/к/песне.mp3"
Это один раз «слушает» трек через анализ аудиосигнала (librosa: точный BPM,
точные времена битов, разбивка на секции по громкости) и сохраняет
песня.mp3.dance.json рядом с файлом. Дальше просто открывай эту же песню
через «Загрузить аудио и петь» — приложение найдёт JSON само.
Есть более точный (но тяжёлый) режим — реальное разделение на вокал/барабаны нейросетью Demucs, ускоряется на твоей RTX через CUDA:
pip install demucs torch --index-url https://download.pytorch.org/whl/cu121
python tools/analyze_song.py "песня.mp3" --quality high
Разница: барабаны отдельно → точные биты без путаницы с мелодией; вокал отдельно → рот не будет открываться от баса/ударных, только от голоса.
Без партитуры (или для микрофона) всё равно работает — в реальном времени, чуть менее точно: детекция битов по энергии баса, лип-синк по громкости мимо.
Раз ты хочешь по-настоящему бесплатно и на своей RTX — вот полный путь без Replicate. Сама модель ARDY открытая, тебе просто нужно её один раз настроить и сгенерировать 4 клипа.
git clone https://github.com/nv-tlabs/ardy.git
cd ardy
conda create -n ardy python=3.11 -y
conda activate ardy
# сначала PyTorch под свою CUDA (смотри https://pytorch.org/get-started/locally/,
# для RTX 5060 Ti нужен свежий билд — проверь, какая версия CUDA у тебя стоит: nvidia-smi)
pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e ".[demo]"
Текстовый энкодер требует доступ к закрытой meta-llama/Meta-Llama-3-8B-Instruct
на Hugging Face (бесплатно, но нужно один раз принять лицензию на странице
модели и авторизоваться: huggingface-cli login). Он весит ~16ГБ видеопамяти
сам по себе — впритык с 16ГБ на 5060 Ti вместе с самой ARDY. Если не влезет —
в репозитории есть TEXT_ENCODER_DEVICE=cpu (медленнее, но работает).
Раньше это было 4 команды generate.py + 4 команды конвертера — теперь один
скрипт (tools/generate_and_convert_ardy_dances.py, лежит в этом проекте)
делает всё сразу: генерирует и сразу переводит в кости VRM.
# запускать ИЗ ПАПКИ РЕПОЗИТОРИЯ ardy (там, где scripts/generate.py),
# путь после --project-dir — куда указывает эта папка (vtuber-vrm-player)
python /путь/к/vtuber-vrm-player/tools/generate_and_convert_ardy_dances.py --project-dir "E:\3d\vtuber-vrm-player"
Пишет прогресс по каждому из 4 клипов и сразу кладёт готовые
assets/dances/*.motion.json в проект — руками конвертировать каждый файл
по отдельности больше не нужно.
Я перевёл кости CoreSkeleton27 в кости VRM по своей табличке в
tools/convert_ardy_motion.py, опираясь на структуру скелета из исходников
ARDY (это я проверил — она реальная). Но я не проверял результат на
экране — у меня нет GPU/рендера. Два места, где может потребоваться
правка:
AXIS_CORRECTION в начале скрипта (поправочный кватернион на конкретную
кость VRM). Поправил — не обязательно гонять генерацию заново: если .npz
уже есть в outputs/, просто перезапусти конвертацию одного клипа через
tools/convert_ardy_motion.py путь/к/файлу.npz --name имя_клипа (или
поправь то же самое в generate_and_convert_ardy_dances.py, если гоняешь
всё скопом).hipsPositionDelta на коэффициент прямо в JSON или в скрипте.Если после первого теста что-то не так — пришли, что именно не так (какая часть тела, в какую сторону), и поправим прицельно, не переписывая всё заново.
Если возиться с локальной установкой не хочешь — есть вариант проще, тот же
tools/generate_dances.js, который дергает готовый Replicate-обёрточный
API и сразу отдаёт .vrma (не нужен свой конвертер, но там за генерацию
берут доли цента). Токен: https://replicate.com/account/api-tokens.
Поле «Опиши сцену» + кнопка «Спросить режиссёра» — по умолчанию бесплатно и локально:
# один раз: https://ollama.com, потом
ollama pull llama3.2
Дальше Ollama просто должен быть запущен (обычно сам поднимается фоном после
установки, слушает localhost:11434) — приложение сама к нему стучится,
получает эмоцию + короткую реплику, ставит блендшейп и показывает реплику
субтитром на 6 секунд.
Если Ollama не запущен — тихо пробует (опционально) платный Anthropic API,
но только если сам явно задал переменную окружения ANTHROPIC_API_KEY перед
запуском — по умолчанию ничего платного не трогается. Если и это не задано —
последний гарантированный вариант: простой разбор по ключевым словам (без
всякого ИИ, эмоция без реплики, но что-то отвечает всегда).
Внизу под полем видно, какой из трёх вариантов сработал.
Кнопка «Веб-камера: вкл» — на время выключает мышиное вращение камеры и отдаёт управление движению в кадре: покадровая разница яркости (motion = |текущий кадр - предыдущий|) сглаживается усреднением с соседними клетками ("диффузия", как и в прошлом Python-проекте — тот же алгоритм, портирован на Canvas2D), взвешенный центроид получившегося поля плавно разворачивает и наклоняет камеру в сторону движения; без движения камера сама возвращается к центру. Маленький превью-канвас под кнопкой показывает само поле движения (тепловая карта) — так видно, что оно вообще что-то ловит, до всякой реакции камеры. Выключил — мышиное управление возвращается как было.
Всё, что происходит за время работы приложения — main-процесс, весь вывод
браузерной консоли (включая Failed to load resource и подобные ошибки
Chromium, не только наши console.log), необработанные исключения что в
main, что в renderer — пишется в один файл: logs/latest.log рядом с
main.js. Перезаписывается заново при каждом запуске приложения — если
воспроизводишь баг, не перезапускай между этим и отправкой файла.
Кнопка «Открыть папку с логами» внизу интерфейса — сразу откроет проводник с этим файлом. Если разбираешься с проблемой в новом чате с ИИ — просто прикрепи этот файл, не нужно копировать текст из консоли руками.
Дополнительно есть debugPose() (в консоли разработчика, Ctrl+Shift+I) —
печатает текущие повороты ключевых костей обеих моделей и настройки
tuning; тоже пишется в тот же logs/latest.log, так что можно просто
вызвать её перед тем как прикреплять файл, и она попадёт в лог вместе со
всем остальным.
.exe.\tools\setup.ps1
npm run dist
Результат — папка dist/win-unpacked/, внутри неё VTuber VRM Player.exe.
Важно: переносить/запускать нужно всю папку win-unpacked целиком, не
только сам .exe — рядом с ним должны лежать resources/, assets/ и
остальное, иначе модель не найдётся (ровно то, из-за чего был "Загрузка..."
навсегда — если позже опять решишь собирать "portable" вместо "dir", там
похожая логика: самораспаковка в отдельную папку, просто временную).
Раньше стоял таргет "portable" (один самораспаковывающийся .exe) — я
переключил на "dir" (просто папка), потому что не смог до конца
протестировать portable у себя (нет Windows, только Linux-песочница с
Wine-ограничениями на подпись), а "dir" — ровно то, что я реально собрал и
проверил, что все файлы (включая assets/) на месте. Если после этого
переключения .exe всё ещё не находит модель — открой Ctrl+Shift+I внутри
приложения, вкладка Console, и пришли что там красным.
Важная деталь конфигурации в package.json: "asar": false — по умолчанию
electron-builder пакует всё приложение в один архив app.asar, но автоанализ
музыки (tools/analyze_song.py) запускается как отдельный процесс
python.exe, а внешние программы не умеют читать файлы изнутри .asar. Без
этой настройки автоанализ молча ломался бы именно в собранном .exe.
Своей иконки нет (использует стандартную иконку Electron) — если нужна,
положи .ico-файл и добавь "icon": "путь/к/icon.ico" в build.win в
package.json.
Это был последний пункт исходного плана. Дальше — на твой вкус: доводить ARDY до рабочего состояния, GUI-полировка, или что-то новое.
Кнопка «Загрузить вторую модель (дуэт)…» рядом с загрузкой основной —
открывает диалог выбора .vrm, вторая модель встаёт рядом с первой (сцена и
камера автоматически раздвигаются). Танцует вместе с первой под тот же
бит/трек, но зеркально (какая рука поднята — наоборот) и с собственной
случайной сменой поз, чтобы не выглядеть как клон. ИИ-движения (mocap) пока
только у первой модели — вторая всегда танцует процедурно.
Раньше было ровно 4 файла (idle_low, dance_mid, dance_high,
turn_spin). Теперь на каждую категорию можно накидать сколько угодно
вариантов — dance_mid_1.motion.json, dance_mid_2.motion.json,
dance_mid_3.motion.json, ... — приложение сама их все найдёт при старте
(пробует по номерам подряд, начиная с 1, пока не наткнётся на пропуск), и
будет случайно выбирать и периодически (раз в ~15 секунд, если трек долго
держит одну и ту же энергию) менять вариант внутри категории — так вся
библиотека реально используется, а не только первый найденный клип.
И tools/generate_dances.js (Replicate), и tools/ generate_and_convert_ardy_dances.py (локальный ARDY) теперь сразу
генерируют по несколько клипов на категорию — часть короткие (4 сек,
акцентные движения), часть длинные (14-16 сек, целые мини-хореографии из
нескольких движений подряд). Хочешь добавить ещё — допиши в CLIPS объект с
именем вида категория_N (следующий свободный номер) и своим промптом.
Спецификация VRM 0.x требует T-позу как канонический bind pose — раньше это было незаметно (idle-анимации не было), теперь персонаж мог стоять именно в ней, когда танец выключен. Приложение теперь при загрузке модели само определяет похожа ли базовая поза на T-позу и если да — опускает руки в естественное положение.
Но я не вижу экран, поэтому конкретные цифры коррекции — не мои догадки, а твои: раздел «Настройка позы» в интерфейсе — 4 ползунка, всё меняется на модели сразу при движении, без пересборки:
Кнопка «Сохранить» запоминает подобранные значения (в этом окне/профиле) — не нужно каждый раз подбирать заново.
Было 6 поз со случайным выбором каждый бит — стало 10, и раз в 16 битов (не
всегда, через раз) вместо обычной случайной смены запускается заранее
поставленная последовательность из 4 поз подряд (DANCE_PHRASES в
renderer.js) — читается как осознанный мини-номер, а не рандом. Работает
даже без ARDY/Replicate, сразу.
Каждый шаг — маленький и проверяемый: сначала убедиться, что текущий каркас у тебя запускается и модель видна, потом переходить к следующей функции.
main.js — Electron main-процесс (окно, диалог выбора файла)
preload.js — безопасный мост в renderer (contextIsolation: true)
index.html — разметка + import map для three.js/three-vrm
renderer.js — сцена, камера, загрузка VRM, моргание, эмоции
config.js — путь к модели по умолчанию (обычная настройка)
assets/ — тестовая модель AvatarSample_A.vrm (CC0)