
Whisper로 구현하는 실시간 스트리밍: 저지연 음성 인식 가이드 (2026)
Eric King
Author
Whisper로 구현하는 실시간 스트리밍: 저지연 음성 인식 가이드
OpenAI Whisper는 높은 정확도와 다국어 지원을 제공하는 오픈소스 음성 인식 모델입니다. Whisper는 본래 스트리밍용 모델은 아니지만, 올바른 파이프라인을 구성하면 저지연 실시간 음성‑텍스트 변환 시스템을 구축할 수 있습니다. 라이브 자막, 회의 녹취, 라이브 스트리밍, 음성 비서 등에서 특히 유용합니다.
이 글에서는 Whisper를 실시간으로 동작시키기 위한 아키텍처, 기법, 트레이드오프, 그리고 참고용 코드를 살펴봅니다.
스트리밍이 어려운 이유
기본적으로 Whisper는 연속 스트림이 아니라, 완결된 오디오 구간을 입력으로 받도록 설계되어 있습니다. 여기에는 다음과 같은 과제가 있습니다.
- 증분 디코딩 — 부분 오디오를 단계적으로 처리
- 낮은 지연 시간 — 가능한 한 빨리 결과 제공
- 청크 경계에서의 아티팩트
- GPU 활용률과 응답성 간의 균형
이를 해결하기 위해 일반적으로 오버랩이 있는 슬라이딩 윈도우와 증분 버퍼링을 함께 사용합니다.
아키텍처 개요
Whisper 기반 실시간 스트리밍 시스템은 보통 다음과 같은 구성 요소로 이루어집니다.
Audio Source → Audio Buffer → Segmenter → Whisper Inference → Post-processing → Consumer
- Audio Source — 마이크 / 브라우저 / 전화 회선 등
- Segmenter — 오버랩되는 청크 생성
- Whisper Inference — GPU/CPU 상의 모델 추론
- Post-processing — 텍스트와 타임스탬프 병합
저지연을 위한 세그멘테이션
클라이언트에서 오디오는 계속해서 들어옵니다. 너무 긴 오디오를 한 번에 모델에 넘기지 않으려면 다음과 같이 설정합니다.
- 윈도우 길이: 1–5초
- 오버랩: 0.5–1초
- 버퍼 크기: 요구되는 지연 시간에 따라 결정
윈도우가 작을수록 지연 시간은 줄어들지만, 오버헤드는 증가합니다.
스트리밍에 적합한 모델 선택
| Model | VRAM | Latency | Accuracy |
|---|---|---|---|
| tiny | 1–2 GB | ⭐⭐⭐⭐ | ❌ |
| base | 2–4 GB | ⭐⭐⭐ | ⭐⭐ |
| small | 4–8 GB | ⭐⭐ | ⭐⭐⭐ |
| medium | 8–12 GB+ | ⭐ | ⭐⭐⭐⭐ |
스트리밍에서 가장 균형 잡힌 선택:
base 또는 small기본 스트리밍 워크플로우 (의사 코드)
import whisper
import sounddevice as sd
import numpy as np
model = whisper.load_model("small").to("cuda")
BUFFER = []
WINDOW = 3 # seconds
OVERLAP = 1 # seconds
RATE = 16000
def callback(indata, frames, time, status):
global BUFFER
BUFFER.extend(indata.flatten().tolist())
# When buffer length > window, process
if len(BUFFER) >= RATE * WINDOW:
segment = BUFFER[:RATE * WINDOW]
BUFFER = BUFFER[int(RATE * (WINDOW - OVERLAP)):]
audio = np.array(segment)
result = model.transcribe(audio, fp16=True)
print("--- partial →", result["text"])
이 콜백은 오버랩을 활용해 버퍼를 순환시키면서, 부분적인 트랜스크립트를 계속 출력합니다.
오버랩 처리와 결과 텍스트 합치기
오버랩을 사용하면 청크 경계에서 단어가 잘려 나가는 문제를 줄일 수 있습니다.
예를 들어:
세그먼트:
- 0–3초
- 2–5초
- 4–7초
그 후 처리:
- 오버랩 구간의 중복 텍스트 제거
- 타임스탬프 조정
- 끊김 없는 연속 텍스트 스트림 생성
브라우저에서의 실시간 처리
브라우저에서는 WebRTC 또는 Web Audio API를 사용하여 오디오를 스트리밍할 수 있습니다.
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const processor = audioContext.createScriptProcessor(4096, 1, 1);
source.connect(processor);
processor.connect(audioContext.destination);
processor.onaudioprocess = (e) => {
const chunk = e.inputBuffer.getChannelData(0);
sendToServer(chunk); // WebSocket/Socket.io
};
배포 패턴
☁️ 서버리스(클라우드)
- 클라이언트가 WebSocket을 통해 오디오 전송
- AWS Lambda(짧은 오디오용) 또는 GPU 서버에서 처리
- GPU 인스턴스에서 Whisper 실행
- 오토스케일을 통한 확장성 확보
🖥️ 전용 GPU 서버
- 상시 구동되는 GPU
- 더 낮은 지연 시간
- 24/7 서비스에 적합
🌀 하이브리드
- 엣지에서 오디오 캡처 + 작은 모델로 사전 필터링
- 전체 트랜스크립션은 GPU 서버에서 수행
지연 시간 줄이기
🟡 1. 윈도우 크기 줄이기
배치 크기가 줄어듦 → 부분 결과가 더 빨리 도착
🔵 2. 버퍼 오버랩 사용
빠지는 단어 수를 줄일 수 있음
🟢 3. FP16 / BF16 사용
추론 속도 향상
🔴 4. 여러 사용자를 배치 처리
서버가 여러 스트림을 처리한다면, 배치 처리는 처리량(throughput)을 크게 높여줍니다.
모니터링과 메트릭
다음과 같은 지표를 추적하는 것이 좋습니다.
- 세그먼트별 지연 시간
- 단어 오류율(Word Error Rate, WER)
- GPU 사용률
- 부분 결과와 최종 결과 간의 정확도 차이
대시보드는 Prometheus / Grafana 등을 활용해 구성할 수 있습니다.
트레이드오프
| Goal | Tradeoff |
|---|---|
| Low latency | Lower context → less accuracy |
| High accuracy | Larger windows → higher latency |
| Small model | Faster, less accurate |
| Big model | Slower, more accurate |
활용 사례 예시
- 라이브 스트리밍 자막
- 회의 및 수업 녹취
- 인터랙티브 음성 애플리케이션
- 콘퍼런스 및 웨비나 서비스
결론
Whisper를 이용한 실시간 스트리밍은 충분히 구현 가능합니다. 다만 다음 요소들 사이에서 균형을 맞춰야 합니다.
- 윈도우 크기
- 오버랩 양
- 모델 크기
- 하드웨어 성능
적절한 설계를 적용하면, 프로덕션 환경에서도 사용할 수 있는 저지연·고정확도의 스트리밍 음성 인식 시스템을 구축할 수 있습니다.
