보이스 프로필 등록 씬 설계
상위 기준: 보이스 프로필 등록 제품 구현 기준서 3~5장
이 문서는 원격 화면 실행부터 5세트 등록 완료까지의 상세 상태 전이를 설명한다.
실제 실행 순서
- 모바일 APP 또는 Sample Gateway가
startVoiceProfileEnrollment를 MQTT로 보낸다. - IotAgent가 JSON을 Bundle로 바꾸고 DeviceAgent를 호출한다.
- DeviceAgent가 계약 버전, 요청 ID, TTL, 닉네임을 검사하고 Registration App을 연다.
- 사용자가 A1 화면의 시작 버튼을 누르면 Registration App이 Binder로 같은 method를 보낸다.
- DeviceAgent가 OnDevice Agent Service에 명령을 전달한다.
- Service는 일반 녹음을 정지하고
speaker_enrollment마이크 소유권을 얻는다. - 세트마다 약 5.2초 PCM을 모아 품질을 검사한다. 실패하면 같은 세트만 다시 받는다.
- 5세트 통과 후 임베딩 일관성을 확인하고 UUID Voice ID와 기준 임베딩을 저장한다.
- 최종 프로필을 DeviceAgent에 commit하고 ACK 결과를 UI에 반영한다.
- 완료·취소·실패에서 등록 마이크를 반납하고 일반 음성 경로를 복구한다.
MQTT start만으로 녹음하지 않는다. 먼저 A1의 시작 화면을 열고, 사용자 버튼 입력 뒤 녹음한다.
UI와 Service의 계약
| Registration App | OnDevice Agent Service |
|---|---|
| 문장·세트·진행률 표시 | 실제 PCM 수집 |
| 시작·취소·재시도 입력 | 신호 품질과 임베딩 검사 |
| Binder 상태를 reducer로 표시 | Voice ID·기준 임베딩 생성 |
| 마이크와 파일을 사용하지 않음 | 로컬 저장과 마이크 복구 |
UI가 받는 상태는 WAITING_START, RECORDING_SET, SET_ACCEPTED, SET_REJECTED,
PERSONALIZATION_SETTINGS, CREATING_LOCAL_PROFILE, PENDING_DEVICE_DELIVERY,
COMPLETED, PROFILE_FAILED, DELIVERY_FAILED, CANCELLED다.
현재 품질 판정
- 세트 길이, RMS, clipping, DC offset
- 20ms frame 기반 누적·연속 발화량
- 추정 SNR
- 5세트 임베딩의 최소 pairwise cosine similarity
현재 검사하지 않는 항목은 안내 문장 STT 일치, 한 세트 내부 다화자·겹침, 재생·합성 음성 공격이다. 자세한 수치는 등록 음성 검증에 둔다.
등록 완료 데이터
| 위치 | 남는 데이터 | 남지 않는 데이터 |
|---|---|---|
| OnDevice private storage | Voice ID, 프로필 메타데이터, 기준 임베딩 | 등록 PCM/WAV |
| DeviceAgent outbox | Cloud 전달 대기 Voice ID·기준 임베딩 | PCM/WAV, 세트별 임베딩 |
| Registration App | 화면에 필요한 최소 상태 | 음성·임베딩 |
현재 등록 앱 경로는 PCM을 메모리에만 모으며 임시 WAV 파일을 생성하지 않는다.
완료 기준
- 한 번에 AudioRecord owner는 하나다.
- 세트 실패는 그 세트만 재시도한다.
- 취소 후
speaker_enrollmentcallback과 timer가 남지 않는다. - terminal 상태에서 Registration App이 닫힌다.
- 일반 음성 상태가
VoiceRecognitionStatus.START로 복구된다. - 로컬 commit 이후 전달 실패는 재녹음이 아니라 동일 payload 재전달로 처리한다.