TypeTechnique
Aliasesdiarization, speaker diarization, 화자 식별
Related음성-텍스트 변환 (STT), 단어 오류율 (WER), 역 텍스트 정규화 (ITN)

무엇인가

회의 녹음 한 시간 분량을 통째로 [[speech-to-text]] 모델에 넘기면, 누가 한 말인지 구분되지 않은 한 덩어리 글이 나온다. 화자 분리(diarization)는 그 빈자리를 채우는 기술이다. "지금 말하는 사람이 A인가 B인가" 를 시간 축을 따라 자동으로 표시해, 회의록처럼 발화자별로 줄을 나눈 결과물을 만들어준다.

왜 필요한가

  • 회의록 작성: 발언자별로 줄을 나눠야 읽기 쉽다.
  • 인터뷰 전사: 진행자와 게스트가 구분돼야 인용이 가능하다.
  • 콜센터 분석: 상담사 발화와 고객 발화를 따로 모아야 품질 점검이 가능하다.
  • 팟캐스트 자막: 두 명 이상의 호스트를 색깔로 구분하면 가독성이 크게 오른다.

어떻게 작동하는가

세 단계로 단순화할 수 있다.

  1. 소리 분할: 침묵 구간을 기준으로 발화 구간을 잘라낸다.
  2. 목소리 지문 뽑기: 각 구간에서 화자의 음색·억양 특징을 숫자 벡터로 추출한다. 사람마다 성대와 발음 습관이 달라서, 이 벡터는 일종의 "목소리 지문" 역할을 한다.
  3. 묶기: 비슷한 벡터를 가진 구간끼리 같은 사람으로 본다.

이 흐름의 결과로 "0:12-0:25 = Speaker A, 0:26-0:31 = Speaker B" 같은 타임라인이 만들어진다. 화자가 몇 명인지 미리 알려주지 않아도, 군집화 알고리즘이 인원수를 추정한다.

한계

  • 두 명이 동시에 말하는 겹침(overlap) 구간은 한쪽이 무시되거나 섞인다.
  • "어", "음" 같은 짧은 추임새는 잘못된 화자에 붙기 쉽다.
  • 화자가 너무 많거나 목소리가 비슷하면 두 사람을 같은 사람으로 합쳐버린다.
  • 전화 음성처럼 음질이 낮으면 정확도가 급격히 떨어진다.

어디서 쓰이나

Zoom·Google Meet 의 자동 자막, 팟캐스트 전사 도구, 의료 면담 기록기 같은 곳이 대표적이다. 최근에는 [[speech-to-text]] API의 부가 기능으로 따라오는 일이 많은데, 2026년 4월 xAI 의 Grok STT API 가 화자 분리를 기본 옵션으로 포함시킨 것이 그 사례다. 음성 인식만으로는 "무엇을 말했는가" 까지밖에 알 수 없지만, 화자 분리가 함께 돌아가야 "누가 무엇을 말했는가" 라는 진짜 회의록이 완성된다.

파이프라인 구성

실무에서 화자 분리는 보통 두 갈래로 나뉜다.

오프라인 (배치)

  • VAD(Voice Activity Detection) → embedding 추출 → clustering 의 고전적 3단 파이프라인.
  • pyannote.audio 3.x 가 사실상 표준. Pipeline.from_pretrained("pyannote/speaker-diarization-3.1") 한 줄로 불러서 wav 를 넣으면 RTTM 또는 Annotation 객체가 나온다.
  • NVIDIA NeMo 의 ClusteringDiarizer 도 비슷한 인터페이스. TitaNet embedding + spectral / NME-SC clustering 조합.
  • WhisperX 는 [[speech-to-text]] 토큰 타임스탬프와 pyannote 결과를 정렬해 "화자 × 발화 텍스트" 표를 한 번에 뽑아준다.

온라인 (스트리밍)

  • EEND (End-to-End Neural Diarization) 계열. 프레임별로 "이 시점에 화자 1·2·3 중 누가 말하고 있는가" 를 multi-label 로 예측한다.
  • diart, sherpa-onnx 같은 라이브러리가 EEND + 온라인 clustering 을 결합해 실시간 자막용 출력을 낸다.
  • 지연(latency) 1초 이하를 노린다면 chunk 길이와 lookahead 를 트레이드오프 해야 한다.

입출력 포맷

  • 입력: 16 kHz mono WAV / FLAC. 8 kHz 전화 음성은 별도 모델 또는 8k 학습 체크포인트가 필요하다.
  • 출력: RTTM 라인 또는 [{start, end, speaker}] JSON. speaker 라벨은 "SPEAKER_00" 같은 클러스터 ID 일 뿐이라, 실제 사람 이름과 매핑하려면 별도 등록(enrollment) 단계를 둬야 한다.

STT 와 합치기

[[speech-to-text]] 결과의 단어 타임스탬프와 diarization segment 를 시간 축에서 intersection 해 "화자 × 텍스트" 표를 만든다. Whisper + pyannote 가 오픈소스 정석이고, AWS Transcribe·Azure Speech·Grok STT 처럼 한 API 가 두 결과를 함께 돌려주는 통합형이 늘고 있다. 통합형은 편하지만, 임계값 튜닝 여지가 적고 발화 매칭 규칙이 블랙박스라는 점은 알아둬야 한다. 최종 텍스트를 사람이 읽기 좋게 다듬으려면 [[inverse-text-normalization]] 까지 한 단계 더 태운다.

흔한 함정

  • Speaker count 미스: clustering threshold 가 잘못 잡히면 두 명을 한 명으로, 또는 한 명을 다섯 명으로 본다. AHC 는 보수적, NME-SC 는 비교적 적극적.
  • Overlap 무시: 표준 cascade 는 한 segment 에 한 명만 가정한다. pyannote 3.x 의 powerset head 또는 별도 OSD 모델로 보강해야 한다.
  • 도메인 불일치: 콜센터 8 kHz 전화 음성에 16 kHz 회의 모델을 그대로 쓰면 [[word-error-rate]] 보다 DER 가 훨씬 크게 망가진다.
  • 너무 짧은 입력: 30초 미만 클립은 embedding 통계가 불안정해 화자 한두 명도 분리에 실패할 수 있다.

평가

DER(Diarization Error Rate) 가 표준. miss + false alarm + speaker confusion 의 시간 가중 합이며, 0% 가 완벽이다. 산업 데이터 기준 10-25% 가 흔한 범위, 깔끔한 회의 코퍼스라면 한자리 수까지 내려간다. STT 의 [[word-error-rate]] 와는 별개 지표라는 점에 주의하자 — DER 가 좋다고 WER 가 좋아지지 않는다.

문제 정의

주어진 음성 신호 $x(t)$ 에 대해 화자 집합 $\mathcal{S} = {s_1, \dots, s_K}$ 와 segment 집합 ${(t_i^{start}, t_i^{end}, s_{\sigma(i)})}$ 를 동시에 추정한다. $K$ 가 사전 미지수일 수 있다는 점, 그리고 한 시점에 둘 이상의 화자가 활성일 수 있다는 점이 핵심 난점이다.

두 패러다임

모듈러 (cascade) 방식

  1. VAD: 음성/비음성 프레임 분류.
  2. Speaker embedding: 짧은 윈도우(1.5-3 s)에서 x-vector, ECAPA-TDNN, TitaNet 같은 d-vector 를 추출.
  3. Clustering: spectral clustering, AHC, VBx, NME-SC 등으로 묶는다.
  • 장점: 모듈별 학습 데이터가 풍부하고, 화자 수 추정이 clustering 알고리즘에서 자연스럽게 떨어진다.
  • 단점: overlap 처리 어려움, 모듈 간 오류 누적.

End-to-end (EEND)

  • SA-EEND (Fujita et al. 2019)1 가 출발점. Permutation-invariant training (PIT) 으로 multi-speaker multi-label 출력을 학습.
  • EEND-EDA (Horiguchi 2020)2 는 Encoder-Decoder Attractor 로 unknown speaker count 문제를 풀었다. 화자 수 $K$ 가 가변일 때 attractor 가 그만큼 생성된다.
  • TS-VAD (Target-Speaker VAD) 는 등록된 화자 임베딩을 조건으로 받아 프레임별 활성도를 예측. CHiME-6 우승 시스템의 주력 구성 요소였다.

하이브리드 — 현재의 표준

순수 EEND 는 화자 수가 많아질수록 학습 안정성이 떨어진다. 그래서 EEND-VC (Vector Clustering), EEND-GLA 처럼 EEND 출력에 clustering 을 덧대는 결합이 보편화됐다. pyannote 3.x3 도 local segmentation (powerset multi-label) + global agglomerative clustering 의 하이브리드 구조다.

평가 지표

  • DER $= (\text{miss} + \text{false alarm} + \text{speaker confusion}) / \text{total speech time}$.
  • 전통적 평가는 0.25 s collar 와 overlap exclusion 을 적용했으나, 최근 논문은 collar=0, overlap 포함의 "fair DER" 를 선호한다.
  • JER (Jaccard Error Rate) 은 화자별 균형 평가를 위해 DIHARD III 에서 보조 지표로 도입됐다.
  • DER 는 [[word-error-rate]] 와 직교한다. 두 시스템이 한 파이프라인 안에 있어도 별도 최적화 대상이다.

벤치마크

  • DIHARD I/II/III: 잡음·도메인 다양성이 강한 challenge 시리즈.
  • AMI Meeting Corpus: 4-5인 회의, 거의 모든 논문이 실험 결과를 내는 표준 reference.
  • VoxConverse: YouTube in-the-wild.
  • CALLHOME: 2화자 전화, 고전 baseline.

DIHARD III dev set 에서 pyannote 3.1 이 약 21% DER, EEND-VC 계열은 17% 수준까지 보고됐다. AMI mix-headset 은 한자리 수 DER 까지 내려왔다.

열린 문제

  1. Overlap-heavy 환경: 자연 대화의 overlap 비율은 10-15%. 표준 모델은 overlap 구간에서 단일 화자 구간 대비 2-3배의 DER 를 보인다.
  2. Unknown $K$ at scale: $K \geq 10$ 에서 EEND-EDA 의 attractor 학습이 불안정.
  3. Domain shift: 학습 도메인과 다른 마이크·언어·SNR 에서 성능 급락.
  4. Joint ASR-diarization: [[speech-to-text]] 모델과의 단일 디코더 통합 (NVIDIA Sortformer, WhisperX, Reverb) 가 활발히 연구되고 있다.
  5. Cross-session re-identification: 세션을 넘어 같은 사람을 같은 ID 로 유지하는 long-form diarization.

참고 모델

  • pyannote 3.1: powerset segmentation + agglomerative clustering. MIT 라이선스.
  • NVIDIA Sortformer (2024): ASR 디코더와 화자 라벨링을 단일 transformer 로 통합.
  • Rev Reverb (2024): WER 와 DER 를 함께 최적화한 상업 모델.
  1. Fujita, Y. et al. (2019). "End-to-End Neural Speaker Diarization with Self-Attention." ASRU 2019.
  2. Horiguchi, S. et al. (2020). "End-to-End Speaker Diarization for an Unknown Number of Speakers with Encoder-Decoder Based Attractors." Interspeech 2020.
  3. Plaquet, A., Bredin, H. (2023). "Powerset multi-class cross entropy loss for neural speaker diarization." Interspeech 2023.

이 용어를 언급한 기사