Wav2Vec2 ASR과 화자 분할 파이프라인 설계

Wav2Vec2 기반 음성 인식과 Speaker Diarization을 결합해 화자 태깅 전사, 품질 지표, 운영 구조를 설계하는 방법

2026-08-14 · 최초 발행 2024-04-29

전사 결과에 화자 맥락을 붙이는 처리 구조

회의, 컨택센터, 방송 음성에서는 말한 내용을 텍스트로 옮기는 일만으로 충분하지 않다. 발화자가 누구인지와 발화 구간까지 연결돼야 회의록, 상담 분석, 자막, 음성 BI에 활용할 수 있다.

End-to-End Speech Processing은 ASR(Automatic Speech Recognition)과 Speaker Diarization을 결합하는 접근이다. ASR은 음성을 텍스트로 바꾸고, Diarization은 입력 안에서 “누가 언제 말했는가”를 추정한다. 결과적으로 화자 태그, 타임스탬프, 품질 지표를 갖춘 전사를 제공한다.

Wav2Vec 2.0은 대규모 비라벨 음성을 대상으로 자기지도 사전학습(SSL)을 수행한 뒤 CTC 또는 Seq2Seq 방식으로 파인튜닝하는 구조다. 전통적인 HMM-GMM/tri-gram 기반 파이프라인을 대체하는 딥러닝 단일 모델 접근으로 사용할 수 있다.

인식 품질은 WER(Word Error Rate) 또는 CER(Character Error Rate)로 본다. 화자 분할 품질은 DER(Diarization Error Rate)로 측정하며, Miss + False Alarm + Confusion으로 구성된다.

인식 모델과 화자 분할 모듈을 나누는 이유

Wav2Vec2는 CNN 기반 Feature Encoder가 원시 파형을 잠재 표현으로 바꾸고, Transformer Context Network가 장기 의존성을 모델링한다. 사전학습 모델을 활용하고 적은 라벨로 파인튜닝할 수 있어 도메인 적응에 활용할 수 있다.

화자 분할은 보통 VAD로 비음성 구간을 걷어낸 뒤 세그먼트를 나누고, x-vector 또는 ECAPA 임베딩을 추출해 AHC나 스펙트럴 방식으로 군집화한다. 이후 겹침 발화와 turn-taking을 보정하는 후처리가 이어진다.

EEND(End-to-End Neural Diarization)는 겹침 발화 처리 성능을 높일 수 있는 대안이지만 운영 난도도 올라간다. EEND를 포함한 단일 대형 E2E 모델과 모듈러 파이프라인의 선택은 정확도와 디버깅·운영 편의 사이의 트레이드오프다.

스트리밍 환경에서는 슬라이딩 윈도우와 온디바이스 VAD를 조합해 지연을 줄인다. 예를 들어 1.5–3 s hop을 사용할 수 있다. ASR은 chunk decode(stride)로 문맥을 유지하고, Diarization은 온라인 임베딩 버퍼링으로 화자 전환을 감지한다. 짧은 chunk는 지연을 낮추지만 문맥 손실로 정확도를 낮출 수 있다.

ASR 쪽에는 사전학습 모델과 도메인 LM 리스코어링, 또는 단어 사전(Hotword)을 적용할 수 있다. Diarization은 채널, 마이크, 방음 같은 사내 음성 특성에 맞춰 임베딩을 재학습하거나 스코어 노멀라이제이션을 적용한다.

세그먼트 ID를 중심으로 결과를 병합한다

입력은 단일 또는 멀티채널 WAV이며, 16 kHz를 권장한다. 전처리에서 resample과 정규화를 수행한 뒤 ASR과 Diarization을 병렬로 실행하고, 세그먼트 기준으로 결과를 정렬·병합한다.

세그먼트를 만들 때 고유 ID를 부여해 두면 두 분기의 결과를 안정적으로 join할 수 있다. 겹침이나 공백이 충돌할 때는 시간 일치와 신뢰도 점수를 우선순위로 삼아 최종 타임라인을 커밋한다.

장음성(>1시간)은 세그먼트 단위 배치 처리 후 메타데이터를 이어 붙인다. OOM이나 지연 문제가 있으면 chunk 길이를 줄이고 FP16/INT8 양자화 또는 배치 크기 감소를 검토한다. 잡음과 리버브가 문제라면 VAD 임계를 조정하고 denoise/dereverb 단계를 앞에 둘 수 있다.

Long audioOOMAudio InputPreprocessResample 16k, NormalizeASR BranchWav2Vec2 + CTC/LMDiarization BranchVAD Speech SegmentsSpeaker Embeddingx-vector/ECAPAClusteringAHC/SpectralPost-processingOverlap, ResegmentationAlignment/Join by SegmentIDSpeaker-attributedTranscript+ Timestamps + MetricsChunking / Sliding WindowShorter chunks, FP16/INT8

선택지마다 다른 정확도와 운영 부담

방법 성능(정확도) 확장성 일관성 안정성 운영 편의
Wav2Vec2 ASR + x-vector 스펙트럴 Diarization 중~상 (WER/DER 안정) 상 (모듈 독립 확장) 상 (구성 요소 검증 용이) 상 (폴백 쉬움) 상 (레퍼런스 풍부)
EEND 기반 Diarization + E2E ASR 상 (겹침 발화 강점) 중 (모델 규모/훈련 부담) 중 (데이터/튜닝 민감) 중 (도메인 변동 영향) 중 (툴링 제한)
하이브리드 ASR(HMM/DNN) + 전통 Diarization 중 (구식 스택 유지 필요)

주: 실제 수치는 코퍼스/도메인에 따라 상이, 최신 정보 확인 필요.

화자 구분이 필요한 음성 데이터에 적용하는 방식

회의록 자동화에서는 다자 발화와 겹침을 처리하고, 화자별 액션 아이템을 추출하는 데 쓴다. 컨택센터 분석에서는 상담사와 고객을 분리한 뒤 키워드 검출, 품질 모니터링, 콜 규정 준수 확인에 연결할 수 있다.

방송과 팟캐스트에는 화자 태깅 자막과 편집 포인트 탐색이 필요하다. 음성 BI나 리서치에서는 화자별 발화 시간과 감정 지표를 집계해 팀·캠페인 단위 비교에 사용할 수 있다.

도메인 적응 또는 LM 리스코어링을 적용하면 WER 1030% 개선을 기대할 수 있고, 고성능 임베딩과 후처리로 DER 510%p 개선을 기대할 수 있다. 세그먼트 병렬화와 GPU 배치·양자화를 적용하면 처리량은 2~5배 향상될 수 있다. 화자별 컨텍스트 이해도와 회의 생산성이 높아지며, 단일 모델 또는 모듈 파이프라인은 MLOps 자동화에도 유리하다.

Wav2Vec2와 Pyannote를 연결하는 최소 예시

전제조건은 Python 3.10+, torch 2.1+, torchaudio 2.1+, transformers 4.44+, librosa, soundfile, pyannote.audio 3.x다. GPU를 권장하며 Linux/x86_64를 기준으로 한다. 일부 모델 접근에는 Hugging Face 토큰이 필요할 수 있으므로 최신 정보 확인이 필요하다.

설치 시 CUDA 환경에 맞춰 다음 명령을 조정한다.

  • pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu121 (CUDA 환경에 맞게 조정)
  • pip install transformers librosa soundfile accelerate
  • pip install pyannote.audio
  • export HF_TOKEN=your_hf_token

아래 코드는 화자 분할 결과의 각 구간을 ASR에 전달하고, 시간순으로 정렬한 뒤 SRT를 생성한다.

import os
import librosa
import soundfile as sf
from transformers import pipeline
from pyannote.audio import Pipeline

# 환경 설정
HF_TOKEN = os.getenv("HF_TOKEN")  # pyannote 일부 파이프라인은 토큰 필요. 최신 정책 확인 필요.
AUDIO_PATH = "sample_ko.wav"     # 16kHz mono 권장

# 1) Diarization 파이프라인 로드
diar = Pipeline.from_pretrained("pyannote/speaker-diarization-3.1", use_auth_token=HF_TOKEN)

# 2) ASR 파이프라인 로드 (한국어 모델)
asr = pipeline(
    "automatic-speech-recognition",
    model="jonatasgrosman/wav2vec2-large-xlsr-53-korean",
    chunk_length_s=25,
    stride_length_s=5,
    device=0  # GPU 없으면 -1
)

# 3) 화자 분할 수행
diarization = diar(AUDIO_PATH)

# 4) 세그먼트별 ASR 수행 및 결과 병합
results = []
for turn, _, speaker in diarization.itertracks(yield_label=True):
    start = max(0.0, turn.start)
    duration = max(0.0, turn.end - turn.start)
    if duration <= 0.05:
        continue  # 너무 짧은 구간 스킵

    # 세그먼트 오디오 추출
    audio_seg, sr = librosa.load(AUDIO_PATH, sr=16000, offset=start, duration=duration, mono=True)
    if audio_seg.size == 0:
        continue

    # ASR 추론
    out = asr({"array": audio_seg, "sampling_rate": sr})
    text = out.get("text", "").strip()

    results.append({
        "start": start,
        "end": start + duration,
        "speaker": speaker,
        "text": text
    })

# 5) 시간 순 정렬 및 출력
results.sort(key=lambda x: x["start"])
for r in results:
    print(f"[{r['start']:.2f}{r['end']:.2f}] {r['speaker']}: {r['text']}")

# 선택: 결과를 SRT로 저장
def to_srt(items, path="diarized.srt"):
    def fmt_ts(t):
        import datetime
        ms = int((t - int(t)) * 1000)
        return str(datetime.timedelta(seconds=int(t))).zfill(8).replace(".", ",") + f",{ms:03d}"[-3:]
    with open(path, "w", encoding="utf-8") as f:
        for i, it in enumerate(items, 1):
            f.write(f"{i}\n")
            f.write(f"{fmt_ts(it['start'])} --> {fmt_ts(it['end'])}\n")
            f.write(f"{it['speaker']}: {it['text']}\n\n")

to_srt(results, "diarized.srt")

긴 파일은 15~30분 단위로 나눈 뒤 메타데이터로 재조합한다. GPU 사용, FP16/8-bit 양자화(transformers bitsandbytes), torch.compile은 추론 최적화에 사용할 수 있다.

pyannote 사전학습 체크포인트의 접근 정책은 변동될 수 있다. 대안으로 SpeechBrain(ECAPA)과 스펙트럴 클러스터링, 또는 WebRTC VAD와 Resemblyzer 조합을 검토할 수 있다. 노이즈 강건성은 RNNoise/UVR 같은 전처리 옵션을 A/B 테스트하고 VAD 임계값을 조정하며 확인한다.

음성 데이터 보호와 운영 관측을 함께 설계한다

민감한 음성은 온프레미스 추론으로 외부 유출을 줄이고, 이름·전화번호 마스킹 같은 익명화 후처리를 적용한다. 로그와 전사 데이터는 KMS로 암호화하고 최소 권한 IAM을 적용하며, DLP 룰로 업로드를 차단한다.

서비스는 ingest, diarization, ASR, aligner, post-processor로 나눌 수 있다. Kafka/Redis를 비동기 큐로 사용하고, 세그먼트 단위 멱등 처리와 S3/MinIO 기반 오디오 청크 저장을 구성한다. WER, DER, RTF 성능 메트릭을 관측 대상으로 두면 품질과 처리 상태를 함께 관리할 수 있다.

품질은 모델 하나만으로 결정되지 않는다. 사전학습 모델 활용과 LM 리스코어링, VAD 임계값, 후처리, 세그먼트 병렬화, 양자화, 관측·알림 체계가 함께 맞물려야 안정적인 음성 처리 파이프라인이 된다.

음성 인식화자 분할Wav2Vec2ASRMLOps