화자인식 저장소와 이번 차수 범위
현재 임베딩은 서버에 저장되지 않는다. 기기에서 화자 등록·식별은 가능하지만, 제품 서버의 임베딩 보관까지 구현된 상태는 아니다. 화자인식은 SQLite 대화내역 DB 없이 동작하며, 샘플 서버의 관심사 DB는 별개다.
저장 위치
| 정보 | 관리 주체 | 저장 위치 |
|---|---|---|
| voiceId, 닉네임, 화자 설정 | AI-Agent | 화자별 profile.json |
| 화자인식 기준 임베딩 | AI-Agent | 화자별 reference_embedding.bin |
| 서버 전송 대기 프로필·임베딩 | DeviceAgent | 암호화 SharedPreferences voice_profile_pending_outbox; 기기 내부 |
| voiceId 연결·닉네임·동의·관심사 | PC 샘플 Gateway | personalization.db의 profiles 테이블; 기본 경로 ~/.local/share/voice-profile-sample/personalization.db |
| 사용자 계정과 voiceId 연결·임베딩 원본 | 제품 AWS Backend | 목표 책임. 현재 샘플에는 계정 연결·임베딩 서버 저장 미구현 |
| 일반 LLM 멀티턴 문맥 | 기존 LLM 처리 경로 | 기존 동작 유지; 이번 삭제 대상 아님 |
| 화자별 대화내역 | 다음 차수 | 이번 차수에서는 저장·조회하지 않음 |
서버가 실제로 저장하는 값
샘플 서버 DB의 기본 키는 (device_id, voice_id)다. 필드는 device_id, voice_id, nickname, enabled, interests, revision이며 임베딩 컬럼은 없다. 닉네임이 같아도 다른 voiceId를 같은 사람으로 병합하지 않는다.
voiceId는 AI-Agent가 등록할 때 UUID로 발급한다. 모델이 출력하는 임베딩 벡터와 ID는 다른 값이다. 기기는 등록된 기준 임베딩과 입력 음성을 비교하여 연결된 voiceId를 찾는다. 서버에 동일 ID와 임베딩을 보관하는 것은 백업·연동의 역할이며, 기기 식별 파일을 없앤다는 뜻이 아니다.
등록 완료가 서버 저장 완료는 아닌 이유
- AI-Agent → DeviceAgent의
commitVoiceProfile에는 voiceId와referenceEmbedding: FloatArray가 들어간다. - DeviceAgent는 이를 기기 내부 암호화 대기함에 저장한다.
persist.sys.vp.local_ack=true이면LOCAL_TEST_ACK를 반환해 PoC 등록을 끝낼 수 있다. 09-29 확인한 시험 기기도 이 설정이었다.- false이면
WAITING_CLOUD_SYNC다. 현재 commit 분기에는 임베딩을 IoTAgent에 보내 AWS 저장 결과를 기다리는 경로가 없다.
따라서 accepted=true는 기기 대기함 수락을 뜻하며, 시험 설정에서의 cloudSynced=true도 실제 Cloud 저장 증거가 아니다. AWS의 저장 성공 응답을 받아야 제품의 서버 저장 완료로 인정할 수 있다.
대기함 save()는 SharedPreferences commit()의 반환값을 확인하지 않는 한계도 있다. 제품 연결 시 저장 실패 검출, 대기 목록 재전송, Cloud ACK 후 정리까지 보강해야 한다. 이번 문서 정리에서 이 소스 동작을 변경하지는 않았다.
제품 서버 연결 시 남은 작업
| 담당 | 필요한 작업 | 완료 확인 |
|---|---|---|
| DeviceAgent | 대기 저장 성공 확인, IoTAgent 전달, 재시도·ACK 후 대기 사본 정리 | 실패·재부팅에도 미전송 건 보존 및 중복 처리 방지 |
| IoTAgent | 인증된 서버 경로로 프로필·임베딩 전송, 저장 결과 역전달 | requestId·voiceId로 요청과 ACK 대응 |
| AWS Backend | 계정 권한 확인, voiceId 연결 및 임베딩 보호 저장 | 실제 서버 재조회로 동일 voiceId·벡터 버전 확인 |
| 관련 모듈 공통 | 삭제·동의 철회 시 서버/기기 사본 처리, 모델·벡터 차원/버전 규칙 확정 | 취소·재전송·삭제 후 오래된 결과로 복원되지 않음 |
임베딩은 민감한 화자 데이터다. 일반 모바일 목록·상태 이벤트에 포함하지 않으며 전송·보관 보호와 접근 권한을 별도로 적용한다. 위 항목은 추가 구현 범위이지 현재 AWS 배포 완료 목록이 아니다.
이번 모바일 변경
- 설정 → 관심사 선택 → 등록 진행으로 화면을 분리했다. 관심사는 미선택 가능하다.
- Gateway는 선택값을 임시 보관하고, 기기 등록 완료 후 실제 voiceId와 동의를 확인해 서버 DB에 저장한다.
- 저장 실패는 녹음 없이 저장만 재시도한다. 취소 요청과 기기 취소 완료를 구분한다.
- 이미 등록된 화자의 관심사는 화자 탭에서 상시 수정한다. AI-Agent의 조회 결과를 실제 LLM 프롬프트에 활용하는 작업과는 구분한다.
제거한 인터페이스
대화내역 조회·삭제·용량 조회의 요청/응답과 대화 저장 이벤트를 AI-Agent, DeviceAgent, IoTAgent, 모바일 Sample 및 게이트웨이에서 제거했다. 기능 플래그만 꺼 놓은 계약이 아니므로 이번 구현 대상에 포함하지 않는다.
외부 spokenNameKo/En 필드도 제거했다. 발음 변환은 AI-Agent 내부의 ENABLE_SPEAKER_AUTO_PRONUNCIATION이 true일 때만 한국어 TTS의 영문 닉네임에 적용한다. 기본값은 false이며 자막·닉네임·voiceId는 바꾸지 않는다.
기존 DB 정리
새 코드는 등록·삭제·실패 복구에서 voice_memory.db를 열거나 생성하지 않는다. 서비스 시작 시 해당 DB와 -wal, -shm, -journal 파일만 제거한다. 삭제에 실패하면 경고를 남기고 다음 서비스 시작 시 다시 시도한다. 이전 로컬 대화내역·관심사·닉네임 연결 데이터는 삭제되며 서버로 이관하지 않는다. 화자 프로필과 임베딩 파일, 다른 DB는 삭제하지 않는다.
사용하지 않는 VoiceMemoryStore와 보존 기간 관리 코드는 제거했다. 계속 사용하는 닉네임·식별자·관심사 검증은 VoiceProfileValidation으로 분리했다. 관심사는 정의된 10개 코드만 허용하며 빈 목록도 가능하다. 기존 DB 파일을 정리하는 LegacyVoiceMemoryCleanup은 유지한다. 소스 반영만으로 기존 설치 APK가 바뀌거나 기기 파일이 삭제되지는 않는다.
검증
- DB 및 보조 파일 삭제, 반복 호출, 본체 없는 WAL 삭제 확인
- 화자 프로필·임베딩·다른 DB 보존 확인
- 예상치 못한 디렉터리를 재귀 삭제하지 않음
- 관련 JVM 테스트와 assembleDebug 통과
- 실기기 삭제·재등록 검증은 미완료