# Voice-Over Asset Management

This document defines voice-over asset management for
`TODOS.phase-72.72.11.2.6`. It establishes the per-locale VO directory
structure, naming conventions, file format requirements, metadata sidecars, and
rights-tracking fields used by later recording, integration, lip-sync, and
subtitle timing tasks.

The tracked contract is
`V2/ue/Content/Localization/V2/VoiceOverAssetManagement_V2_Contract.json`. The
managed manifest lives in
`V2/ue/Content/Localization/V2/VoiceOver/VoiceOverAssetManifest_V2.json`, and
the deterministic generated report lives in
`V2/ue/Content/Localization/V2/VoiceOver/VoiceOverAssetManagementReport_V2.json`.

## Directory Structure

Each launch locale has a logical voice root at
`V2/ue/Content/V2/Audio/Voice/{locale}` and an Unreal root at
`/Game/V2/Audio/Voice/{locale}`. Each locale owns the same five voice banks:
announcer, fighter barks, story dialogue, tutorial, and system.

Every bank declares `source_wav`, `imported_uasset`, and `metadata`
subdirectories. Launch voice-over locales and subtitle-only patch-plan locales
use the same structure so pickup recordings can land without changing import
rules.

## Naming And Format

Source voice files use the pattern
`VO_{localeToken}_{bankToken}_{speakerId}_{stringId}_T{take}.wav`. Locale tokens
replace hyphens with underscores, and take numbers are always two digits.

The required source format is 48 kHz, 24-bit mono PCM WAV at -23 LUFS with a
maximum true peak of -1 dBTP. Metadata sidecars use `.voasset.json` and must
carry string ID, locale, speaker, voice bank, take, duration, source WAV hash,
and rights ID.

## Validation

`V2/ue/Tools/generate-v2-voice-over-asset-management.py` reads the manifest and
the localization voice-over pipeline contract, then emits a report covering all
22 launch locales, 110 bank directories, 330 bank subdirectories, and 110 naming
examples.

`V2/ue/Tools/check-v2-voice-over-asset-management.py` validates the contract,
manifest, generated report, deterministic output, documentation, GitHub workflow
wiring, and Horde required gates. The checker also runs a negative case that
removes one voice bank and changes the sample rate to verify the generator fails
invalid asset-management rules.
