음성 인식(ASR)은 이제 흔해졌다. OpenAI Whisper, Faster Whisper, 인사이트팩트 Whisper 같은 고품질 STT 엔진이 많아지면서 “음성을 텍스트로 바꾸는 것” 자체는 어렵지 않다. 하지만 누가 언제 말했는지까지 구분하는 것은 완전히 다른 난이도의 문제다.
whisper-diarization은 이 문제를 해결하는 오픈소스 파이프라인이다. OpenAI Whisper의 전사 능력과 NVIDIA NeMo의 화자 인식 기술을 결합해, 회의록 전사, 인터뷰 분석, 팟캐스트 자막 등 실제 프로덕션 유즈케이스에서 필요한 화자 분리(Speaker Diarization) 를 구현한다. GitHub에서 5,530개의 스타를 받은 프로젝트로, BSD-2-Clause 라이선스로 공개되어 있다.
이 글에서는 whisper-diarization의 파이프라인, 기술 스택, 실제 사용법, 그리고 한계점까지 살펴본다.
6단계 파이프라인: 단순 전사를 넘어서
whisper-diarization의 가장 큰 강점은 6단계의 조율된 파이프라인이다. 단순히 Whisper를 돌리고 NeMo를 붙이는 수준이 아니라, 각 단계가 이전 단계의 한계를 보완하도록 설계되어 있다.
① 음원 분리 — Demucs
Facebook Research의 Demucs를 사용해 배경음악과 노이즈를 제거하고 보컬만 분리한다. 화자 임베딩(Speaker Embedding)의 정확도는 배경 노이즈에 민감하기 때문에, 이 전처리 단계가 전체 파이프라인의 품질을 좌우한다. --no-stem 플래그로 이 단계를 건너뛸 수 있다.
② Whisper ASR
Faster Whisper 기반으로 음성을 텍스트로 전사한다. 기본 모델은 medium.en이지만, --whisper-model 옵션으로 다른 크기의 모델을 선택할 수 있다. GPU 메모리에 따라 large-v3 같은 더 정확한 모델도 사용 가능하다.
③ 타임스탬프 보정 — ctc-forced-aligner
Whisper의 타임스탬프는 생각보다 정확하지 않다. 화자 전환 시점이 Whisper가 출력한 타임스탬프와 실제 발화 시점 사이에 미세한 차이가 발생하는데, 이 차이가 화자 분리 오류로 이어질 수 있다. ctc-forced-aligner가 이 차이를 보정해 준다.
④ VAD & 분할 — MarbleNet
NVIDIA NeMo의 MarbleNet으로 Voice Activity Detection(VAD)을 수행한다. 묵음 구간을 제거하고 발화 구간을 분할해, 화자 식별이 필요한 세그먼트만 남긴다.
⑤ 화자 임베딩 — TitaNet
같은 NeMo 제품군의 TitaNet이 각 세그먼트의 화자 임베딩을 추출한다. 이 임베딩을 바탕으로 “이 세그먼트는 화자 A, 이 세그먼트는 화자 B”라는 식의 식별이 이루어진다.
⑥ 매칭 & 재정렬
보정된 타임스탬프와 화자 정보를 매칭하고, 구두점 모델(Punctuation Model)로 최종 전사문을 재정렬한다. 최종 출력은 “화자 A: 내용… [00:01:23]” 형태의 타임스탬프가 포함된 구조화된 전사문이다.
설치와 사용
설치는 비교적 간단하다. Python 3.10 이상, FFMPEG, Cython이 선행 조건이다.
pip install cython
pip install -c constraints.txt -r requirements.txt
실행:
python diarize.py -a audio_file.wav
VRAM이 10GB 이상이면 diarize_parallel.py를 사용해 Whisper와 NeMo를 병렬로 실행할 수 있다. 두 모델이 서로 독립적이기 때문에 가능한 방식으로, 처리 시간을 크게 단축시킨다.
주요 CLI 옵션:
| 옵션 | 설명 |
|---|---|
-a AUDIO_FILE_NAME | 처리할 오디오 파일 |
--no-stem | 음원 분리 비활성화 |
--whisper-model | ASR 모델 선택 (기본: medium.en) |
--suppress_numerals | 숫자를 문자로 표기 (정렬 정확도 향상) |
--device | 사용할 디바이스 (기본: CUDA) |
--language | 언어 수동 지정 |
--batch-size | 배치 추론 크기 |
왜 이 조합인가: 기술적 판단의 이해
whisper-diarization의 기술 스택은 각 구성요소가 시장에서 검증된 것들이다:
- Whisper / Faster Whisper — 오픈소스 ASR의 사실상 표준. 다국어 지원과 전사 품질에서 압도적.
- NVIDIA NeMo (MarbleNet + TitaNet) — NeMo는 VAD와 화자 임베딩에서 레퍼런스급 성능을 제공한다. 특히 TitaNet은 화자 식별(Speaker Identification) 벤치마크에서 최상위권.
- Demucs — 음원 분리에서 SOTA에 가까운 성능. 보컬 분리 정확도가 화자 임베딩 품질에 직접 영향을 준다.
- ctc-forced-aligner — Whisper 타임스탬프의 약점(특히 문장 경계에서의 부정확성)을 CTC(Connectionist Temporal Classification) 정렬로 보정한다.
각 구성요소가 단일 공급업체에 종속되지 않고 최고의 조합을 선택한 점이 인상적이다.
한계점
가장 큰 기술적 한계는 중첩 발화(Overlapping Speakers) 다. 여러 사람이 동시에 말하는 상황에서는 현재로썸 해결되지 않았다. README에서도 “오디오를 분리해 한 화자만 남긴 후 파이프라인에 다시 입력하는 방식”을 제안하지만, 이는 계산 비용이 크게 증가한다.
또한 GPU 메모리 요구사항이 상당하다. 병렬 모드를 사용하려면 최소 10GB VRAM이 필요하고, 실제로는 16GB 이상을 권장한다. CPU-only 환경에서는 제한적으로만 사용 가능하다.
마치며
whisper-diarization은 “ASR + 화자 분리”라는 구체적인 문제에 대한 실용적인 해법을 제공한다. 단순히 여러 모델을 붙여놓은 것이 아니라, 각 단계의 한계를 인식하고 보정하는 구조로 설계된 점이 돋보인다. 5.5K 스타와 500개 이상의 포크는 이 접근법이 실무에서 유효하다는 증거다.
회의록 자동 전사, 팟캐스트 자막 생성, 인터뷰 분석 등 화자 구분이 필요한 ASR 작업이 있다면, whisper-diarization은 가장 쉬운 출발점이 될 것이다.
참고: Colab 노트북도 제공되므로, GPU가 없는 환경에서도 일단 체험해볼 수 있다.
참고 자료
- GitHub 저장소: MahmoudAshraf97/whisper-diarization
- OpenAI Whisper: github.com/openai/whisper
- NVIDIA NeMo: github.com/NVIDIA/NeMo
- Facebook Demucs: github.com/facebookresearch/demucs
- Colab 노트북: Whisper + NeMo Diarization