오디오 전사 파이프라인
Whisper, Deepgram, AssemblyAI를 사용하여 배치 및 실시간 전사와 화자 분리를 지원하는 프로덕션 수준의 음성-텍스트 파이프라인을 구축합니다.
의사 결정 포인트
엔진 선택 의사 결정 트리
요구 사항이 다음과 같은 경우:
├─ 실시간 스트리밍이 필요한가?
│ ├─ 예: Deepgram Nova-3 WebSocket 사용 (가장 빠름)
│ └─ 아니오: 정확도 요구 사항 확인으로 이동
├─ 최고 정확도가 필요하고 GPU가 있는가?
│ ├─ 예: faster-whisper와 함께 Whisper large-v3 사용
│ └─ 아니오: 비용 분석으로 이동
├─ 예산 < $0.0059/분 이고 컴퓨팅 자원이 있는가?
│ ├─ 예: 로컬 Whisper 사용
│ └─ 아니오: AssemblyAI Universal-2 사용 (최고 API 화자 분리)
배치 vs 스트림 처리
오디오 특성이 다음과 같은 경우:
├─ 길이 > 30분?
│ ├─ 예: 청크 분할(무음 구간 기준)하여 배치 처리 사용
│ └─ 아니오: 지연 시간 확인으로 이동
├─ 10초 이내에 결과가 필요한가?
│ ├─ 예: 스트리밍 사용 (Deepgram/Whisper.cpp)
│ └─ 아니오: 더 나은 정확도를 위해 배치 처리 사용
VAD (음성 활동 감지) 사용
콘텐츠 유형이 다음과 같은 경우:
├─ 실시간 대화/회의?
│ ├─ 예: VAD 활성화 (무음 구간에서 40-60% 컴퓨팅 절약)
│ └─ 아니오: 콘텐츠 확인으로 이동
├─ 강의/발표 (일시 정지 포함)?
│ ├─ 예: 보수적 VAD 사용 (min_silence_duration_ms: 1000)
│ └─ 아니오: 밀집 음성(오디오북 등)의 경우 VAD 건너뛰기
도메인별 모델 선택
언어/억양이 다음과 같은 경우:
├─ 비영어권 또는 강한 억양?
│ ├─ 예: Whisper large-v3 사용 (최고 다국어 지원)
│ └─ 아니오: 속도 확인으로 이동
├─ 1초 미만 지연 시간이 필요한가?
│ ├─ 예: Deepgram Nova-3 스트리밍 사용
│ └─ 아니오: 비즈니스/의학 용어에는 AssemblyAI 사용
실패 모드
무음 구간 환각(Hallucination)
감지: 조용한 구간에 반복된 구문이나 유령 음악 설명이 전사본에 나타남
진단: VAD 비활성화 또는 임계값이 너무 낮아 모델이 배경 잡음에서 텍스트를 생성함
수정: min_silence_duration_ms: 500으로 VAD 활성화, Whisper에서 --no_speech_threshold 0.6 사용
10명 초과 화자에서 화자 분리 붕괴
감지: 10-15분 후 모든 화자가 "Speaker 1"으로 레이블 지정되거나 문장 중간에 무작위로 화자가 전환됨 진단: 화자 임베딩 모델이 포화 상태, 혼잡한 오디오에서 중첩 혼란 수정: 무음으로 사전 분할, 스테레오인 경우 AssemblyAI dual_channel 사용, 최대 활성 화자 8명으로 제한
비디오 타임스탬프 동기화 드리프트
감지: 자막이 해당 비디오 프레임보다 2-5초 먼저/늦게 나타남
진단: 오디오 전처리로 길이가 변경되었거나 VAD가 타임스탬프 조정 없이 세그먼트를 제거함
수정: 전처리에서 --preserve_timing 사용, 원본 오디오 타임코드와 동기화, 알려진 음성 이벤트에 대해 검증
언어 자동 감지 실패
감지: 화자가 억양이 있을 때 영어 단어가 횡설수설로 전사되거나 코드 스위칭이 무시됨
진단: 모델이 처음 30초 동안 잘못된 언어로 고정되었거나 다국어 콘텐츠가 분류기를 혼란시킴
수정: 억양이 있는 영어의 경우 language="en"으로 언어 강제 지정, 비영어를 영어로 변환하려면 task="translate" 사용
긴 파일에서 메모리 오버플로우
감지: 45분 이상 파일에서 OOM 충돌 또는 30분 후 갑작스러운 품질 저하
진단: 모델이 전체 컨텍스트 윈도를 유지하여 GPU VRAM이 소진됨
수정: 30초 오버랩으로 25분 경계에서 청크 분할, RAM 효율성을 위해 --without_timestamps 사용
작업 예제
완전한 회의 전사 워크스루
시나리오: 90분 이사회 회의, 6명 화자, 정확한 화자 식별 및 회의록용 타임스탬프 필요
입력 분석:
- 90분 → 청크 분할 필요
- 6명 화자 → 화자 분리 한도 이내
- 비즈니스 맥락 → AssemblyAI 사용 (용어 처리)
의사 결정 경로:
- 길이 > 30분 → 배치 처리 필요
- 화자 수 = 6 → 화자 분리 가능
- 비즈니스 도메인 → AssemblyAI Universal-2 선택
- 높은 정확도 필요 → 화자 레이블 + 스마트 포매팅 활성화
구현:
# 1단계: 전처리 (전문가 포착: 오디오 레벨 정규화)
ffmpeg -i meeting.mp4 -ar 16000 -ac 1 -filter:a "volume=0.8" meeting_clean.wav
# 2단계: 오버랩으로 청크 분할 (초보자는 전체 파일을 처리함)
from pydub import AudioSegment
audio = AudioSegment.from_wav("meeting_clean.wav")
chunks = []
for i in range(0, len(audio), 25*60*1000): # 25분 청크
chunk = audio[i:i+27*60*1000] # 2분 오버랩으로 27분
chunks.append(chunk)
# 3단계: 화자 분리로 전사
results = []
for chunk in chunks:
response = assemblyai_client.transcribe(
chunk, speaker_labels=True, auto_punctuation=True,
dual_channel=False, speaker_labels_max=8
)
results.append(response.get_paragraphs())
# 4단계: 오버랩 세그먼트 병합 (초보자가 놓치는 전문가 단계)
merged = merge_overlapping_transcripts(results, overlap_seconds=120)
전문가 vs 초보자:
- 초보자: 90분 파일을 직접 처리 → OOM 충돌 또는 낮은 정확도
- 전문가: 오버랩으로 청크 분할, 청크 간 화자 일관성 검증, 먼저 오디오 정규화
품질 게이트
- 알려진 정답이 있는 테스트 샘플에서 WER(단어 오류율) < 5%
- 화자 정확도 > 90% (정답이 있는 경우 각 발화에 대한 올바른 화자 ID)
- 스트리밍 구현의 경우 종단 간 실시간 지연 시간 < 2초
- SRT/VTT 파일 검증 통과 (올바른 타임스탬프, 중복 세그먼트 없음)
- 오디오 전처리 완료: 16kHz 모노 WAV/FLAC 형식 확인
- VAD 매개변수 조정: 샘플에서 무음 감지 오탐률 < 10%
- 최대 2시간 파일에 대해 메모리 사용량 < 8GB (청크 분할 정상 작동)
- API 오류 처리 테스트: 타임아웃, 재시도, 할당량 초과 처리
- 화자 분리 화자 수가 예상과 일치 (±1 화자 허용 오차)
- 출력 타임스탬프가 100ms 정확도 내에서 원본 오디오와 정렬
사용 불가 경계
이 스킬은 다음에 사용하면 안 됩니다:
- 텍스트-음성 합성 → 대신
voice-audio-engineer사용 - 음악 전사 또는 가사 추출 → 음악 AI 모델의 경우
ai-engineer사용 - 전사 없는 오디오 분류 → 오디오 분류의 경우
ai-engineer사용 - 실시간 번역 (전사 + 번역) →
language-translator스킬과 결합 - 음성 생체 인식 또는 화자 식별 → 화자 인식 모델의 경우
ai-engineer사용 - 오디오 품질 향상 또는 노이즈 제거 → 오디오 처리의 경우
voice-audio-engineer사용
다음 경우에 위임하세요:
- 맞춤형 웨이크 워드 감지 필요 →
voice-audio-engineer - 오디오 핑거프린팅 필요 →
data-pipeline-engineer - 음성 어시스턴트 구축 →
voice-audio-engineer+conversation-designer - 10,000시간 이상 처리 → 오케스트레이션을 위해
data-pipeline-engineer