목차
오디오 파일을 텍스트로 변환하는 것은 회의 녹음 분석, 자막 생성, 음성 앱 개발 등 다양한 상황에서 필요하다. 로컬에서 처리하면 외부 API에 데이터를 보내지 않아 프라이버시를 보호하고 반복 클라우드 비용도 제거할 수 있다.
이 튜토리얼에서는 Faster-Whisper를 사용해 CPU·GPU 모두에서 동작하는 로컬 음성인식 시스템을 구축한다. 원본 OpenAI Whisper보다 최대 4배 빠르고 메모리 사용량도 적다.
원본 Whisper vs. 로컬 변형
| 변형 | 특징 | Python 친화성 |
|---|---|---|
| OpenAI Whisper (원본) | 기준 모델, CPU에서 느림 | 좋음 |
| whisper.cpp | C++, 컴파일 필요, CPU 최고 속도 | 낮음 |
| Faster-Whisper | CTranslate2 기반, 4× 빠름, 메모리 효율적 | 최고 |
이 튜토리얼에서는 Faster-Whisper를 사용한다. 두 변형 모두 100% 로컬 실행으로 데이터가 외부로 나가지 않는다.
환경 설정
Python 3.8 이상, Windows/macOS/Linux 모두 지원.
# 가상환경 생성 (선택 사항이지만 권장)
python -m venv whisper_env
source whisper_env/bin/activate # macOS/Linux
# whisper_env\Scripts\activate # Windows
# Faster-Whisper 설치
pip install faster-whisper
# 오디오 전처리 도구 설치
pip install pydubFFmpeg 설치 (MP3·M4A 등 변환에 필요):
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Windows: FFmpeg.org에서 다운로드 후 PATH에 추가
# 또는: winget install ffmpegGPU 가속을 원하면 Faster-Whisper GPU 가이드에서 cuBLAS와 cuDNN을 설치한다. GPU 없으면 CPU로 자동 폴백.
오디오 전처리: WAV 변환
Whisper는 16kHz 모노 WAV 형식을 기대한다. pydub으로 MP3·M4A·OGG 등을 변환한다:
from pydub import AudioSegment
import os
def convert_to_wav(input_path, output_path=None):
if output_path is None:
base, _ = os.path.splitext(input_path)
output_path = base + ".wav"
audio = AudioSegment.from_file(input_path)
# 모노, 16kHz로 변환
audio = audio.set_channels(1).set_frame_rate(16000)
audio.export(output_path, format="wav")
return output_path
# 사용 예
wav_file = convert_to_wav("meeting.mp3")기본 트랜스크립션 스크립트
from faster_whisper import WhisperModel
def transcribe_audio(wav_path, model_size="base", device="cpu"):
"""
model_size: "tiny", "base", "small", "medium", "large-v2", "large-v3"
device: "cpu" 또는 "cuda" (GPU 있을 때)
"""
# 모델 초기화 (첫 실행 시 자동 다운로드)
model = WhisperModel(model_size, device=device, compute_type="int8")
# 트랜스크립션 실행
segments, info = model.transcribe(wav_path, beam_size=5, language="ko")
print(f"감지된 언어: {info.language} (확률: {info.language_probability:.2f})")
for segment in segments:
print(f"[{segment.start:.2f}s → {segment.end:.2f}s] {segment.text}")
return " ".join([seg.text for seg in segments])
# 실행
if __name__ == "__main__":
text = transcribe_audio("recording.wav", model_size="small", device="cpu")모델 크기별 속도·정확도 비교
| 모델 | VRAM | 속도 | 정확도 |
|---|---|---|---|
| tiny | ~1GB | 매우 빠름 | 낮음 |
| base | ~1GB | 빠름 | 보통 |
| small | ~2GB | 보통 | 좋음 |
| medium | ~5GB | 느림 | 매우 좋음 |
| large-v3 | ~10GB | 매우 느림 | 최고 |
일반 사용에는 small이 속도와 정확도의 균형이 좋다. 한국어 등 비영어 트랜스크립션에는 medium 이상 권장.
한국어 트랜스크립션 팁
# 언어 명시로 감지 오버헤드 제거
segments, info = model.transcribe(
wav_path,
language="ko", # 한국어 명시
beam_size=5,
vad_filter=True, # 음성 감지 필터 (침묵 제거)
)전체 워크플로 파이프라인
def transcribe_any_audio(input_path, model_size="small", language=None):
"""MP3·M4A 등을 자동 변환 후 트랜스크립션"""
# WAV가 아니면 변환
if not input_path.endswith(".wav"):
wav_path = convert_to_wav(input_path)
else:
wav_path = input_path
return transcribe_audio(wav_path, model_size=model_size)
# 사용
result = transcribe_any_audio("interview.mp3", model_size="medium")
print(result)관련 문서
- whisper-cpp — C/C++ 구현 whisper.cpp (CPU 최적화, 컴파일 필요)
- whisper-cpp-tutorial-subtitle-generator — whisper.cpp와 Codex로 자막 생성 웹앱 만들기
- vibevoice — Microsoft의 오픈소스 음성 AI 패밀리 (TTS·ASR·스트리밍)
참고 자료
- Local Whisper Audio Transcription — KDnuggets (2026-04-28)
- SYSTRAN/faster-whisper — GitHub 공식 저장소