엔지니어링2026-02-12 게시·11분 읽기
폰에서 화자 다이어라이제이션: 딥다이브
4와트 전력 예산 안에서, 오디오 한 조각도 업로드하지 않고 실시간 엔드투엔드 화자 다이어라이제이션을 어떻게 돌리는가.
문제
다이어라이제이션은 "누가 언제 말했는가"에 답한다. 그것이 글자의 벽과 대화를 가른다. 다이어라이제이션이 없으면 "출시합시다"는 누구의 말도 아니지만, 있으면 구체적 이름에 안착하고 액션 아이템이 된다.
파이프라인
- VAD (음성 활동 감지) — 그 뒤 모든 단계의 게이트. 실제 음성이 있을 때만 사이클을 쓴다. 우리의 VAD는 log-mel 위에서 10ms마다 도는 200KB CNN.
- 화자 임베딩 — 음성 세그먼트마다 192차원 고정 길이 벡터를 뽑는다. ECAPA-TDNN 계열을 12MB int8로 디스틸한 모델.
- 온라인 군집화 — 정제 기능을 가진 응집형. 새 증거가 과거 라벨을 갱신한다.
- 스무딩 — 400ms 미만의 짧은 교체는 합쳐 UI 깜빡임을 막는다.
모바일에서 어려운 점
- 임베딩 모델이 ASR 모델, LLM 요약기와 같은 메모리 예산에 함께 들어갈 만큼 작아야 한다.
- 군집화는 점진적이어야 한다 — 매 단계마다 전체 회의를 다시 군집화할 수 없다. 우리는 코사인 거리로 상수 메모리 온라인 응집 군집화를 쓴다.
- 라벨이 정제될 때 UI가 깜빡이면 안 된다. 텍스트 교체가 아니라 200ms 크로스페이드로 변화를 애니메이션한다.
- 중첩 발화는 단일 라벨 가정을 깬다. 그런 구간은 지배 화자로 라벨링하고 세그먼트를 "overlap"으로 표시해 하류 요약이 가중치를 낮추게 한다.
최종 결과물
12MB 임베딩 모델, 6초 업데이트 창의 스트리밍 군집화 알고리즘, 그리고 라벨 변경을 점프가 아니라 애니메이션으로 보여주는 전사 뷰. iPhone 15 Pro에서 첫 라벨 중앙값 지연 950ms, Pixel 8a에서 1.6s.
아직 아픈 곳
- 비슷한 목소리 — 같은 음역, 같은 억양, 같은 성별 — 는 처음 30초 정도 임베딩을 혼란시킨다. UI에 "목소리 학습 중" 힌트로 노출한다.
- 시끄러운 방의 크로스톡에서는 급격히 떨어진다. 작은 온디바이스 소스 분리 전 단계를 실험 중이다.