본문 바로가기

Growth Log/Tech.Note

AI로 만드는 STT 자동화 파이프라인

개요 및 핵심 원리

이번글은 음성 파일을 텍스트로 변환하고, 누가 말했는지(화자)까지 식별하는 STT(Speech-to-Text) 자동화 파이프라인 구축 과정을 다룬다. 단순히 음성을 텍스트로 바꾸는 수준을 넘어, 실제 업무에 바로 적용 가능한 형태의 결과물을 만드는 게 목표다.

이번 글은 그 첫 번째 편으로, 전체 구조와 핵심 기술, 동작 원리를 정리한다.

 

 


목표 (Goal)

핵심 목표는하나의 음성 파일에서 여러 명의 화자를 분리하고, 각 화자의 발화를 정확히 텍스트로 변환하는 것이다.

예시 결과는 다음과 같다.

 

[00:00.521 --> 00:02.881] 상담사: 안녕하세요, 고객님. 무엇을 도와드릴까요?
[00:03.121 --> 00:05.121] 고객: 네, 앱 재고 확인 때문에 전화했습니다.

 

또한, ‘브랜드’, ‘어플리케이션 이름’처럼 일반 STT 모델이 인식하기 어려운 고유명사는 사용자 정의 사전(JSON 기반)을 통해 자동으로 교정해 정확도를 높인다.


핵심 기술 스택 (Core Tech Stack)

Python (ver 3.9 이상) 환경을 기반으로 구축하기로 하였고, requirements.txt를 통해 라이브러리 의존성을 관리하여 어떤 환경에서든 일관된 실행을 보장하며, 개발에 활용된 주요 기술 스택은 아래와 같다

openai-whisper OpenAI의 STT 엔진. 음성을 텍스트로 변환하고 타임스탬프 추출
pyannote.audio 화자 분리(Speaker Diarization) 수행. pyannote/speaker-diarization-3.1 모델 사용
torch / torchaudio 딥러닝 프레임워크 및 오디오 입출력 지원
librosa 오디오 전처리 (샘플링, 모노 변환 등)
numpy 수치 연산 및 데이터 구조 관리

전체 동작 원리와 구조 (Overall Workflow)

하나의 음성 파일이
입력 → 전처리 → STT + 화자 분리 → 결과 병합 및 교정 → 출력
순서로 처리된다.

 

1단계: 음성 파일 입력

  • 다양한 오디오 포맷(.mp3, .wav 등)을 시스템에 입력합니다.

2단계: 오디오 전처리 (librosa)

  • 입력된 모든 오디오 파일을 16kHz 샘플링 레이트모노 채널로 통일합니다.
  • 이를 통해 모델이 일관된 조건에서 오디오를 처리할 수 있도록 준비합니다.

3단계: STT 변환 (Whisper)

  • 전처리된 오디오를 Whisper 모델에 전달합니다.
  • 모델은 음성을 텍스트로 변환하고, 각 문장의 **시작과 끝 시간 정보(타임스탬프)**를 함께 추출합니다.

4단계: 화자 분리 (pyannote.audio)

  • 전처리된 오디오를 pyannote.audio 파이프라인에 전달합니다.
  • 오디오 구간별로 말하는 사람을 식별하여 SPEAKER_00, SPEAKER_01과 같이 화자 라벨을 붙입니다.

5단계: 결과 병합 및 후처리

  • Whisper에서 얻은 텍스트와 타임스탬프 정보와 pyannote에서 얻은 화자 정보를 결합합니다.
  • 타임스탬프를 기준으로 "누가(화자 라벨) 어떤 말을(텍스트) 했는지"를 정확하게 매칭합니다.
  • 미리 정의된 사용자 사전을 이용하여 잘못 인식된 단어를 자동으로 수정합니다.

6단계: 결과물 생성

  • 최종 처리된 결과를 사용자가 원하는 형태로 만듭니다.
    • 화자분리.txt: 화자별로 대화 내용 정리
    • 전체교정.txt: 전체 대화 내용 (교정 완료)
    • 상세결과.json: 타임스탬프, 화자, 텍스트 등 모든 정보 포함

전처리 담당자 librosa 라이브러리

입력되는 다양한 포맷의 오디오를 AI 모델(Whisper/pyannote)이 일관되게 처리할 수 있도록 librosa 라이브러리를 사용하여 다음과 같은 표준 형식(16kHz, 모노)으로 정규화 과정을 수행한다.

  • 샘플링 레이트 표준화 (Resampling to 16kHz): 음성 인식 모델에 최적화된 16kHz로 샘플링 레이트를 통일한다. 이는 불필요한 고주파수 데이터를 제거해 계산 효율성을 높이면서도, 사람의 음성 정보를 손실 없이 보존하는 표준 규격이다.
  • 채널 단일화 (Downmixing to Mono): 스테레오(2채널) 오디오를 단일 채널(모노)로 통합한다. 이를 통해 데이터의 복잡도를 낮추고, 모델이 음성 자체의 내용에만 집중하여 더 빠르고 정확하게 텍스트를 변환하도록 돕는다.

이러한 전처리 과정은 모델 입력 데이터의 일관성을 확보하여, 전체 STT 시스템의 안정성과 성능을 보장하는 핵심적인 단계


Whisper 모델의 구조와 특징

Whisper는 OpenAI에서 개발한 음성 인식(STT, Speech to Text) 모델로, 다국어 음성 인식, 번역, 타임스탬프 추출까지 모두 지원하는 멀티태스크 모델이다.

Whisper의 핵심 특징

  • End-to-End Transformer 구조
    음성을 바로 텍스트로 변환하는 완전한 인코더-디코더(Encoder-Decoder) Transformer 구조를 가진다.
    전통적인 STT 파이프라인(음성 전처리 → 음향 모델 → 발음 모델 → 언어 모델)의 복잡한 단계를 하나로 통합하여, 오디오를 직접 텍셔널한 텍스트 시퀀스로 매핑한다.
    • 인코더(Encoder): 입력된 음성 신호를 처리하여 컴퓨터가 이해할 수 있는 숫자 표현(Representation)으로 압축하는 역할을 한다. 음성 파일은 먼저 로그-멜 스펙트로그램(Log-Mel Spectrogram)이라는 시각적 형태로 변환된 후 인코더에 입력된다.
    • 디코더(Decoder): 인코더가 압축한 음성 정보를 바탕으로, 실제 텍스트 단어를 순차적으로 생성한다. 이전 단어를 바탕으로 다음 단어를 예측하는 방식으로 문장을 완성해 나간다.
  • 대규모, 다변수 데이터 학습 (Large-scale & Diverse Training)
    웹에서 수집한 68만 시간 분량의 방대한 음성 데이터로 학습되었다. 이 데이터는 특정 도메인에 치우치지 않고, 다양한 언어, 억양, 배경 소음, 주제를 포함한다. 이 덕분에 전화 녹취, 회의 음성, 팟캐스트, 강의 등 별도의 추가 학습(Fine-tuning) 없이도 다양한 환경에서 높은 인식률을 보인다.
    (라고 되어있으나...글쎄...)
  • 정확한 타임스탬프 제공
    문장 단위뿐 아니라 단어 단위(Word-level)까지 시작과 종료 시점을 예측할 수 있다. 이는 디코더가 텍스트를 생성할 때 각 단어가 원본 오디오의 어느 부분에 해당하는지 함께 예측하기 때문에 가능하다. pyannote.audio의 화자 분리 결과와 병합할 때 이 타임스탬프가 핵심적인 기준이 된다.
  • 모델 크기에 따른 성능 트레이드오프 (Size vs. Performance)
    tiny, base, small, medium, large 등 다양한 크기의 모델을 제공한다.
    • 모델이 커질수록 파라미터 수가 많아져 더 복잡한 패턴을 학습할 수 있으므로 정확도는 높아지지만, 추론 속도는 느려진다.
    • GPU 환경에서는 small 또는 medium 모델이 속도와 정확도 사이의 좋은 균형을 보여주며, 고사양 GPU가 있다면 large 모델로 최고의 성능을 기대할 수 있다. 반면, CPU 환경에서는 base 모델이 현실적인 선택이다.

이러한 구조와 특징 덕분에 Whisper는 복잡한 전처리 과정 없이도 높은 범용성과 정확성을 제공하며, 우리 파이프라인의 핵심적인 음성 인식 엔진으로 기능한다.


⚙️ 간단 사용 예시

 
import whisper
model = whisper.load_model("openapi/whisper-large")
result = model.transcribe("sample.wav", language="ko")
print(result["text"])
 

result 객체에는 텍스트 외에도 각 문장별 타임스탬프(start, end), 언어, 확률값 등이 포함된다.
이를 pyannote의 화자 정보와 결합해, "누가 언제 어떤 말을 했는지"를 재구성할 수 있다.


pyannote.audio (speaker-diarization-3.1) 

pyannote.audio는 화자 분리를 위한 대표적인 오픈소스 파이프라인이다.
특히 pyannote/speaker-diarization-3.1은 Hugging Face 허브에서 제공하는 최신 버전이다.

 

pyannote.audio의 최신 파이프라인인 speaker-diarization-3.1은 오디오 파일 속에서 "누가, 언제 말했는지"를 자동으로 알아내는 역할을 합니다. 이 과정은 크게 세 단계로 이루어진다.

  1. 음성 구간 탐지 (Voice Activity Detection)
    먼저 오디오 전체에서 사람이 말하는 구간과 침묵 또는 배경 소음 구간을 구분한다.
  2. 화자 특징 추출 (Speaker Embedding)
    탐지된 음성 구간들에서 각 목소리의 고유한 특징(음색, 톤 등)을 추출하여 컴퓨터가 구분할 수 있는 숫자 벡터(임베딩)로 만든다.
  3. 화자 군집화 (Clustering & Segmentation): 마지막으로, 비슷한 목소리 특징을 가진 벡터끼리 그룹으로 묶어 “Speaker A”, “Speaker B” 등으로 분류하고, 각 화자가 정확히 몇 초부터 몇 초까지 말했는지를 타임스탬프로 기록한다.

결과적으로 speaker-diarization-3.1은 '어떤 시간대에', '어떤 화자가' 말했는지에 대한 상세한 목록을 만들어주어, 여러 사람이 대화하는 오디오를 자동으로 정리하고 분석할 수 있게 해주는 강력한 도구이다.

 

설치 및 설정

pip install pyannote.audio

모델 사용을 위해선 Hugging Face access token이 필요하며,
모델 사용 조건에 동의해야 한다.

간단 사용 예시

from pyannote.audio import Pipeline

pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token="YOUR_HF_TOKEN"
)

diarization = pipeline("audio.wav")

# 결과를 RTTM으로 저장
with open("audio.rttm", "w") as f:
    diarization.write_rttm(f)

주요 특징

  • 입력 오디오는 자동으로 모노 16kHz로 변환
  • 출력은 Annotation 객체 형태이며 .write_rttm()으로 표준 포맷 저장 가능
  • Whisper의 타임스탬프와 결합해 “화자별 전사 결과” 생성 가능
  • VAD(음성활동감지), SCD(화자전환감지), OSD(겹침발화감지) 등 모듈과 함께 사용 가능
  • 버전 3.1은 순수 PyTorch 기반으로 GPU/CPU 모두 안정적으로 구동

💡 긴 오디오 파일(예: 수시간 회의)은 분할 처리(batch processing) 전략을 쓰는 게 좋다.


Next..

지금까지 프로젝트의 목표와 전체적인 구조, 그리고 핵심 기술을 살펴봤다.
다음 글에서는 stt_processor.py의 실제 코드 구현을 단계별로 분석하고,
Whisper와 pyannote의 결과를 시간 축 기준으로 병합하는 과정,
그리고 사용자 사전 기반 자동 교정 로직을 구체적으로 다룰 예정이다.


📚 참고 자료


🌀 다음 글:
👉 AI로 만드는 STT 자동화 파이프라인 (2): Whisper & Pyannote 코드 분석 (예정)