← Docs hub

화자인식 저장소와 이번 차수 범위

현재 임베딩은 서버에 저장되지 않는다. 기기에서 화자 등록·식별은 가능하지만, 제품 서버의 임베딩 보관까지 구현된 상태는 아니다. 화자인식은 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와 임베딩을 보관하는 것은 백업·연동의 역할이며, 기기 식별 파일을 없앤다는 뜻이 아니다.

등록 완료가 서버 저장 완료는 아닌 이유

  1. AI-Agent → DeviceAgent의 commitVoiceProfile에는 voiceId와 referenceEmbedding: FloatArray가 들어간다.
  2. DeviceAgent는 이를 기기 내부 암호화 대기함에 저장한다.
  3. persist.sys.vp.local_ack=true이면 LOCAL_TEST_ACK를 반환해 PoC 등록을 끝낼 수 있다. 09-29 확인한 시험 기기도 이 설정이었다.
  4. 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 배포 완료 목록이 아니다.

이번 모바일 변경

요청 필드·상태·예외 처리 · 제품 구조

제거한 인터페이스

대화내역 조회·삭제·용량 조회의 요청/응답과 대화 저장 이벤트를 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가 바뀌거나 기기 파일이 삭제되지는 않는다.

검증

관련 명세

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date