AI Sparkup

최신 AI 쉽게 깊게 따라잡기⚡

Whisper 튜토리얼 – Faster-Whisper로 로컬 오디오 텍스트 변환 완전 가이드

오디오 파일을 텍스트로 변환하는 것은 회의 녹음 분석, 자막 생성, 음성 앱 개발 등 다양한 상황에서 필요하다. 로컬에서 처리하면 외부 API에 데이터를 보내지 않아 프라이버시를 보호하고 반복 클라우드 비용도 제거할 수 있다.

이 튜토리얼에서는 Faster-Whisper를 사용해 CPU·GPU 모두에서 동작하는 로컬 음성인식 시스템을 구축한다. 원본 OpenAI Whisper보다 최대 4배 빠르고 메모리 사용량도 적다.

원본 Whisper vs. 로컬 변형

변형특징Python 친화성
OpenAI Whisper (원본)기준 모델, CPU에서 느림좋음
whisper.cppC++, 컴파일 필요, CPU 최고 속도낮음
Faster-WhisperCTranslate2 기반, 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 pydub

FFmpeg 설치 (MP3·M4A 등 변환에 필요):

# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows: FFmpeg.org에서 다운로드 후 PATH에 추가
# 또는: winget install ffmpeg

GPU 가속을 원하면 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)

관련 문서

참고 자료



AI Sparkup 구독하기

최신 게시물 요약과 더 심층적인 정보를 이메일로 받아 보세요! (무료)