vignette/docs/archive/voice-art/bimec-persona-voice-poc-2026-06-27.md
Yun Chan 778e8526d4 세션 평가·라이브코치·교수자 분석 라운드 마감 + 문서 정리 + 코드품질 리팩터
- 누적 작업트리 커밋: 회기 평가 복구·durable 저장, 라이브 코치 이력/근거, 교수자 학생분석, 음성 비언어 메타, PII 마스킹, 운영 티켓/헬스 등
- 문서: 완료 기록 docs/archive/ 냉동 보관, docs/ 단일 인덱스(docs/README.md)+통합 TODO(docs/TODO.md)로 정리
- 리팩터(행위 보존): Stage enum SSOT(taxonomy 소유·state_machine re-export), store recent/masked_turns 중복 제거, speaker_ko_label 단일 헬퍼, _list_sessions N+1 제거(state/turns 배치 + 턴평가 하이드레이션 배치)
- 검증: 백엔드 pytest 352 passed, _list_sessions E2E chromium-single-run 2 passed
2026-07-02 02:50:36 +09:00

4 KiB

BIMEC 페르소나 음성 PoC - 2026-06-27

목적

BIMEC/Vignette 상담 시뮬레이션에서 내담자 페르소나가 텍스트만이 아니라 목소리의 정서 변화까지 표현하도록 한다. 1차 목표는 P1 서연 음성을 우울·무기력 상태에서 경계/불안, 라포 형성, 조심스러운 회복감까지 한 목소리 계열로 샘플링하는 것이다.

로컬 모델 조사 결과

  • 채택 후보: 로컬 ComfyUI Higgs Audio v3 TTS 서버.
  • 위치: C:\Users\encep\Tools\ComfyUI_windows_portable\ComfyUI\custom_nodes\Higgs_v3-TTS-ComfyUI.
  • 사용: 서버 래퍼(higgs_server.py)는 기존 reference voice를 내장하므로 BIMEC 페르소나 제작에는 쓰지 않는다. 스크립트가 Higgs 런타임을 직접 로드해 무참조 synthetic seed voice를 먼저 만든다.
  • 장점: 한국어 zero-shot voice cloning, inline emotion/style/prosody/SFX 태그, 속도·피치·pause 제어.
  • 제약: 약 9~11GB VRAM 단독 여유. SUPIR/Qwen 등 GPU 작업과 동시 실행 금지.
  • 라이선스/권리: Higgs Audio v3는 연구·비상업 라이선스 계열로 확인됨. 상업 서비스 탑재 전 라이선스 확정이 필요하다.

금지 원칙

  • 실존 인물·성우·강의 음성 reference로 BIMEC 서비스 페르소나를 만들지 않는다.
  • 기존 로컬 clean_ref_seg1.wav, kangsujin_*, GPT-SoVITS ref 등은 이 작업에서 금지한다.
  • "그 급의 표현력"은 목표로 삼되, 음색은 무참조 synthetic seed 또는 명시 동의·라이선스가 확보된 음성만 사용한다.

P1 서연 음성 방향

  • 기본 음색: 청소년 여성으로 들리되 과도하게 아동화하지 않는다.
  • 초기 상태: 떨림, 낮은 에너지, 말끝 흐림, 긴 pause.
  • 경계 상태: 비밀 보장 걱정 때문에 말이 빨라지고 톤높이가 올라간다.
  • 라포 이후: 속도가 조금 안정되고 숨이 덜 막힌다.
  • 회복감: 밝아져도 과장 금지. "씩씩함"이 아니라 "조금 괜찮아짐" 수준.

산출물

  • 생성 스크립트: docs/voice-art/scripts/generate_p1_seoyeon_higgs_samples.py
  • 샘플 폴더: docs/voice-art/p1-seoyeon-higgs-v3-20260627/
  • 생성 방식: Higgs 무참조 생성으로 _synthetic_seed_no_external_reference를 만들고, 그 synthetic seed만 재참조한다.

서비스 연결 현황

  • 연결 방식: VoiceService.synthesize_stream에 개발용 P1 sample TTS provider를 추가했다.
  • 활성화: ENVIRONMENT=dev에서만 VIGNETTE_VOICE_POC_SAMPLE_TTS=true로 켠다.
  • 대상: P1 soft-young-fem preset만 샘플 provider를 사용한다. P2/P3와 일반 preset은 기존 OpenAI TTS 경로를 유지한다.
  • 동작: AI가 생성한 내담자 응답 텍스트를 보고 우울·피로·불안·라포·회복 샘플 중 가장 가까운 MP3를 /voice/ws binary TTS chunk로 재생한다.
  • 범위: 이 provider는 TTS 출력만 바꾼다. 실제 마이크 입력/STT 캐스케이드는 여전히 OPENAI_API_KEY가 있어야 가용하다.
  • 한계: 현재 PoC는 답변 문장을 그대로 새 합성하지 않고 정서 샘플을 재생한다. 상업 라이선스·권리정책이 닫히기 전에는 프로덕션 배포 금지.

검증

  • 단위/계약: python -m unittest app.test_voice_service app.test_voice_ws app.test_session_turn_persistence app.test_runtime_policy 42 tests OK.
  • 실제 자산 스트림: P1 회복감 문장 기준 provider p1-sample-poc, 20 chunks, 78,573 bytes.
  • 서비스 smoke: dev-login → P1 session → /voice/ws text_turn → reply/state/tts_end + binary 20 chunks 수신 확인.

서비스 연결 전 게이트

  • 소유자 결정: Higgs 상업 라이선스 확보 또는 배포 가능한 대체 모델 선정.
  • 음원 권리: 실제 reference voice를 쓰는 경우 P1/P2/P3 각 페르소나용 동의 받은 reference voice만 허용.
  • 임상 검수: 감정 표현이 상담 훈련을 방해할 정도로 과장하지 않는지 확인.
  • 기술 검수: 샘플 음성 duration, loudness, silence, style token drift, browser playback 확인.