← Docs hub

보이스 프로필 실패·취소·복구

상위 기준: 보이스 프로필 등록 제품 구현 기준서 3·10장

이 문서는 완료·실패·취소 때의 현재 정리 동작과 아직 남은 복구 공백을 기록한다.

현재 실패·취소·복구 흐름

복구 흐름 크게 보기

현재 구현된 처리

상황 현재 처리
세트 품질 실패 SET_REJECTED, 같은 세트 재녹음
녹음 중 나가기 팝업 timer와 현재 녹음을 중지하고 현재 세트 버퍼 폐기
팝업 취소 retryVoiceProfileSet, 같은 세트를 처음부터 다시 수집
나가기 확정·모바일 취소 accepted 세트와 pending 전달값 삭제, CANCELLED, 마이크 복구
임베딩 일관성 실패 5세트 버퍼를 지우고 1세트부터 재등록
로컬 생성 예외 생성한 Voice ID 디렉터리를 삭제하고 PROFILE_FAILED
DeviceAgent 전달 실패 로컬 프로필을 유지하고 DELIVERY_FAILED, 전달만 재시도
목록·삭제 중 등록 활성 삭제를 ENROLLMENT_ACTIVE로 거부

공통 마이크 정리

현재 restoreAudioAfterVoiceProfileSession()은 다음을 수행한다.

  1. speaker_enrollment AudioRecord를 정지하고 callback을 해제한다.
  2. Service 기본 client가 AudioRecord 소유권을 다시 요청한다.
  3. 등록 전 일반 녹음이 실행 중이었으면 startContinuousRecording()을 재개한다.
  4. VoiceRecognitionStatusStore를 START로 되돌린다.

Service 파괴 시 abortSpeakerEnrollmentForDestroy()가 timer, accepted PCM, pending 전달값, callback과 세션 참조를 정리한다.

UI 종료 의미

입력 terminal 여부 결과
나가기 버튼 아님 현재 세트 일시 중단 후 확인 팝업
팝업 취소 아님 같은 세트 재시작
팝업 나가기 terminal 전체 등록 취소
모바일 MQTT cancel terminal 같은 request ID 세션 취소, Registration App 종료
완료 화면 확인 terminal 이후 UI close, 프로필 유지

늦게 도착한 다른 request ID 취소는 활성 세션에 적용하지 않는다.

로컬 profile과 outbox

5세트 검증 전에는 Voice ID를 생성하지 않는다. 프로필 생성 중 예외가 발생하면 생성한 Voice ID를 SpeakerProfileStore.delete()로 제거한다. commit 성공 뒤 DeviceAgent 전달이 실패하면 로컬 프로필을 삭제하지 않고 같은 reference payload를 재전달한다.

DeviceAgent는 최종 payload를 암호화 outbox에 보관한다. 프로필 삭제가 성공하면 같은 Voice ID의 outbox 항목도 제거한다.

현재 남은 복구 공백

다음 항목은 문서상 목표가 아니라 아직 구현·시험이 필요한 공백이다.

  1. 프로세스가 profile.json 생성과 reference_embedding.bin 저장 사이에 죽었을 때의 startup sweeper
  2. DeviceAgent outbox의 제품 Cloud 재시도 worker와 실제 ACK 삭제
  3. Registration App Binder death 후 자동 session timeout
  4. 전체 등록 watchdog과 재부팅 후 진행 상태 복원
  5. commit/cancel 동시 경합을 반복 주입하는 stress test
  6. 취소 반복 후 AudioRecord owner, native heap과 callback 증가 여부 장시간 측정

완성된 프로필 목록은 profile.json + reference_embedding.bin 쌍만 반환하므로 중간 디렉터리가 즉시 사용자 프로필로 노출되지는 않는다. 그러나 자동 정리 기능은 별도 보강이 필요하다.

확인된 실기기 스모크

2026-08-27 보드 192.168.10.5:5555에서 MQTT 등록 시작 후 Registration App이 열렸고, 같은 request ID의 모바일 취소가 IotAgent와 DeviceAgent를 지나 전달됐다. UI는 닫혔고 시험 닉네임 프로필은 생성되지 않았다. 해당 구간에서 FATAL·ANR·SIGABRT는 관찰되지 않았다.

이 결과는 시작·취소 한 회의 경로 검증이며 장시간 누수·전원 차단 복구 증거는 아니다.

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