콘텐츠로 이동

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. 강의/세미나 1시간 녹음
  2. Whisper medium으로 텍스트 추출 (10분)
  3. ChatGPT/Claude에게 "이 텍스트 블로그 글로 정리해줘" 요청
  4. 마무리 손질

답사 음성 메모 → 여행 블로그

  1. 다녀온 장소에서 보이는 거 그대로 녹음 (음성 메모 5~10분)
  2. Whisper로 텍스트화 (1분)
  3. 사진 + 이 텍스트로 글 뼈대 작성 → 진짜 후기 같은 톤이 살아남
  4. 이번 황금산 글이 이 패턴으로 발행 (2026-05-09)

인터뷰/회의록

  1. 줌 회의 녹음 (Zoom 자체 녹음 또는 폰 녹음)
  2. Whisper로 화자 구분 없이 텍스트화
  3. 직접 화자 라벨 붙이며 정리 (비싼 솔루션 안 써도 됨)

유튜브 자막 만들기

  • 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' 한 줄만 외워둬도 매주 활용 가능. 강의·인터뷰·답사·회의록·유튜브 자막 다 한 번에 자동화.