30. Whisper로 음성 → 텍스트 자동 변환 (STT)¶
강의·인터뷰·답사 메모를 녹음만 해뒀더니 글로 옮겨야 한다. 손으로 받아치면 30분짜리가 2시간. Whisper로 돌리면 30분짜리가 5분. 한국어 정확도 90%.
Whisper가 뭐야?¶
OpenAI가 무료로 공개한 음성 인식 AI 모델. 인터넷 없어도 내 컴퓨터 안에서 돌아감 (오프라인). ChatGPT 만든 회사가 만든 거라 한국어를 비롯해 99개 언어를 잘 알아들음.
설치: pip install openai-whisper (한 번만)
비유로 이해하기¶
녹음기 = 소리를 저장하는 도구. Whisper = 그 옆에 앉은 자동 받아쓰기 비서. 내가 말한 걸 듣자마자 텍스트로 받아 적어주는데, 한국어 잘 알아듣고, 사투리도 어느 정도 잡고, 잠시 끊어 말해도 잘 따라옴.
실전 패턴¶
1. 가장 간단한 사용법¶
import whisper
model = whisper.load_model('medium') # 모델 로드 (처음 1번만)
result = model.transcribe('녹음.m4a', language='ko', fp16=False)
print(result['text']) # 통째로 정리된 텍스트
옵션 풀이:
- language='ko': 한국어로 인식해 (안 적으면 자동 감지인데 가끔 영어로 잘못 잡음)
- fp16=False: GPU 안 쓸 때 필수. 안 적으면 경고 뜸 (없어도 동작은 함)
2. 시간대별로 받기 (장면별 구분 필요할 때)¶
result = model.transcribe('인터뷰.m4a', language='ko', fp16=False)
for seg in result['segments']:
start = seg['start'] # 초 단위 (예: 12.5)
text = seg['text'].strip()
print(f"[{start:6.1f}s] {text}")
→ "12.5초에 무슨 말 나왔지?" 즉시 점프 가능. 유튜브 챕터 만들 때도 유용.
3. 결과를 JSON으로 저장¶
import json
with open('결과.json', 'w', encoding='utf-8') as f:
json.dump(result['segments'], f, ensure_ascii=False, indent=2)
모델 크기 고르기 ★ 중요¶
| 모델 | 크기 | 속도 | 한국어 정확도 | 추천 용도 |
|---|---|---|---|---|
tiny |
75MB | 매우 빠름 | 60% | 시간 급할 때, 맛보기 |
base |
150MB | 빠름 | 70% | 회의록 초안 |
small |
500MB | 보통 | 80% | 일반 녹음 |
medium |
1.5GB | 약간 느림 | 90% | 블로그·강의 자료 (추천) |
large-v3 |
3GB | 느림 | 95%+ | 출판·정확도 최우선 |
팁: 처음엔 medium으로 시작. 정확도 부족하면 large-v3.
처음 모델 받을 때만 1~2분 걸리고, 그다음부터는 캐시되어 빠름.
처리 시간 감각¶
- 10분 녹음 + medium 모델 + 보통 노트북 = 약 2~3분
- 10분 녹음 + tiny 모델 = 30초
- 10분 녹음 + large-v3 = 7~10분
오디오 길이의 20~30%가 처리 시간이라고 보면 됨.
활용 사례¶
강의 녹음 → 블로그 글¶
- 강의/세미나 1시간 녹음
- Whisper medium으로 텍스트 추출 (10분)
- ChatGPT/Claude에게 "이 텍스트 블로그 글로 정리해줘" 요청
- 마무리 손질
답사 음성 메모 → 여행 블로그¶
- 다녀온 장소에서 보이는 거 그대로 녹음 (음성 메모 5~10분)
- Whisper로 텍스트화 (1분)
- 사진 + 이 텍스트로 글 뼈대 작성 → 진짜 후기 같은 톤이 살아남
- 이번 황금산 글이 이 패턴으로 발행 (2026-05-09)
인터뷰/회의록¶
- 줌 회의 녹음 (Zoom 자체 녹음 또는 폰 녹음)
- Whisper로 화자 구분 없이 텍스트화
- 직접 화자 라벨 붙이며 정리 (비싼 솔루션 안 써도 됨)
유튜브 자막 만들기¶
- yt-dlp로 자막 추출이 안 되는 영상 (자막 없음)
- mp4 파일을 Whisper에 직접 넣으면 자막 텍스트 자동 생성
- → SRT 형식으로 출력하면 영상에 바로 붙일 수 있음
import whisper
model = whisper.load_model('medium')
result = model.transcribe('영상.mp4', language='ko', fp16=False)
# SRT 형식으로 저장
import datetime
def fmt(s):
return str(datetime.timedelta(seconds=s)).replace('.', ',')[:12]
with open('영상.srt', 'w', encoding='utf-8') as f:
for i, seg in enumerate(result['segments'], 1):
f.write(f"{i}\n{fmt(seg['start'])} --> {fmt(seg['end'])}\n{seg['text'].strip()}\n\n")
주의사항 / 함정¶
- 고유명사·전문용어가 부정확할 수 있음. "이선 몰릭" → "이선 몰렉", "ChatGPT" → "채피pt" 같은 인식 오류는 정리 후 직접 잡아야 함.
- 소음이 심하면 정확도 급락. 카페 녹음보다 조용한 방 녹음이 훨씬 잘 잡힘.
- m4a/mp3/wav/mp4 다 됨. ffmpeg가 같이 깔려 있어야 m4a, mp3 같은 압축 포맷 처리.
- 첫 실행 때 모델 다운로드 (medium은 1.5GB). 와이파이 없으면 안 됨.
- GPU 없이도 돌아감. CPU만 있어도 medium까지는 무난.
yt-dlp와 함께 쓰면 강력¶
# 1. 유튜브 영상 mp4 다운로드 (오디오만 받기)
import subprocess
subprocess.run(["yt-dlp", "-x", "--audio-format", "mp3",
"-o", "음성.%(ext)s", "URL"])
# 2. Whisper로 텍스트화
import whisper
model = whisper.load_model('medium')
result = model.transcribe('음성.mp3', language='ko', fp16=False)
print(result['text'])
→ 자막 없는 유튜브 영상도 텍스트로 추출 가능. (자막 있으면 yt-dlp만으로 충분, 자막 없을 때 Whisper 보강 — 27번 문서와 같이 보면 좋음)
정리¶
녹음만 하면 글 자료가 나오는 시대. medium 모델 + language='ko' 한 줄만 외워둬도 매주 활용 가능. 강의·인터뷰·답사·회의록·유튜브 자막 다 한 번에 자동화.