Add formal enemies, remaining formal partners and synthesized UI SFX

- UI SFX v3: procedurally synthesized one-shots (Tools/synth_ui_sfx.py) wired to
  buttons, rewards, errors and red dots via UiSfx, gated by the SFX setting.
- Five formal enemies (Hornlet, Dashlet, Shellhorn, HornCaptain, GreatHorn):
  Hunyuan 50k -> 2000-tri XPbr, DGXA TokenRig, Idle/Walk/Attack, nested per type
  in PrototypeArena; PrototypeBattle.Enemy gains presentation-only Moving/Strikes.
- Formal partners for all ten pets in the arena and portraits, including new
  VineSprite, ThunderLeopard and TideWhale.
- Pipeline fixes: reject local TokenRig fallback, drop loose mesh islands,
  configurable Unity run_script timeout, companion static stage.
- Also includes concurrent work from another tool in this working tree
  (FlameLion, enemy combat FX, challenge mode, home explorer, server updates).
- Resources registered in Doc/ResDesc_*.md; verified on isolated :18081.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
udx
2026-10-21 12:23:55 +08:00
co-authored by Claude Opus 5.5
parent 6c64210331
commit 89e0fa246f
780 changed files with 7117051 additions and 15906 deletions
@@ -0,0 +1,78 @@
{
"schemaVersion": 1,
"status": "planned_not_generated",
"batchId": "battle_skills_v1",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"designDir": "Doc/Design/Sound/BattleSkills",
"outputDir": "Tools/output/battle_skills_sfx_v1",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/BattleSkills",
"defaults": {
"duration": 2,
"steps": 50,
"guidance_scale": 4.5
},
"maxInflight": 2,
"sourceFormat": {
"container": "wav",
"sampleRate": 44100,
"channels": 2
},
"releaseLicenseReview": "pending_upstream_review_per_guide",
"items": [
{
"id": "Sfx_FireCharge",
"seed": 52001,
"prompt": "A short gentle magical flame gathering sound, soft rising airy crackle, cute fantasy cat casting, close and dry, one isolated event, no music, no speech",
"duration": 2
},
{
"id": "Sfx_FireLaunch",
"seed": 52002,
"prompt": "One short compact magical fireball launch, bright soft ignition and a quick airy whoosh, cute mobile fantasy game, no explosion, no music, no speech",
"duration": 2
},
{
"id": "Sfx_FireHit",
"seed": 52003,
"prompt": "One small magical fireball impact, crisp warm pop with a brief soft fiery crackle tail, friendly cartoon fantasy, no heavy bass, no music, no speech",
"duration": 2
},
{
"id": "Sfx_RockHit",
"seed": 52004,
"prompt": "One small rounded stone creature striking, compact stone knock and a little gravel scatter, friendly cartoon fantasy game, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Heal",
"seed": 52005,
"prompt": "One gentle magical healing chime, warm bell sparkle with a short soft airy tail, friendly pastoral fantasy game, no music bed, no speech",
"duration": 2
},
{
"id": "Sfx_Shield",
"seed": 52006,
"prompt": "One soft magical stone shield forming, low rounded stone resonance with a tiny clear sparkle, short dry fantasy game effect, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Slow",
"seed": 52007,
"prompt": "One gentle icy magical pulse, light crystalline tick with a soft watery freeze texture, short isolated cartoon game effect, no music, no speech",
"duration": 2
},
{
"id": "Sfx_Lightning",
"seed": 52008,
"prompt": "One short small magical electric zap, crisp bright crackle and a soft pop, friendly cartoon fantasy, no harsh buzz, no music, no speech",
"duration": 2
},
{
"id": "Sfx_EnemyHit",
"seed": 52009,
"prompt": "One short soft cartoon creature hit, compact muted thump, dry isolated mobile fantasy game effect, no voice, no music, no speech",
"duration": 2
}
]
}
@@ -0,0 +1,81 @@
{
"status": "pass",
"clips": [
{
"id": "Enemy_HornletAttack",
"seconds": 0.48,
"peakDb": -1.9386641491007355,
"rmsDb": -10.698790438638541,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_DashletAttack",
"seconds": 0.42,
"peakDb": -1.9386641491007355,
"rmsDb": -15.931562805180183,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_ShellhornAttack",
"seconds": 0.6,
"peakDb": -1.9386641491007355,
"rmsDb": -15.372953401873325,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HornCaptainAttack",
"seconds": 0.58,
"peakDb": -1.9386641491007355,
"rmsDb": -12.087912415035813,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_GreatHornAttack",
"seconds": 0.82,
"peakDb": -1.9386641491007355,
"rmsDb": -13.616301171337803,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitSoft",
"seconds": 0.34,
"peakDb": -1.9386641491007355,
"rmsDb": -15.923032471457049,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitArmor",
"seconds": 0.42,
"peakDb": -1.9386641491007355,
"rmsDb": -17.553967945423206,
"clippedSamples": 0,
"hashesMatch": true
},
{
"id": "Enemy_HitShield",
"seconds": 0.55,
"peakDb": -1.9386641491007355,
"rmsDb": -12.864415917978466,
"clippedSamples": 0,
"hashesMatch": true
}
],
"checks": "source/output/request hashes; succeeded job; PCM16 44.1kHz stereo; short duration; prompt onset; fade tail; finite samples; zero clipping",
"subjectiveListening": "not_asserted_by_automated_QA",
"previewOrder": [
"Enemy_HornletAttack",
"Enemy_DashletAttack",
"Enemy_ShellhornAttack",
"Enemy_HornCaptainAttack",
"Enemy_GreatHornAttack",
"Enemy_HitSoft",
"Enemy_HitArmor",
"Enemy_HitShield"
]
}
@@ -0,0 +1,343 @@
{
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"status": "generated",
"items": [
{
"id": "Enemy_HornletAttack",
"request": {
"prompt": "One small cartoon horn creature headbutt, quick airy swish and compact woody knock, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62100
},
"requestHash": "183cecd889e44b53d2145e7f6773b3424320b5e36c184cb43325f8b856d5c5d1",
"job": {
"id": "eb9fac0583f44c158946ea20c6cbaccc",
"status": "succeeded",
"prompt": "One small cartoon horn creature headbutt, quick airy swish and compact woody knock, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62100,
"created_at": "2026-10-21T03:20:01.193339+00:00",
"started_at": "2026-10-21T03:20:01.193339+00:00",
"finished_at": "2026-10-21T03:20:21.664940+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 20.469,
"url": "/api/jobs/eb9fac0583f44c158946ea20c6cbaccc/audio",
"download_url": "/api/jobs/eb9fac0583f44c158946ea20c6cbaccc/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HornletAttack_source.wav",
"sourceSha256": "124b9fdb9fc2996e512b64a40cd40804c7e93ae0ab65cd15680704fa40daf599",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HornletAttack.wav",
"outputSha256": "11e6775bb7a028ac2070b6abe7ca7c44d46892123b852a55346cc5027ec3320e",
"seconds": 0.48,
"trimStartSeconds": 1.3650113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -10.698159043917556,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_DashletAttack",
"request": {
"prompt": "One fast cartoon creature dash strike, sharp short sweeping air whip and light punch, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62101
},
"requestHash": "0564ac06c1db386de8026e355afde2c51af12c9e4bd7d511bd3485dca1c0a9ee",
"job": {
"id": "dddfd73997e549f8a2edb4742b347950",
"status": "succeeded",
"prompt": "One fast cartoon creature dash strike, sharp short sweeping air whip and light punch, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62101,
"created_at": "2026-10-21T03:20:01.213179+00:00",
"started_at": "2026-10-21T03:20:21.664940+00:00",
"finished_at": "2026-10-21T03:20:33.475642+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.81,
"url": "/api/jobs/dddfd73997e549f8a2edb4742b347950/audio",
"download_url": "/api/jobs/dddfd73997e549f8a2edb4742b347950/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_DashletAttack_source.wav",
"sourceSha256": "cb3048cb76106cedee6672ae3be1e69d6a100fb7f747e39501e614279b33612c",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_DashletAttack.wav",
"outputSha256": "3303a5835959ef812b7f677d710633db7d536e878f6543c9c6c21a10206ccd24",
"seconds": 0.42,
"trimStartSeconds": 1.6550113378684808,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.93079650888887,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_ShellhornAttack",
"request": {
"prompt": "One heavy shell creature shoulder bash, solid hollow stone knock with tiny gravel clicks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62102
},
"requestHash": "fd43568818d037332b4f7883a9213342b3521815914e92c869f3734dab430c62",
"job": {
"id": "3c0f5b3839eb4901b8a3138ce10e9ed4",
"status": "succeeded",
"prompt": "One heavy shell creature shoulder bash, solid hollow stone knock with tiny gravel clicks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62102,
"created_at": "2026-10-21T03:20:22.164766+00:00",
"started_at": "2026-10-21T03:20:33.475642+00:00",
"finished_at": "2026-10-21T03:20:45.499761+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 12.023,
"url": "/api/jobs/3c0f5b3839eb4901b8a3138ce10e9ed4/audio",
"download_url": "/api/jobs/3c0f5b3839eb4901b8a3138ce10e9ed4/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_ShellhornAttack_source.wav",
"sourceSha256": "a25b6c1b96d5c3fcfc04608f7b48a39a69df79b3a88acbcc8c0281ff01f363e1",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_ShellhornAttack.wav",
"outputSha256": "9725c417c193add95332976196d82220f25376b034044dcad7355c3ade755db3",
"seconds": 0.6,
"trimStartSeconds": 1.7950113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.372321971581309,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HornCaptainAttack",
"request": {
"prompt": "One forceful cartoon horn creature strike, broad air swoosh then firm wooden thud, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62103
},
"requestHash": "cfb726c865307711e7ab09892e0665ee1699ab6c71c65b969dcf3c98841783f2",
"job": {
"id": "aab611ca891141318c193b4a8858ff1c",
"status": "succeeded",
"prompt": "One forceful cartoon horn creature strike, broad air swoosh then firm wooden thud, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62103,
"created_at": "2026-10-21T03:20:34.254093+00:00",
"started_at": "2026-10-21T03:20:45.499761+00:00",
"finished_at": "2026-10-21T03:20:57.173984+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.675,
"url": "/api/jobs/aab611ca891141318c193b4a8858ff1c/audio",
"download_url": "/api/jobs/aab611ca891141318c193b4a8858ff1c/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HornCaptainAttack_source.wav",
"sourceSha256": "fcc6734bcf7b72ea192cb3bb7ae87b8b7f9131c6d600a90789ae24b0fecbc616",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HornCaptainAttack.wav",
"outputSha256": "99ac39aa3775bc4ba0def1196216744e12ddcb8523a4096aa63cedfcb6811723",
"seconds": 0.58,
"trimStartSeconds": 0.8750113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -12.08722963691162,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_GreatHornAttack",
"request": {
"prompt": "One large fantasy stone creature ground slam, deep rounded punch with brief gritty stone debris, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62104
},
"requestHash": "cdb0c28bd040bd74e9c4b712886f7eff4fac395dd179738416600e82b499ef67",
"job": {
"id": "2429fdd3aee74985a6d1aa045a505814",
"status": "succeeded",
"prompt": "One large fantasy stone creature ground slam, deep rounded punch with brief gritty stone debris, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62104,
"created_at": "2026-10-21T03:20:46.317538+00:00",
"started_at": "2026-10-21T03:20:57.173984+00:00",
"finished_at": "2026-10-21T03:21:08.911325+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.736,
"url": "/api/jobs/2429fdd3aee74985a6d1aa045a505814/audio",
"download_url": "/api/jobs/2429fdd3aee74985a6d1aa045a505814/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_GreatHornAttack_source.wav",
"sourceSha256": "940d7df5d5140bacf25e08d8e0d21abd70d2ae353d9dc059533340b246cd8507",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_GreatHornAttack.wav",
"outputSha256": "53debdca5692e82797cd25e9f766c8875f0d3460e81e46fab6a9d3d0b51137f5",
"seconds": 0.82,
"trimStartSeconds": 0.0,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -13.615541440400197,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitSoft",
"request": {
"prompt": "One small soft cartoon body impact, short clean muted punch and tiny airy pop, dry close recording, no vocalization, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62105
},
"requestHash": "e1bc630679b641758edb8fd08dce5ecc1be87b6143a804ccd7ab602ecfc1dd22",
"job": {
"id": "555d62bec8a2465f953dce4aa55c6f62",
"status": "succeeded",
"prompt": "One small soft cartoon body impact, short clean muted punch and tiny airy pop, dry close recording, no vocalization, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62105,
"created_at": "2026-10-21T03:20:57.567633+00:00",
"started_at": "2026-10-21T03:21:08.911325+00:00",
"finished_at": "2026-10-21T03:21:20.667288+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.756,
"url": "/api/jobs/555d62bec8a2465f953dce4aa55c6f62/audio",
"download_url": "/api/jobs/555d62bec8a2465f953dce4aa55c6f62/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitSoft_source.wav",
"sourceSha256": "739f58a9edf99e4254003df9d6d80758198c6d2dc864ec368d6133fcf476dd29",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitSoft.wav",
"outputSha256": "337caa7211357b922e5cae26360197ee2753c79ed803ac88d1d050bd737dffbc",
"seconds": 0.34,
"trimStartSeconds": 0.0,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -15.922147871224414,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitArmor",
"request": {
"prompt": "One small rock armor impact, crisp stone clack with two tiny gravel ticks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62106
},
"requestHash": "b82253a8536f4450f20cd710ff17d3645d3165859863e727f148fad8f43b89d9",
"job": {
"id": "d252cd2130664d15b4713da0422de187",
"status": "succeeded",
"prompt": "One small rock armor impact, crisp stone clack with two tiny gravel ticks, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62106,
"created_at": "2026-10-21T03:21:09.631149+00:00",
"started_at": "2026-10-21T03:21:20.667288+00:00",
"finished_at": "2026-10-21T03:21:32.071102+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.404,
"url": "/api/jobs/d252cd2130664d15b4713da0422de187/audio",
"download_url": "/api/jobs/d252cd2130664d15b4713da0422de187/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitArmor_source.wav",
"sourceSha256": "468cff97af1a9fca13290fcdd37f1d0fb4a57fbfc3a01a512a7638eb756dbc06",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitArmor.wav",
"outputSha256": "f82ee2e53805549523a5443915258909e64965db2a12bcdecc090083f763f562",
"seconds": 0.42,
"trimStartSeconds": 1.0850113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -17.553284852790632,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
},
{
"id": "Enemy_HitShield",
"request": {
"prompt": "One small magical shield deflecting a hit, clear bright glass ping with short soft resonant tail, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62107
},
"requestHash": "099c297ef5e7dd09197eae231cd1fa7b111c61e40aafcc56d41e2d99d539a1fa",
"job": {
"id": "4bdeb6948d4f4a92b941aff68eee7e67",
"status": "succeeded",
"prompt": "One small magical shield deflecting a hit, clear bright glass ping with short soft resonant tail, dry close recording, single isolated event at the beginning, silence afterwards, no music, no speech, no ambience",
"duration": 2.0,
"steps": 50,
"guidance_scale": 4.5,
"seed": 62107,
"created_at": "2026-10-21T03:21:20.888864+00:00",
"started_at": "2026-10-21T03:21:32.071102+00:00",
"finished_at": "2026-10-21T03:21:43.777446+00:00",
"error": null,
"sample_rate": 44100,
"channels": 2,
"bytes": 352844,
"elapsed_sec": 11.706,
"url": "/api/jobs/4bdeb6948d4f4a92b941aff68eee7e67/audio",
"download_url": "/api/jobs/4bdeb6948d4f4a92b941aff68eee7e67/audio"
},
"source": "Tools\\output\\enemy_combat_sfx\\Enemy_HitShield_source.wav",
"sourceSha256": "db7191d5a31abdb63eb83679eb7e3ee7dd59ab4f9d623a25d4b95ee7b362e9ef",
"output": "AIClient\\Assets\\Bundles\\Sound\\SFX\\EnemyCombat\\Enemy_HitShield.wav",
"outputSha256": "13d4dfad5668a40e8538b1e4320e1fcff20eacc0d53f67bb7540170b981c1045",
"seconds": 0.55,
"trimStartSeconds": 0.9950113378684807,
"sampleRate": 44100,
"channels": 2,
"peakDb": -1.938200260161128,
"rmsDb": -12.863749544281681,
"postprocess": "65Hz highpass; onset trim; 5ms fade in / 50ms fade out; peak -1.94 dBFS",
"license": "declare-lab/TangoFlux: noncommercial research weights per project guide"
}
]
}
Binary file not shown.
@@ -0,0 +1,57 @@
{
"status": "pass",
"bank": "Assets/Bundles/Effects/EnemyCombat/EnemyCombatPresentation.prefab",
"effects": 8,
"poolInstances": 32,
"voices": 8,
"clips": [
{
"name": "Enemy_HornletAttack",
"length": 0.48,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_DashletAttack",
"length": 0.42,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_ShellhornAttack",
"length": 0.6,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HornCaptainAttack",
"length": 0.58,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_GreatHornAttack",
"length": 0.82,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitSoft",
"length": 0.34,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitArmor",
"length": 0.42,
"frequency": 44100,
"channels": 2
},
{
"name": "Enemy_HitShield",
"length": 0.55,
"frequency": 44100,
"channels": 2
}
]
}
+79
View File
@@ -0,0 +1,79 @@
# UI 音效批次 v1
2026-10-20,按 `D:/UD/AI/XModel/TangoFlux_AI调用指南.md` 调用本机 `TangoFluxService`(`http://127.0.0.1:8012`)生成。风格贴近《微风小镇》菜单氛围:轻柔木感/糖果感 UI,短促、无音乐、无人声。
## 清单(10 条)
| 地址 | 用途 | 时长 | 种子 |
| --- | --- | --- | --- |
| `Ui_Click` | 通用按钮点击 | 1.5s | 41001 |
| `Ui_Confirm` | 确认 / 正向操作 | 2.0s | 41002 |
| `Ui_Back` | 返回 / 取消 | 1.5s | 41003 |
| `Ui_Open` | 打开面板 | 2.0s | 41004 |
| `Ui_Close` | 关闭面板 | 1.5s | 41005 |
| `Ui_Tab` | 页签切换 | 1.5s | 41006 |
| `Ui_Claim` | 领奖 / 领取附件 | 2.5s | 41007 |
| `Ui_Deny` | 拒绝 / 余额不足等 | 1.5s | 41008 |
| `Ui_Toggle` | 设置开关 | 1.5s | 41009 |
| `Ui_Notify` | 红点 / 通知提示 | 2.0s | 41010 |
## 生成参数
- 模型:`declare-lab/TangoFlux` + 本地 `flan-t5-large`
- `steps=50`,`guidance_scale=4.5`
- 输出:44.1 kHz 立体声 WAV
- 清单:`manifest.json`;任务回执:`Tools/output/ui_sfx_v1/` 与 `generation.json`
- 入口脚本:`python Tools/generate_ui_sfx.py`
## 工程路径
- Bundle:`AIClient/Assets/Bundles/Sound/SFX/UI/{Id}.wav`
- 收集:Art / Sound,`AddressByFileName`,`PackSeparately`
- Unity 导入回执:`unity_validation.json`(10 条、44100 Hz 立体声、DecompressOnLoad/PCM;Art/Sound 已收集)。
- v1 只入库与登记,未接入运行时播放;2026-10-21 已由下文 v2 替换同名 WAV 并接入运行时。
- 许可:TangoFlux 权重为非商业研究用途,商用前须核对上游许可。
## v2 一次性短音效与运行时接入(2026-10-21)
v1 的 10 条里有 9 条从头响到尾,持续 1.5~2.5 秒;`Ui_Open` 前 1.36 秒为静音,不适合作为按钮音。v2 改用"单发后静音"的提示词,每条以服务允许的最短时长 1 秒、4 个种子(52001~52004)生成候选。候选经 `Tools/generate_ui_sfx_v2.py` 后处理:去掉开头静音、截到目标长度、加 2ms 淡入和尾部 40% 平方淡出、归一化峰值。自动选择取目标窗口内能量占比最高、起音最快的候选,原始峰值低于 0.1 的视为噪声并淘汰(这条规则排除了 Notify 原先选中的 52002)。清单为 `manifest_v2.json`,选择结果与全部候选指标见 `generation_v2.json`。
| 地址 | 目标时长 | 峰值 | 选用种子 |
| --- | --- | --- | --- |
| `Ui_Click` | 0.15s | -6 dBFS | 52002 |
| `Ui_Confirm` | 0.45s | -4 dBFS | 52001 |
| `Ui_Back` | 0.22s | -6 dBFS | 52002 |
| `Ui_Open` | 0.35s | -6 dBFS | 52002 |
| `Ui_Close` | 0.28s | -7 dBFS | 52002 |
| `Ui_Tab` | 0.12s | -7 dBFS | 52001 |
| `Ui_Claim` | 0.8s | -3 dBFS | 52001 |
| `Ui_Deny` | 0.3s | -6 dBFS | 52002 |
| `Ui_Toggle` | 0.14s | -7 dBFS | 52001 |
| `Ui_Notify` | 0.5s | -6 dBFS | 52004 |
候选的原始音频和处理后版本在 `Tools/output/ui_sfx_v2/raw|trimmed/`。如需改用其他候选,执行 `python Tools/generate_ui_sfx_v2.py --process --pick Ui_Click=52003`,再用 Pipeline 运行 `BuildUiSfx.Build`。自动选择只依据波形指标,**听感仍需人工试听确认**。v1 原始文件保留在 `Tools/output/ui_sfx_v1/`。
运行时:`UiSfx.prefab`(`Assets/Bundles/Sound/Prefab/`,Art/Sound,地址 `UiSfx`)带一个 2D AudioSource(volume 0.8),并按 `UiSound` 枚举顺序引用 10 个 Clip,由 `GameplayBootstrap` 与主界面音乐一同加载。播放受设置里的"音效"开关控制,与音乐开关互不影响;同一音效 60ms 内的重复请求会被忽略。
| 地址 | 触发 |
| --- | --- |
| `Ui_Click` | 普通按钮 |
| `Ui_Confirm` | 训练/进化/购买/营地操作成功、重复胜利 |
| `Ui_Back` | 取消预览、撤下伙伴、放弃战斗 |
| `Ui_Open` | 首页入口打开面板 |
| `Ui_Close` | 返回/关闭回到首页 |
| `Ui_Tab` | 页签、邮件翻页 |
| `Ui_Claim` | 领奖、捕捉、开宝箱、首通胜利 |
| `Ui_Deny` | 服务端拒绝或连接失败 |
| `Ui_Toggle` | 设置开关、画质、布阵部署/撤下/推荐 |
| `Ui_Notify` | 首页新出现红点 |
验证:`BuildUiSfx.Verify` 与 `VerifyUiSfx.Play` 在隔离的 18081 账号上实际点击,结果为 hud.settings=Open、quality=Toggle、sfxOff=Toggle、关闭音效后关闭页面与打开设置均无声、settings.close=Close、hud.rewards=Open、每日宝箱=Claim、chest.back=Close;真实账号与音效偏好已还原,本轮无新增 Console 错误或警告。未构建或发布。
## v3:程序化合成(2026-10-21)
v2 试听反馈为“不好听”,与清脆轻松的游戏风格不符。v3 不再使用生成模型,改由 `Tools/synth_ui_sfx.py` 合成:
- 音色:木琴(基频加 3.93×、9.2× 快衰泛音)、钟琴(1 / 2.76 / 5.40 / 8.93× 非谐泛音)、气泡 pop(快速上滑的正弦),以及 4ms 高通噪声作起音。
- 映射:Click 气泡 pop;Tab 木琴 A6 轻敲;Toggle 两连 pop;Confirm 木琴 E6→B6 上行;Back 木琴 G6→D6 下行;Open 上滑加 E7 叮;Close 下滑加 G5 闷敲;Claim 钟琴 C6-E6-G6-C7 琶音加高音闪烁;Deny 两声低音柔和 boop;Notify 钟琴 G6→D7 叮叮。
- 调整:改 `RECIPES` 里的音高、衰减和音量后运行 `python Tools/synth_ui_sfx.py --preview`,再在 Unity 里执行 `BuildUiSfx.Build`。
+138
View File
@@ -0,0 +1,138 @@
{
"batchId": "ui_sfx_v1",
"base": "http://127.0.0.1:8012",
"generatedUtc": "2026-10-20T12:09:16Z",
"count": 10,
"items": [
{
"id": "Ui_Click",
"jobId": "4fa18c1f8c1944ae8b28cfd5b5d0860a",
"prompt": "Short soft UI button click, gentle wooden tap with tiny candy-like sparkle, warm cozy mobile game interface, dry close mic, no music, no speech, no reverb tails",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41001,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Click.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"status": "succeeded"
},
{
"id": "Ui_Confirm",
"jobId": "e314eeaf8b8247bfa5be5699d67c2fab",
"prompt": "Soft positive UI confirm chime, two warm xylophone notes ascending, light pastoral fantasy game interface, gentle and short, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41002,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Confirm.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"status": "succeeded"
},
{
"id": "Ui_Back",
"jobId": "853c0fc04415423794334183f2c6c729",
"prompt": "Soft UI cancel or back tap, muted wooden click with quiet downward tone, cozy mobile menu, dry and brief, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41003,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Back.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"status": "succeeded"
},
{
"id": "Ui_Open",
"jobId": "3f7a59e3ec8a4036875f8983249e1c3c",
"prompt": "Soft UI panel open whoosh with a tiny bright chime, paper-light and warm pastoral game menu, short and friendly, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41004,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Open.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"status": "succeeded"
},
{
"id": "Ui_Close",
"jobId": "1750377342534c3e963390968fb8e126",
"prompt": "Soft UI panel close whoosh, gentle downward air and quiet wood latch, cozy fantasy menu, very short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41005,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Close.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"status": "succeeded"
},
{
"id": "Ui_Tab",
"jobId": "5ecffa283c02491e8e74fcffa8a67eb9",
"prompt": "Soft UI tab switch click, light plastic and wood blend, tiny bright tick, pastoral casual game interface, dry and short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41006,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Tab.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"status": "succeeded"
},
{
"id": "Ui_Claim",
"jobId": "0d90f65cd6ae4bd3859e420c00c538f9",
"prompt": "Soft reward claim UI sparkle, small glittering chimes and light coin shimmer, warm candy pastoral fantasy game, short pleasant, no music bed, no speech",
"duration": 2.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41007,
"bytes": 441044,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Claim.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"status": "succeeded"
},
{
"id": "Ui_Deny",
"jobId": "9e1d374b53d34aa0af5d31c7856bf9fc",
"prompt": "Gentle UI error or deny thud, soft muted low wooden knock, not harsh, cozy mobile game feedback, dry and brief, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41008,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Deny.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"status": "succeeded"
},
{
"id": "Ui_Toggle",
"jobId": "1b1160a1d24d4b38885e9fdcb565ade0",
"prompt": "Soft UI toggle switch click, small mechanical soft snap with tiny sparkle, settings panel of a cozy fantasy mobile game, short, no music, no speech",
"duration": 1.5,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41009,
"bytes": 264644,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Toggle.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"status": "succeeded"
},
{
"id": "Ui_Notify",
"jobId": "daedbe297f0741dab2825f7e8c68d31a",
"prompt": "Soft UI notification ping, single warm bell-like chime with tiny sparkle, friendly red-dot alert for a pastoral casual game, short and light, no music, no speech",
"duration": 2,
"steps": 50,
"guidance_scale": 4.5,
"seed": 41010,
"bytes": 352844,
"outputWav": "Tools/output/ui_sfx_v1/Ui_Notify.wav",
"bundleWav": "AIClient/Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"status": "succeeded"
}
]
}
+546
View File
@@ -0,0 +1,546 @@
{
"batchId": "ui_sfx_v2",
"generatedUtc": "2026-10-20T16:17:11Z",
"items": [
{
"id": "Ui_Click",
"targetSec": 0.15,
"peakDb": -6,
"prompt": "A tiny soft wooden button tap for a cozy mobile game menu, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52001.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 0.0044,
"score": 0.0044,
"rawPeak": 0.9835,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52002.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.2191,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52003.wav",
"lengthSec": 0.15,
"onsetSec": 0.0,
"kept": 0.1441,
"score": 0.1441,
"rawPeak": 0.171,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Click_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Click_52004.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0227,
"silent": true
}
]
},
{
"id": "Ui_Confirm",
"targetSec": 0.45,
"peakDb": -4,
"prompt": "Two quick bright xylophone notes rising, a cheerful positive confirm blip for a cute game, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52001.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.9705,
"score": 0.9705,
"rawPeak": 0.5869,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52002.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.7008,
"score": 0.7008,
"rawPeak": 0.4395,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52003.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.3875,
"score": 0.3875,
"rawPeak": 0.3589,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Confirm_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Confirm_52004.wav",
"lengthSec": 0.45,
"onsetSec": 0.0,
"kept": 0.1696,
"score": 0.1696,
"rawPeak": 0.8513,
"silent": false
}
]
},
{
"id": "Ui_Back",
"targetSec": 0.22,
"peakDb": -6,
"prompt": "A soft muted wooden click with a short falling tone, a gentle cancel blip, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52001.wav",
"lengthSec": 0.22,
"onsetSec": 0.2103,
"kept": 0.9899,
"score": 0.6093,
"rawPeak": 0.8346,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52002.wav",
"lengthSec": 0.22,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.4434,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0277,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Back_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Back_52004.wav",
"lengthSec": 0.22,
"onsetSec": 0.0,
"kept": 0.4987,
"score": 0.4987,
"rawPeak": 0.1429,
"silent": false
}
]
},
{
"id": "Ui_Open",
"targetSec": 0.35,
"peakDb": -6,
"prompt": "A quick soft paper swoosh ending in a tiny bright chime, a menu panel opening, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52001.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.6677,
"score": 0.6677,
"rawPeak": 0.1025,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52002.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.6826,
"score": 0.6826,
"rawPeak": 0.6354,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52003.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.2222,
"score": 0.2222,
"rawPeak": 0.1919,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Open_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Open_52004.wav",
"lengthSec": 0.35,
"onsetSec": 0.0,
"kept": 0.5536,
"score": 0.5536,
"rawPeak": 0.7946,
"silent": false
}
]
},
{
"id": "Ui_Close",
"targetSec": 0.28,
"peakDb": -7,
"prompt": "A quick soft downward air swish ending in a quiet wooden latch tap, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52001.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0116,
"silent": true
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52002.wav",
"lengthSec": 0.28,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0602,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Close_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Close_52004.wav",
"lengthSec": 0.28,
"onsetSec": 0.0,
"kept": 0.4045,
"score": 0.4045,
"rawPeak": 0.7418,
"silent": false
}
]
},
{
"id": "Ui_Tab",
"targetSec": 0.12,
"peakDb": -7,
"prompt": "A tiny light plastic tick, a crisp tab switch click, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52001.wav",
"lengthSec": 0.12,
"onsetSec": 0.2106,
"kept": 0.9333,
"score": 0.5521,
"rawPeak": 0.3409,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0186,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0724,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Tab_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Tab_52004.wav",
"lengthSec": 0.12,
"onsetSec": 0.0,
"kept": 0.0746,
"score": 0.0746,
"rawPeak": 0.151,
"silent": false
}
]
},
{
"id": "Ui_Claim",
"targetSec": 0.8,
"peakDb": -3,
"prompt": "A short sparkling glitter chime with a light coin jingle, a happy reward collected sound, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52001.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 1.0,
"score": 1.0,
"rawPeak": 0.8577,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52002.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.9356,
"score": 0.9356,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52003.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.7923,
"score": 0.7923,
"rawPeak": 0.1699,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Claim_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Claim_52004.wav",
"lengthSec": 0.8,
"onsetSec": 0.0,
"kept": 0.8342,
"score": 0.8342,
"rawPeak": 1.0,
"silent": false
}
]
},
{
"id": "Ui_Deny",
"targetSec": 0.3,
"peakDb": -6,
"prompt": "A soft dull low wooden knock, two quick muted thuds, a gentle error buzz that is not harsh, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52002,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52001.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.6486,
"score": 0.6486,
"rawPeak": 1.0,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52002.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.9816,
"score": 0.9816,
"rawPeak": 0.6965,
"silent": false
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52003.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.46,
"score": 0.46,
"rawPeak": 0.2253,
"silent": false
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Deny_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Deny_52004.wav",
"lengthSec": 0.3,
"onsetSec": 0.0,
"kept": 0.3231,
"score": 0.3231,
"rawPeak": 1.0,
"silent": false
}
]
},
{
"id": "Ui_Toggle",
"targetSec": 0.14,
"peakDb": -7,
"prompt": "A small soft mechanical switch snap, a toggle click, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52001,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52001.wav",
"lengthSec": 0.14,
"onsetSec": 0.2068,
"kept": 0.9939,
"score": 0.6202,
"rawPeak": 0.8638,
"silent": false
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0479,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0176,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Toggle_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Toggle_52004.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0448,
"silent": true
}
]
},
{
"id": "Ui_Notify",
"targetSec": 0.5,
"peakDb": -6,
"prompt": "A single warm small bell ping with a tiny sparkle, a friendly notification, a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb",
"pickedSeed": 52004,
"pickedBy": "auto",
"candidates": [
{
"seed": 52001,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52001.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52001.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0001,
"silent": true
},
{
"seed": 52002,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52002.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52002.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0006,
"silent": true
},
{
"seed": 52003,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52003.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52003.wav",
"lengthSec": 0.0,
"onsetSec": 0.0,
"kept": 0.0,
"score": -1.0,
"rawPeak": 0.0162,
"silent": true
},
{
"seed": 52004,
"raw": "Tools/output/ui_sfx_v2/raw/Ui_Notify_52004.wav",
"trimmed": "Tools/output/ui_sfx_v2/trimmed/Ui_Notify_52004.wav",
"lengthSec": 0.5,
"onsetSec": 0.0,
"kept": 0.5332,
"score": 0.5332,
"rawPeak": 1.0,
"silent": false
}
]
}
]
}
+77
View File
@@ -0,0 +1,77 @@
{
"schemaVersion": 1,
"batchId": "ui_sfx_v1",
"theme": "Candy pastoral soft UI, matches MeadowBreeze menu mood",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"outputDir": "Tools/output/ui_sfx_v1",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/UI",
"designDir": "Doc/Design/Sound/UiSfx",
"defaults": {
"duration": 2,
"steps": 50,
"guidance_scale": 4.5
},
"items": [
{
"id": "Ui_Click",
"seed": 41001,
"duration": 1.5,
"prompt": "Short soft UI button click, gentle wooden tap with tiny candy-like sparkle, warm cozy mobile game interface, dry close mic, no music, no speech, no reverb tails"
},
{
"id": "Ui_Confirm",
"seed": 41002,
"duration": 2,
"prompt": "Soft positive UI confirm chime, two warm xylophone notes ascending, light pastoral fantasy game interface, gentle and short, no music, no speech"
},
{
"id": "Ui_Back",
"seed": 41003,
"duration": 1.5,
"prompt": "Soft UI cancel or back tap, muted wooden click with quiet downward tone, cozy mobile menu, dry and brief, no music, no speech"
},
{
"id": "Ui_Open",
"seed": 41004,
"duration": 2,
"prompt": "Soft UI panel open whoosh with a tiny bright chime, paper-light and warm pastoral game menu, short and friendly, no music, no speech"
},
{
"id": "Ui_Close",
"seed": 41005,
"duration": 1.5,
"prompt": "Soft UI panel close whoosh, gentle downward air and quiet wood latch, cozy fantasy menu, very short, no music, no speech"
},
{
"id": "Ui_Tab",
"seed": 41006,
"duration": 1.5,
"prompt": "Soft UI tab switch click, light plastic and wood blend, tiny bright tick, pastoral casual game interface, dry and short, no music, no speech"
},
{
"id": "Ui_Claim",
"seed": 41007,
"duration": 2.5,
"prompt": "Soft reward claim UI sparkle, small glittering chimes and light coin shimmer, warm candy pastoral fantasy game, short pleasant, no music bed, no speech"
},
{
"id": "Ui_Deny",
"seed": 41008,
"duration": 1.5,
"prompt": "Gentle UI error or deny thud, soft muted low wooden knock, not harsh, cozy mobile game feedback, dry and brief, no music, no speech"
},
{
"id": "Ui_Toggle",
"seed": 41009,
"duration": 1.5,
"prompt": "Soft UI toggle switch click, small mechanical soft snap with tiny sparkle, settings panel of a cozy fantasy mobile game, short, no music, no speech"
},
{
"id": "Ui_Notify",
"seed": 41010,
"duration": 2,
"prompt": "Soft UI notification ping, single warm bell-like chime with tiny sparkle, friendly red-dot alert for a pastoral casual game, short and light, no music, no speech"
}
]
}
+31
View File
@@ -0,0 +1,31 @@
{
"schemaVersion": 2,
"batchId": "ui_sfx_v2",
"theme": "Candy pastoral soft UI, matches MeadowBreeze menu mood; one-shot transients for buttons",
"service": "http://127.0.0.1:8012",
"guide": "D:/UD/AI/XModel/TangoFlux_AI调用指南.md",
"outputDir": "Tools/output/ui_sfx_v2",
"bundleDir": "AIClient/Assets/Bundles/Sound/SFX/UI",
"designDir": "Doc/Design/Sound/UiSfx",
"notes": "v1 clips sustained for the full 1.5-2.5s. Service minimum is 1s, so v2 generates 1s one-shots with several seeds, then trims leading silence, caps each clip at targetSec with a fade-out, normalizes to peakDb and auto-picks the candidate whose energy already sits inside the target window.",
"defaults": {
"duration": 1,
"steps": 50,
"guidance_scale": 4.5,
"seeds": [52001, 52002, 52003, 52004],
"fadeInMs": 2,
"suffix": ", a single isolated one-shot sound at the very start followed by complete silence, dry close mic, no music, no speech, no reverb"
},
"items": [
{ "id": "Ui_Click", "targetSec": 0.15, "peakDb": -6, "prompt": "A tiny soft wooden button tap for a cozy mobile game menu" },
{ "id": "Ui_Confirm", "targetSec": 0.45, "peakDb": -4, "prompt": "Two quick bright xylophone notes rising, a cheerful positive confirm blip for a cute game" },
{ "id": "Ui_Back", "targetSec": 0.22, "peakDb": -6, "prompt": "A soft muted wooden click with a short falling tone, a gentle cancel blip" },
{ "id": "Ui_Open", "targetSec": 0.35, "peakDb": -6, "prompt": "A quick soft paper swoosh ending in a tiny bright chime, a menu panel opening" },
{ "id": "Ui_Close", "targetSec": 0.28, "peakDb": -7, "prompt": "A quick soft downward air swish ending in a quiet wooden latch tap" },
{ "id": "Ui_Tab", "targetSec": 0.12, "peakDb": -7, "prompt": "A tiny light plastic tick, a crisp tab switch click" },
{ "id": "Ui_Claim", "targetSec": 0.8, "peakDb": -3, "prompt": "A short sparkling glitter chime with a light coin jingle, a happy reward collected sound" },
{ "id": "Ui_Deny", "targetSec": 0.3, "peakDb": -6, "prompt": "A soft dull low wooden knock, two quick muted thuds, a gentle error buzz that is not harsh" },
{ "id": "Ui_Toggle", "targetSec": 0.14, "peakDb": -7, "prompt": "A small soft mechanical switch snap, a toggle click" },
{ "id": "Ui_Notify", "targetSec": 0.5, "peakDb": -6, "prompt": "A single warm small bell ping with a tiny sparkle, a friendly notification" }
]
}
@@ -0,0 +1,83 @@
{
"batch": "ui_sfx_v3",
"prefab": "Assets/Bundles/Sound/Prefab/UiSfx.prefab",
"address": "UiSfx",
"package": "Art",
"group": "Sound",
"volume": 0.8,
"sfxToggle": "PrototypeClientPrefs.Sfx",
"clips": [
{
"sound": "Click",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"seconds": 0.08,
"channels": 2,
"frequency": 44100
},
{
"sound": "Confirm",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"seconds": 0.36,
"channels": 2,
"frequency": 44100
},
{
"sound": "Back",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"seconds": 0.22,
"channels": 2,
"frequency": 44100
},
{
"sound": "Open",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"seconds": 0.34,
"channels": 2,
"frequency": 44100
},
{
"sound": "Close",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"seconds": 0.24,
"channels": 2,
"frequency": 44100
},
{
"sound": "Tab",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"seconds": 0.07,
"channels": 2,
"frequency": 44100
},
{
"sound": "Claim",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"seconds": 0.78,
"channels": 2,
"frequency": 44100
},
{
"sound": "Deny",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"seconds": 0.27,
"channels": 2,
"frequency": 44100
},
{
"sound": "Toggle",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"seconds": 0.1,
"channels": 2,
"frequency": 44100
},
{
"sound": "Notify",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"seconds": 0.52,
"channels": 2,
"frequency": 44100
}
],
"bundleBuilt": false,
"verifiedUtc": "2026-10-21T01:21:08.0054518Z"
}
+68
View File
@@ -0,0 +1,68 @@
{
"batchId": "ui_sfx_v3",
"method": "procedural synthesis (Tools/synth_ui_sfx.py, numpy)",
"format": "44.1 kHz 16-bit stereo (dual mono)",
"generatedUtc": "2026-10-21T01:20:43Z",
"items": [
{
"id": "Ui_Click",
"recipe": "bubble pop 700→1250 Hz + noise tick",
"peakDb": -6,
"lengthSec": 0.08
},
{
"id": "Ui_Confirm",
"recipe": "marimba E6→B6 rising, glockenspiel on top note",
"peakDb": -5,
"lengthSec": 0.36
},
{
"id": "Ui_Back",
"recipe": "soft marimba G6→D6 falling",
"peakDb": -7,
"lengthSec": 0.22
},
{
"id": "Ui_Open",
"recipe": "rising fwip 520→1400 Hz into an E7 ping",
"peakDb": -7,
"lengthSec": 0.34
},
{
"id": "Ui_Close",
"recipe": "falling fwip 1300→480 Hz into a soft G5 tok",
"peakDb": -7,
"lengthSec": 0.24
},
{
"id": "Ui_Tab",
"recipe": "light marimba A6 tick",
"peakDb": -8,
"lengthSec": 0.07
},
{
"id": "Ui_Toggle",
"recipe": "double pop 900→1500 then 1200→1900 Hz",
"peakDb": -8,
"lengthSec": 0.1
},
{
"id": "Ui_Claim",
"recipe": "glockenspiel arpeggio C6-E6-G6-C7 with marimba body and high sparkles",
"peakDb": -3,
"lengthSec": 0.78
},
{
"id": "Ui_Deny",
"recipe": "two soft low boops 330→262 Hz, gentle not harsh",
"peakDb": -7,
"lengthSec": 0.27
},
{
"id": "Ui_Notify",
"recipe": "bell ding-ding G6 then D7",
"peakDb": -6,
"lengthSec": 0.52
}
]
}
@@ -0,0 +1,122 @@
{
"folder": "Assets/Bundles/Sound/SFX/UI",
"count": 10,
"items": [
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"guid": "d84d9acaed435b141a61e474619abcac",
"address": "Ui_Back",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"guid": "6b80419ca6ccf464684cf5851cbe4258",
"address": "Ui_Claim",
"length": 2.5,
"samples": 110250,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"guid": "c462f9f6d11e50a41bf9bf465828669b",
"address": "Ui_Click",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"guid": "7301e73517800ea4ea3d719f4430b37b",
"address": "Ui_Close",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"guid": "91b80154d0ef8334b84d521bfa2d570c",
"address": "Ui_Confirm",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"guid": "33b23f7d7f48b92429e107ef44a5dc40",
"address": "Ui_Deny",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"guid": "a0da13344018a0f468a61d21b6f8dad7",
"address": "Ui_Notify",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"guid": "2982867cae515b24d9f342ca74728d99",
"address": "Ui_Open",
"length": 2.0,
"samples": 88200,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"guid": "ff0f87f7678cd61429a4c92c5e1ef59f",
"address": "Ui_Tab",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
},
{
"asset": "Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"guid": "319d495703f33964ca38bb8dd78c9691",
"address": "Ui_Toggle",
"length": 1.5,
"samples": 66150,
"channels": 2,
"frequency": 44100,
"loadType": "DecompressOnLoad",
"compression": "PCM"
}
],
"package": "Art",
"group": "Sound",
"packRule": "PackSeparately",
"runtimePlaybackWired": false,
"bundleBuilt": false,
"verifiedUtc": "2026-10-20T12:11:18.9078923Z"
}