# TASK — Find-Word v0.1.1 Korean neural voice upgrade ## 사용자 지시 현재 v0.1의 한국어 음성이 제대로 만들어지지 않았다. 음성 품질을 높이고 샘플을 다시 생성하며 버전을 0.1.1로 올린다. 모든 소스는 Gitea에 push 및 main merge할 예정이다. Codex는 구현만 하고 commit/push/deploy는 하지 않는다. ## 고정 계약 - 정확한 크레딧: `Designed by OZ at Heat-T Medical Inc.` - canonical repository: `https://source.ibit.kr/OZ-Group/Find-Word` - 작업 브랜치: `fix/v0.1.1-neural-voice` - 버전: UI/package/docs/manifest 모두 `0.1.1` - 한국어 상세 소스 주석 유지 - 기존 10개 mechanic, 100개 문장 조합, 8개 환경, 5단계 SNR, 객관식·주관식 기능 보존 ## 선택한 생성 방식 - 직접 생성한 사전 샘플에서 사용 가능한 고품질 음성: `ko-KR-HyunsuMultilingualNeural` - 생성 클라이언트: `edge-tts==7.3.1` - 권장 prosody: rate `-6%`, pitch `-4Hz` - 앱 런타임에는 외부 TTS/API 요청이 없어야 한다. - 생성 시 임시 MP3를 받아 ffmpeg로 24kHz mono PCM s16 WAV로 변환한다. - 음성 간 레벨 편차와 peak를 완화하되 발음을 훼손하는 과도한 DSP를 하지 않는다. - 네트워크·provider 오류에 bounded retry와 명확한 실패를 제공한다. - 부분 실패가 기존 public/audio를 훼손하지 않도록 임시 디렉터리에서 전체 생성·검증 후 원자 교체한다. - API 키·쿠키·인증정보를 저장하지 않는다. ## 품질·재현성 요구사항 - intro 1개 + 목표 문장 100개, 총 101개를 모두 새로 생성한다. - manifest에 version, provider, voice, rate, pitch, edge-tts version, ffmpeg version, sample rate, SHA-256, bytes, duration, 원문을 기록한다. - 24kHz mono 16-bit PCM, 비무음, peak full-scale 미도달, 비정상적으로 짧거나 긴 파일 없음. - `audio:generate`는 pinned venv의 Python으로 재현 가능해야 하고 README/AUDIO_PROVENANCE에 설치·생성 절차와 provider 의존성·한계를 기록한다. - `public/audio/intro.wav`와 대표 샘플 `luck-apple.wav`가 청취용 샘플이다. - eSpeak cache/download 경로·문서·manifest 의존성을 제거한다. 과거 evidence는 당시 기록이므로 내용 변조 없이 보존한다. - 생성 도구의 오픈소스 라이선스와 서비스 사용 조건을 과장 없이 문서화한다. 프로젝트가 음성 자체에 독점 권리를 주장한다고 쓰지 않는다. ## TDD 1. 버전 0.1.1 계약 테스트 RED 2. neural provider/voice/manifest 계약 RED 3. 24kHz·비무음·peak·duration·101개 integrity RED 4. generator atomicity/retry/unsafe secret absence 테스트 RED 5. 기존 full suite와 browser suite GREEN ## 최종 검증 - npm ci - npm run lint - npm test - npm run audio:generate 또는 명시적 생성 명령 - npm run build - sandboxed system Chrome browser tests - npm audit --audit-level=high - 101개 manifest/hash/PCM 독립 검사 ## 기록 `.agent/RESULT-v0.1.1.md`에 RED/GREEN, 변경 파일, 생성 provider/voice, 자산 크기, 최종 결과, 남은 청감·provider 위험을 기록한다.