보이스 프로필 전체 구조와 책임
상위 기준: 보이스 프로필 등록 제품 구현 기준서 2~3장
책임은 4개 역할과 책임에 따라 모바일 APP,
AWS Backend·클라우드, SoC·DeviceAgent, 화자인식 등록·인식 APP·Service로 나눈다.
구조 한눈에 보기
모바일 APP -> AWS Backend -> MQTT -> IotAgent -> Binder -> DeviceAgent
├-> Registration App
└-> OnDevice Agent Service
└-> Voice Profile Store
등록 화면과 음성 처리는 분리한다. Registration App은 상태를 표시하고 버튼 입력을 보낸다. OnDevice Agent Service만 마이크와 화자 모델을 사용한다.
주체·목적·행동
| 역할 | 세부 주체 |
|---|---|
| 모바일 APP | 휴대폰 앱 |
| AWS Backend·클라우드 | Backend, AWS IoT Core, 클라우드 보이스 프로필 저장소 |
| SoC·DeviceAgent | IotAgent, DeviceAgent |
| 화자인식 등록·인식 APP·Service | Registration App, OnDevice Agent Service |
| 주체 | 목적 | 행동 | 하지 않는 일 |
|---|---|---|---|
| 모바일 APP | 등록 사용자와 기기 선택 | HTTPS 등록·취소·조회·삭제 요청 | A1 녹음 |
| AWS Backend | 계정·기기 인증 | APP 요청을 MQTT 명령으로 변환 | 화자 판정 |
| IotAgent | A1 MQTT 접점 | topic 구독·발행, JSON과 Bundle 변환 | UI·모델 실행 |
| DeviceAgent | A1 내부 제어 관문 | 호출자·TTL·payload 검사, Activity 실행, Binder 중계 | PCM/WAV 처리 |
| Registration App | A1 등록 UI | 시작·취소·재시도, 상태 표시 | 마이크·임베딩 처리 |
| OnDevice Agent Service | 등록과 런타임 식별 | PCM 수집, 품질 검사, Voice ID·임베딩, 로컬 비교 | 계정 권한 결정 |
| 클라우드 보이스 프로필 저장소 | 사용자 정보 원본 | Voice ID 동기화·사용자 조회 | 원음 저장·화자 재판정 |
표준 용어
책임 주체는 모바일 APP, AWS Backend, IotAgent, DeviceAgent, Registration App,
OnDevice Agent Service, 클라우드 보이스 프로필 저장소로 쓴다. On-device Matcher, OnDevice UI,
로컬 Matcher 같은 이름은 책임 주체로 사용하지 않는다.
Service 내부 모듈은 다음처럼 구분한다.
| 모듈 | 역할 |
|---|---|
AudioRecordManager |
단일 마이크 소유권과 PCM 콜백 |
VoiceProfileAudioQualityGate |
세트별 신호·발화량 검사 |
VoiceProfileEmbeddingQualityGate |
5세트 임베딩 일관성 검사 |
SpeakerIdentificationEngine |
임베딩 생성과 등록 화자 비교 |
SpeakerProfileStore |
Voice ID와 기준 임베딩을 보관하는 로컬 기준 저장소 |
제어 경로와 데이터 경로
제어·상태
HTTPS JSON -> MQTT JSON -> Binder Bundle -> UI/Service
결과는 Binder 콜백 -> MQTT 결과 -> HTTPS 응답으로 복귀
일반 메시지에는 contractVersion, requestId, method, 상태, 진행률, 사유만 넣는다.
음성·프로필
Built-In Mic -> AudioRecordManager -> OnDevice Agent Service
-> 품질 검사 -> 임베딩 생성 -> SpeakerProfileStore
- PCM과 세트별 임베딩은 Service 밖으로 보내지 않는다.
- 등록이 확정된 뒤
Voice ID + 최종 Reference Embedding 한 개만 DeviceAgent 전용 commit Bundle로 전달한다. - 프로필 목록은 Voice ID와 표시명만 반환한다.
구현 위치
| 파트 | 작업공간 |
|---|---|
| OnDevice Agent Service | /home/silogood/work/2.A1_LLM_Aent/skmagic_ondeviceai_agent_speaker_recognition |
| Registration App | /home/silogood/work/1.A1_SoC_new/SoC/a1-packages-mr6/apps/VoiceProfileRegistrationApp |
| Mobile Sample | /home/silogood/work/1.A1_SoC_new/SoC/a1-packages-mr6/apps/VoiceProfileMobileSample |
| Local Gateway | /home/silogood/work/1.A1_SoC_new/SoC/a1-packages-mr6/tools/voice_profile_sample_gateway |
| IotAgent·DeviceAgent | /home/silogood/work/1.A1_SoC_new/SoC/a1-packages-mr6, branch speaker_identification |
Registration App은 별도 APK로 빌드해 A1 플랫폼 키로 서명한다. Mobile Sample은 일반 휴대폰용 시험 앱이며 두 앱을 서로 대체하지 않는다.
현재와 제품 목표
| 항목 | 현재 CPU PoC | 제품 목표 |
|---|---|---|
| MQTT | 로컬 Broker 시험 경로 | AWS IoT 인증 command/status/result |
| 등록 | 5.2초 고정 수집 5세트 | 실기기 데이터로 판정 기준 확정 |
| 검증 | 신호 품질 + 세트 간 동일 화자 | 다화자·재생·합성 음성 방어 범위 결정 |
| 저장 | 앱 전용 저장소 + DeviceAgent 암호화 전달 대기 저장소 | 암호화·마이그레이션·보존 정책 |
| Cloud | 실제 동기화 미연결 | 클라우드 프로필 저장소와 사용자 조회 API |
코드 근거
- 등록 오케스트레이션:
ForegroundService.startVoiceProfileSession() - 마이크 전환:
beginVoiceProfileSetCapture(),restoreAudioAfterVoiceProfileSession() - Binder 계약: 각 모듈의
VoiceProfileContract또는VoiceProfileIpcContract - DeviceAgent 진입:
DeviceAgent.sendModuleCommand()의 voice-profile 분기 - MQTT 진입:
CmdTopic과VoiceProfileMqttTestBridge