BLOG · 블로그

팀벨 블로그

업무를 끝내는 AI,
팀벨이 만드는 제품과 기술, 도입 사례를 가장 먼저 전합니다.

블로그› 테크› 화자 분리는 마이크를 세지 않습니다

화자 분리는 마이크를 세지 않습니다

화자 분리(Speaker Diarization)는 마이크 수가 아니라 목소리 패턴으로 발화 구간을 나누는 기술입니다. ASR과의 차이, 최신 파이프라인, DER 평가 조건까지 블로그 아티클 형식으로 설명합니다.

회의실 가운데에 노트북 한 대를 놓고 두 시간을 녹음합니다. 받아 적은 글은 그럭저럭 나왔는데, “이 말 누가 한 거지?”에서 막힙니다. 마이크가 하나니까 채널로 가를 방법이 없습니다. 이 자리를 맡는 기술이 화자 분리(Speaker Diarization)입니다.

하나의 오디오 스트림을 채널이 아니라 목소리 패턴으로 나누는 화자 분리 개념

채널이 아니라 목소리로 가릅니다

화자 분리는 마이크 수나 채널 수를 세는 기술이 아니라, 소리 안에서 화자를 구분하는 기술입니다.

🎙️

화자 분리는 소리 하나를 받아서 “몇 초부터 몇 초까지, 누구”라는 목록을 내놓습니다. 여기서 ‘누구’는 이름이 아니라 speaker_0, speaker_1 같은 번호예요. 누가 김 팀장인지는 모르지만, 같은 목소리인지 다른 목소리인지는 구분합니다.

가르는 기준이 마이크가 아니라 목소리 자체라서, 입력이 모노 파일 하나여도 동작합니다. 결과는 RTTM이라는 한 줄에 한 구간씩 적는 텍스트 형식으로 주고받는 일이 많습니다. 시작 시각, 길이, 화자 번호가 들어갑니다.

받아 적는 일(ASR)과는 별개의 기술입니다. 한쪽은 글자를, 다른 쪽은 구간을 내놓습니다. 화자 이름이 붙은 기록을 만들려면 두 결과를 시간축 위에서 겹쳐 붙이는 단계가 따로 필요합니다.

오디오 파일 meeting.wav 음성 인식 (ASR) 단어별 시각이 붙은 텍스트 화자 분리 RTTM 구간 목록 ASR 출력 00:03.2 예산이... 00:05.8 다음 분기... RTTM 출력 0.0 2.8 speaker_0 2.8 4.1 speaker_1 시간축 정렬
오디오 하나가 ASR과 화자 분리 두 갈래로 나뉘고, 마지막에 시간축에서 다시 합쳐져 화자가 붙은 대본이 됩니다.

세 단계였는데, 앞단이 달라졌습니다

저는 이 기술을 오랫동안 “말한 구간 찾기 → 목소리 특징값 뽑기 → 같은 것끼리 묶기”라는 세 단계로 기억하고 있었습니다. 지금 쓰이는 파이프라인을 열어보면 첫 단계가 달라져 있습니다.

옛 방식의 첫 단계는 말이 있는지 없는지만 보는 VAD였습니다. 그래서 두 사람이 동시에 말하면 그 구간은 통째로 한 사람 것이 됐습니다. 요즘 파이프라인의 첫 단계는 짧은 창 안에서 “지금 이 프레임에 누가 몇 명 켜져 있는지”를 바로 내놓는 신경망 모델입니다. 겹쳐 말한 구간이 여기서 살아남습니다.

다만 이 모델이 보는 창은 짧습니다. 10초짜리 창 안의 speaker_0과 3분 뒤 창의 speaker_0이 같은 사람이라는 보장이 없죠. 그래서 창마다 목소리 특징값(임베딩)을 뽑아 파일 전체에서 다시 묶는 단계가 뒤에 붙습니다. 군집이 사라진 게 아니라, 앞에 신경망이 하나 더 붙은 구조입니다.

한 모델이 처음부터 끝까지 화자별 출력을 내놓는 방식도 있습니다. NVIDIA NeMo의 Sortformer 계열이 그렇고, 화자를 말이 나온 순서대로 정렬해서 내놓습니다. 실시간용인 Streaming Sortformer는 앞서 나온 화자의 특징값을 캐시에 담아 다음 조각으로 넘기는 식으로 이어갑니다. 대신 이런 모델은 다룰 수 있는 화자 수가 학습 시점에 정해져 있습니다.

비교 항목 분할 후 임베딩 군집 방식 단일 모델 방식
화자 수 상한 상대적으로 유연합니다. 파일 특성에 따라 추정하거나 범위를 줄 수 있습니다. 학습 시점에 정한 화자 수 범위의 영향을 더 크게 받습니다.
겹친 발화 처리 앞단에 겹침 감지 모델을 붙이면 대응 가능하지만 구성에 따라 차이가 큽니다. 모델 내부에서 직접 처리하는 경우가 많아 구조가 단순합니다.
실시간 가능 여부 구성에 따라 가능하지만, 후단 군집 때문에 지연 관리가 중요합니다. Streaming Sortformer처럼 실시간 지향 변형이 있습니다.
화자 번호 일관성 짧은 창마다 붙은 번호를 파일 전체에서 다시 묶어 일관성을 확보합니다. 모델이 전체 출력 안에서 직접 정렬하지만 제한 조건이 있습니다.
조정 포인트 VAD/세그멘테이션, 임베딩, 군집 파라미터 등 조정 위치가 여러 곳입니다. 모델 자체와 디코딩 전략이 핵심 조정 지점이 됩니다.
실무에서는 어느 방식이 무조건 우세하다기보다, 겹친 발화·실시간성·화자 수 가정을 어떻게 두는지가 선택 기준이 됩니다.

핵심은 “군집이 없어졌다”가 아니라, 앞단이 더 똑똑해졌고 뒤의 묶기 단계는 여전히 중요하다는 점입니다.

붙일 때 정하는 값은 대체로 셋입니다

오픈소스로는 pyannote.audio가 널리 쓰입니다. 4.0과 함께 나온 speaker-diarization-community-1 파이프라인은 CC BY 4.0으로 공개돼 있고, 허깅페이스에서 이용 조건에 동의하고 토큰을 받아야 내려받을 수 있습니다.

from pyannote.audio import Pipeline

pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-community-1",
    token="hf_...")
result = pipeline("meeting.wav", num_speakers=4)
실무에서 먼저 보는 값은 보통 이 셋입니다
  • 첫째, 화자 수를 미리 줄지num_speakers를 넣으면 그 수에 맞춰 묶고, min_speakers와 max_speakers로 범위만 줄 수도 있습니다. 참석자 명단이 확실한 회의면 정확한 값이 낫습니다. 반대로 넷이라고 못 박은 파일에 다섯 번째 사람이 잠깐 끼어들면, 그 발언은 사라지지 않고 누군가의 것으로 붙습니다.
  • 둘째, 겹친 구간을 어떻게 셀지 4.0에서는 규칙적인 결과와 함께 겹친 구간을 한 사람에게만 남긴 배타적(exclusive) 버전도 같이 다룹니다. 자막처럼 한 시점에 화자 하나만 보여야 하는 곳은 배타적 버전이 편하고, 동시에 말한 사실 자체가 기록이어야 하는 곳은 겹침 정보를 살린 결과가 필요합니다.
  • 셋째, 실행 환경 GPU가 있으면 실시간보다 빠르게 도는 것이 보통이지만, 실제 배수는 모델과 장비에 따라 다릅니다. 긴 파일에서는 임베딩 군집 단계가 메모리를 더 먹는 경우가 많아 여기부터 점검하는 편이 좋습니다.

회의록 실무 팁

참석자 수를 정확히 아는 회의는 고정값, 애매한 녹음은 최소·최대 범위로 두는 편이 안전합니다.

자막 실무 팁

한 순간에 화자 하나만 보여야 한다면 exclusive 결과가 후처리에 더 유리합니다.

운영 실무 팁

긴 파일은 ASR보다 화자 분리 후단에서 느려지는 경우가 있으므로 메모리 사용량도 함께 봐야 합니다.

DER은 조건을 안 밝히면 숫자가 아닙니다

정확도는 DER(Diarization Error Rate)로 잽니다. 놓친 말, 없는 말을 있다고 한 것, 사람을 바꿔 붙인 것을 더해 전체 발화 시간으로 나눈 값입니다.

문제는 같은 시스템이 채점 조건에 따라 다른 숫자를 낸다는 것입니다. 구간 경계 앞뒤에 0.25초쯤 여유(collar)를 두고 그 안의 오차를 봐주는 관행이 있고, 겹쳐 말한 구간을 채점에 넣는지도 갈립니다. DIHARD 계열은 여유 없이 재는 쪽이고, CALLHOME 계열 보고에는 0.25초를 적용한 숫자가 흔히 붙습니다. 같은 표에 나란히 있어도 조건이 다르면 서로 비교할 수 없습니다.

그래서 두 모델을 고를 때 저는 발표된 DER보다 먼저 채점 조건을 봅니다. 조건이 안 적힌 숫자는 그냥 넘깁니다.

정답 구간 예측 구간 Collar 없는데 있다고 한 구간 놓친 구간 화자 바뀜 경계 앞뒤 0.25초 여유 예시
False Alarm Miss Confusion Collar Correct
DER은 오류 종류의 합일 뿐 아니라, collar 적용 여부와 overlap 포함 여부에 따라 숫자 해석이 달라집니다.

사람이 뒤에 붙는 작업에서는 오류의 무게가 다릅니다

말을 글로 옮기는 작업은 대개 기계가 먼저 내고 사람이 검수합니다. 이 조건에서는 DER 총합보다 어떤 종류의 오류인지가 더 중요해집니다. 경계가 0.2초 밀린 것은 고치는 데 몇 초면 되지만, 화자 번호가 파일 중간부터 통째로 뒤바뀌면 그 아래를 전부 다시 봐야 하니까요.

자막에서는 여유가 더 없습니다. 시퀀스 경계에서 몇백 밀리초 차이는 화면에서 그대로 보입니다. 채점에서 봐주는 0.25초가 눈으로는 안 봐주는 시간입니다. SDH처럼 화자 정보를 담아야 하는 자막이면 번호를 이름으로 바꾸는 규칙도 따로 있어야 합니다.

화자 수도 실무에서는 다루기 나름입니다. 팀블로 AI 회의록의 화자 분리는 마이크 수에 매이지 않고, 100명이 넘는 회의에서도 화자를 나눕니다.

화자 분리가 내놓는 것은 이름이 아니라 번호입니다. 그 번호에 누구를 붙일지, 겹친 구간을 몇 명으로 셀지는 결국 붙이는 쪽에서 정하게 됩니다. 이미 돌려본 파일이 있다면 DER을 다시 재기 전에 RTTM을 열어 화자가 바뀌는 대목만 훑어보시길 권합니다. 고칠 값이 거기서 보입니다.

정리하면, 화자 분리는 마이크를 세는 기술이 아니라 목소리의 패턴을 따라 화자를 나누는 기술입니다.

ASR이 “무슨 말을 했는가”를 내놓는다면, 화자 분리는 “언제 누가 말했는가”를 내놓습니다. 실무에서는 두 결과를 시간축 위에서 붙이고, 어떤 오류가 실제 후처리 비용을 키우는지까지 함께 봐야 합니다.

팀벨의 다음 소식이 궁금하다면

제품 도입·협업·취재 문의를 남겨주세요.