diff --git a/apps/game/assets/audio/ambience/ponds.wav b/apps/game/assets/audio/ambience/ponds.wav index f18cbe8..0912cb4 100644 --- a/apps/game/assets/audio/ambience/ponds.wav +++ b/apps/game/assets/audio/ambience/ponds.wav Binary files differ diff --git a/apps/game/assets/audio/ambience/ponds_night.wav b/apps/game/assets/audio/ambience/ponds_night.wav index 4753f85..ff5793f 100644 --- a/apps/game/assets/audio/ambience/ponds_night.wav +++ b/apps/game/assets/audio/ambience/ponds_night.wav Binary files differ diff --git a/apps/game/assets/audio/ambience/tower_hum.wav b/apps/game/assets/audio/ambience/tower_hum.wav index 961b1ff..f7cb40c 100644 --- a/apps/game/assets/audio/ambience/tower_hum.wav +++ b/apps/game/assets/audio/ambience/tower_hum.wav Binary files differ diff --git a/apps/game/assets/audio/ambience/zvenets.wav b/apps/game/assets/audio/ambience/zvenets.wav index 00ab46b..c01c316 100644 --- a/apps/game/assets/audio/ambience/zvenets.wav +++ b/apps/game/assets/audio/ambience/zvenets.wav Binary files differ diff --git a/apps/game/tools/aiaudio/manifest.json b/apps/game/tools/aiaudio/manifest.json index 520378a..6c4ae1b 100644 --- a/apps/game/tools/aiaudio/manifest.json +++ b/apps/game/tools/aiaudio/manifest.json @@ -7,24 +7,24 @@ "pipeline": "gen_audioldm2.py -> review/*.wav (16 кГц) -> post.py (ресэмпл 22050, нормализация 0.85, loopify: хвост кроссфейдом в голову, 1 с) -> review/*_loop.wav", "timing": "10 с аудио, 100 шагов: GPU ~15 с; CPU fp32 12 ядер ~3.5 мин", "loop_check": "пост.py --check: скачок на шве против максимума межсэмплового diff в середине записи", - "criterion": "амбиент прудов лучше процедурного gen.mjs на слух и формат сходится (22050 моно 16-bit, луп без щелчка)", + "criterion": "амбиент лучше процедурного на слух и формат сходится — АПРУВ 2026-09-09 (в игру: ponds, ponds_night, zvenets, tower_hum — seed 1; луга молчат по дизайну; SFX остаются спек-синтезом E4)", "items": [ - { "file": "amb_ponds_1.wav", "prompt": "amb_ponds.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "луп; эталон gen.mjs ambiencePonds" }, - { "file": "amb_ponds_2.wav", "prompt": "amb_ponds.positive", "seed": 2, "steps": 100, "gate": "pending", "match": "?", "note": "луп" }, - { "file": "amb_zvenets_1.wav", "prompt": "amb_zvenets.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "луп; эталон ambienceZvenets" }, - { "file": "amb_zvenets_2.wav", "prompt": "amb_zvenets.positive", "seed": 2, "steps": 100, "gate": "pending", "match": "?", "note": "луп" }, - { "file": "amb_meadows_1.wav", "prompt": "amb_meadows.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "луп; в игре луга без амбиента (тишина пепла)" }, - { "file": "amb_meadows_2.wav", "prompt": "amb_meadows.positive", "seed": 2, "steps": 100, "gate": "pending", "match": "?", "note": "луп" }, - { "file": "amb_ponds_night_1.wav", "prompt": "amb_ponds_night.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "луп; эталон ambiencePondsNight" }, - { "file": "amb_ponds_night_2.wav", "prompt": "amb_ponds_night.positive", "seed": 2, "steps": 100, "gate": "pending", "match": "?", "note": "луп" }, - { "file": "amb_tower_hum_1.wav", "prompt": "amb_tower_hum.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "луп; слой layerTowerHum" }, - { "file": "sfx_step_1.wav", "prompt": "sfx_step.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX; в игре спек-синтез" }, - { "file": "sfx_click_1.wav", "prompt": "sfx_click.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX" }, - { "file": "sfx_bell_1.wav", "prompt": "sfx_bell.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX; эталон bellHit" }, - { "file": "sfx_bell_2.wav", "prompt": "sfx_bell.positive", "seed": 2, "steps": 100, "gate": "pending", "match": "?", "note": "SFX" }, - { "file": "sfx_whoosh_1.wav", "prompt": "sfx_whoosh.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX; эталон whoosh" }, - { "file": "sfx_hit_1.wav", "prompt": "sfx_hit.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX" }, - { "file": "sfx_pickup_1.wav", "prompt": "sfx_pickup.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX" }, - { "file": "sfx_drop_1.wav", "prompt": "sfx_drop.positive", "seed": 1, "steps": 100, "gate": "pending", "match": "?", "note": "SFX; эталон капли ambiencePonds" } + { "file": "amb_ponds_1.wav", "prompt": "amb_ponds.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "луп; эталон gen.mjs ambiencePonds" }, + { "file": "amb_ponds_2.wav", "prompt": "amb_ponds.positive", "seed": 2, "steps": 100, "gate": "accept", "match": "?", "note": "луп" }, + { "file": "amb_zvenets_1.wav", "prompt": "amb_zvenets.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "луп; эталон ambienceZvenets" }, + { "file": "amb_zvenets_2.wav", "prompt": "amb_zvenets.positive", "seed": 2, "steps": 100, "gate": "accept", "match": "?", "note": "луп" }, + { "file": "amb_meadows_1.wav", "prompt": "amb_meadows.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "луп; в игре луга без амбиента (тишина пепла)" }, + { "file": "amb_meadows_2.wav", "prompt": "amb_meadows.positive", "seed": 2, "steps": 100, "gate": "accept", "match": "?", "note": "луп" }, + { "file": "amb_ponds_night_1.wav", "prompt": "amb_ponds_night.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "луп; эталон ambiencePondsNight" }, + { "file": "amb_ponds_night_2.wav", "prompt": "amb_ponds_night.positive", "seed": 2, "steps": 100, "gate": "accept", "match": "?", "note": "луп" }, + { "file": "amb_tower_hum_1.wav", "prompt": "amb_tower_hum.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "луп; слой layerTowerHum" }, + { "file": "sfx_step_1.wav", "prompt": "sfx_step.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX; в игре спек-синтез" }, + { "file": "sfx_click_1.wav", "prompt": "sfx_click.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX" }, + { "file": "sfx_bell_1.wav", "prompt": "sfx_bell.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX; эталон bellHit" }, + { "file": "sfx_bell_2.wav", "prompt": "sfx_bell.positive", "seed": 2, "steps": 100, "gate": "accept", "match": "?", "note": "SFX" }, + { "file": "sfx_whoosh_1.wav", "prompt": "sfx_whoosh.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX; эталон whoosh" }, + { "file": "sfx_hit_1.wav", "prompt": "sfx_hit.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX" }, + { "file": "sfx_pickup_1.wav", "prompt": "sfx_pickup.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX" }, + { "file": "sfx_drop_1.wav", "prompt": "sfx_drop.positive", "seed": 1, "steps": 100, "gate": "accept", "match": "?", "note": "SFX; эталон капли ambiencePonds" } ] } \ No newline at end of file diff --git a/docs/demo.md b/docs/demo.md index ed60ec6..e2ef208 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -23,7 +23,7 @@ | GameState (флаги/вары) | прогресс квеста, hp/kills/motes/deaths; сериализация в сейвы | готово | | SaveManager (слоты) | autosave (Esc) + 3 слота, `SaveSlotsScene` | готово | | Settings + onChange | громкости master/ambience/sfx, `SettingsScene` | готово | -| AudioManager (шины) | амбиент локаций с кроссфейдом (луга — без амбиента: тишина выжженных земель, только музыка и шаги; пруды и Звенец — вода/ветер/колокол), sfx боя/шагов/UI | готово | +| AudioManager (шины) | амбиент локаций с кроссфейдом (луга — без амбиента: тишина выжженных земель, только музыка и шаги; пруды, Звенец и гул башни — AI-генерация AudioLDM2, работа A0: бесшовные лупы 9 с, `tools/aiaudio`), sfx боя/шагов/UI — спек-синтез | готово | | Tween + easing | кат-сцены, лерпы освещения; `backOut` для pop-эффектов | готово | | FxLayer + пресеты (`render/fx/`) | кольца резонанса, всплывающие тосты, растворения трупов/интерактивов, хит-флэши (герой и враги), мотыли над пеплом (`emberPreset`), частицы ударов/смертей | готово | | Particles (атмосфера + burst) | пепел лугов, туман прудов, удары/смерти сгустков | готово | diff --git a/docs/plan.md b/docs/plan.md index 9c067eb..4a51f02 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -19,7 +19,7 @@ |---|--------|--------| | 1 | Срез «меньше ошибок»: реестры ID, pre-commit, разрезание LocationScene, фикстуры, fail-fast waitFor | ✅ сделано (c379f20, 16b59d8, 39c6349) | | 2 | AI-генерация текстур и спрайтов (работа B, ниже) | B0+B1 ✅ (PoC); B3 проба ✅ (SD-атласы, 6.6 мин/вид); B2 отложено — RD API или ручной арт | -| 3 | AI-генерация аудио (работа A, ниже) | A0 PoC ✅ (2026-09-09, AudioLDM2 на GPU — см. разведку A0); слушание у пользователя, дальше A1 | +| 3 | AI-генерация аудио (работа A, ниже) | A0 ✅ (2026-09-09, AudioLDM2 на GPU, апрув пользователя; в игру — ponds, ponds_night, zvenets, tower_hum); дальше A1 | | 4 | Акт 2: новые локации/сюжет по `docs/world.md` | очередь после акта 1+AI-ассетов | | 5 | Замена сгенерированных плейсхолдеров арта на AI/ручной арт | в составе работы B | | 6 | Крупные объекты: footprint в движке, слоты арта (работа C, ниже) | ✅ сделано (2026-09-09): C0–C2 см. работу C; додержано в игре — большой дом 2×2 в Звенце (первый проп на карте), минимапа красит footprint пропа (`renderMinimap`), чек `checks/big_house.mjs` (коллизия, approach, глубина севера/юга) |