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
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Config files for my GitHub profile.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Минимальный рабочий каркас по плану: Electron-окно, орбитальная камера, загрузка любого .vrm-файла, персонаж стоит и моргает. Для теста уже лежит assets/AvatarSample_A.vrm (VRoid Hub, лицензия CC0). (setup.ps1 делает npm install и pip install -r tools/requirements.txt одной командой; если Python не найден — просто предупредит и продолжит, автоанализ музыки включится позже, когда Python появится в PATH.)查看完整 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)