Integrate immutable voice input snapshots and history validation

This commit is contained in:
NINI
2026-10-05 02:24:47 +09:00
15 changed files with 2616 additions and 2 deletions
+15 -1
View File
@@ -56,7 +56,7 @@ python tools/audio/generate_voice.py --catalog SourceAssets/Audio/Voice/voice-ca
python tools/audio/generate_voice.py --catalog SourceAssets/Audio/Voice/voice-catalog.json --profile SourceAssets/Audio/Voice/qwen-profile.json --validate-only --manifest SourceAssets/Audio/Voice/generated/20261004T161231511126Z_aa20f404/manifest.json
```
초기 RED는 생성기 모듈이 없어 종료 코드 1이었습니다. 최종 GREEN에서는 동작 검증 테스트 11개가 종료 코드 0으로 통과했습니다. 잘못된 카탈로그, 현재 대본·프로필과 부분 검사 범위, 실패하거나 비정상적인 WAV, 누락·손상 WAV, 대본·설정 변경, 해시 변조, 이전 원본 보존, 리샘플링, 다른 게임 파일 덮어쓰기 거부, 긴 숫자 출력 차단, 특정 클립만 새 회차로 생성하는 동작, 전부 재사용할 때 모델 로딩 없이 현재 패키지·장치와 원본 생성 환경을 연결하는 동작을 검사합니다.
초기 RED는 생성기 모듈이 없어 종료 코드 1이었습니다. 최종 GREEN에서는 동작 검증 테스트 16개가 종료 코드 0으로 통과했습니다. 잘못된 카탈로그, 현재 대본·프로필과 부분 검사 범위, 실패하거나 비정상적인 WAV, 누락·손상 WAV, 대본·설정 변경, 해시 변조, 이전 원본 보존, 리샘플링, 다른 게임 파일 덮어쓰기 거부, 긴 숫자 출력 차단, 특정 클립만 새 회차로 생성하는 동작, 전부 재사용할 때 모델 로딩 없이 현재 패키지·장치와 원본 생성 환경을 연결하는 동작을 검사합니다. 회차 입력 snapshot 보존·손상 검사와 검증 전용 경로의 비로딩 검사도 포함합니다.
첫 표본 생성·확대 생성·검사 전용 명령은 각각 종료 코드 0이었습니다. `--validate-only`는 모델을 로딩하거나 다운로드하지 않습니다. ID를 생략하면 현재 T2 필수 세 클립 전체를 검사하고, `--ids`를 지정하면 선택 범위를 결과에 기록합니다. 생성한 열두 클립을 모두 지정한 파일·이력 검사는 종료 코드 0이었지만 count_05의 별도 음질 문제는 합격으로 처리하지 않았습니다. 잘못된 ID `missing`은 해당 ID를 포함한 오류와 종료 코드 1을 반환했습니다. 마지막 `pip check`는 종료 코드 0으로 충돌이 없었습니다.
@@ -65,3 +65,17 @@ python tools/audio/generate_voice.py --catalog SourceAssets/Audio/Voice/voice-ca
전부 재사용하는 실제 CLI 검사 회차 `20261004T165608559600Z_21530dcf`는 세 필수 클립을 재사용하고 종료 코드 0으로 통과했습니다. 새 manifest에 현재 Python·패키지 버전, `nvidia-smi`로 확인한 RTX 4080 SUPER 장치, `modelLoad=not_needed`, 서로 다른 두 원본 생성 회차의 manifest 경로·SHA-256·실제 생성 환경을 기록했습니다. 원본 manifest 해시도 대조했습니다. 모델 로딩·재추론은 하지 않았으며 기존 승인 파일과 기본 프로필을 변경하지 않았습니다. 해당 실행 로그는 `reuse-environment.log`입니다.
Unity `.meta`는 통합 후 실제 Editor import로 생성해야 하며 직접 작성하지 않았습니다. 남은 검수는 승인된 세 파일을 제외한 발화의 청취·승인 해시 기록, count_05 및 이후 안내 음성 검수, Android 빌드의 음성 큐·믹스 재생 확인입니다.
## 회차별 실제 입력 보존 보완
이전 manifest는 실제 입력의 해시만 담고 있어 공유 카탈로그·프로필을 변경하면 과거 WAV의 대본과 말투 지시·seed 등을 직접 복원하기 어려웠습니다. 새 회차는 `generated/<runId>/catalog.json`과 `profile.json`에 전체 실제 입력을 보존합니다. manifest의 `inputSnapshots`가 이 두 파일을 가리키며 기존 `catalogHash`·`profileHash`와 구조화된 JSON의 SHA-256을 대조합니다. 프로필 snapshot에는 모델 ID와 고정 revision, 언어, 목소리, 지시문, 장치, dtype, attention, seed, 생성 인자가 그대로 남습니다. 실제 모델 기본값과 적용 인자는 기존 환경 기록으로 함께 확인합니다.
snapshot은 새 회차 폴더를 만들 때 한 번 저장하고 공유 입력 변경이나 다른 회차 생성으로 덮어쓰지 않습니다. 재사용은 원래 회차·파일·파일 해시·대본 및 설정 해시 연결을 유지하며, 해당 원본 manifest와 원본 입력 snapshot도 확인합니다. snapshot 누락·손상·해시 불일치 또는 현재 입력과 회차 입력의 불일치는 검증 실패입니다. `--validate-only`는 파일과 이력만 읽으며 모델이나 네트워크를 사용하지 않습니다.
기존 네 회차는 manifest와 WAV를 변경하지 않았습니다. 현재 고정 입력의 실제 구조화 해시가 각 과거 manifest의 `catalogHash=491c9cd0bb7068a47b33bdd0b19ece1ba634217ec0ed9cc3e2c5aa7bd3802755`, `profileHash=a5740d9db8a4aaebf08d0ac3b8f3225693f878aa2868143f01191a059e2680e8`과 정확히 일치함을 모두 대조한 후, 각 폴더에 입력 sidecar 두 파일씩 추가했습니다. 기존 manifest에는 snapshot 필드를 소급 작성하지 않았으며 고정 파일명 규칙으로 sidecar를 연결합니다. 전환 기록은 `input-snapshot-migration.json`에 기존 manifest 해시·검증한 입력 해시·sidecar 경로·날짜·보존 artifact 해시를 담았습니다. 기존 원본 WAV, 네 manifest, 공유 입력, 사용자 승인 selection, 게임 WAV 등 총 31개 artifact의 SHA-256이 전환 전후 동일했습니다. 새 추론을 수행한 것처럼 기록하지 않았습니다.
입력 보존 회귀 검사 네 개는 구현 전 RED(종료 1, 실패 3개·오류 1개)를 재현했고, 보완 후 전체 16개가 GREEN(종료 0)이었습니다. 공유 입력을 실제 변경한 후에도 과거 snapshot의 전체 대본·설정과 원본 WAV가 보존되는지 검사했습니다. legacy sidecar 검사와 원본 snapshot 누락을 통한 재사용 연결 실패도 확인했습니다.
새 회차 `20261004T171918683576Z_7a8cbd60`는 세 필수 음성을 전부 재사용하고 실제 입력 snapshot과 manifest를 기록했으며 CLI 종료 0이었습니다. 기존 네 회차와 새 회차의 검증 전용 명령은 각각 명시된 생성 범위에 대해 종료 0이었습니다. 이때 모델 loader·장치 명령을 차단했고 torch·qwen_tts·huggingface_hub가 import되지 않았음을 별도 JSON 증거에 기록했습니다. 원본을 건드리지 않는 검사 복사본에서 snapshot 누락·손상·해시 불일치, manifest 해시 불일치, 현재 프로필 불일치의 실제 CLI 다섯 건은 각각 종료 1을 반환했습니다. 승인된 세 게임 WAV와 기본 프로필은 변경하지 않았습니다.
증거 경로는 `artifacts/verification/FirstSlice/Voice/InputSnapshots/`의 `red-tests.log`, `green-tests.log`, `legacy-migration.log`, `reuse-new-snapshot-run.log`, `validate-only-proof.json` 및 `.log`, `negative-cli-proof.json` 및 `.log`입니다. 이는 입력·파일·이력 검증 증거이며 미검수 음성의 청각 합격을 뜻하지 않습니다.