1시간짜리 강의 영상, 받아쓰기 3시간 걸리던 게 2분으로 줄었다
온라인 강의를 들으며 중요한 부분을 노트에 옮겨 적는 습관이 있었다. 1시간짜리 영상을 정리하는 데 최소 2~3시간이 걸렸다. 어느 날 문득 “이걸 AI가 대신 해주면 안 되나?” 싶었다. OpenAI의 Whisper API를 찾은 건 그때였다.
Whisper는 음성을 텍스트로 바꾸는 OpenAI의 음성 인식 모델이다. 정확도가 높고 한국어도 잘 잡는다. 유튜브 영상을 다운로드하고 Whisper로 텍스트를 뽑은 뒤 GPT로 요약까지 이어붙이면 — 1시간짜리 영상이 핵심 요약 문서로 바뀌는 데 2분도 안 걸린다. 그 파이프라인 전체 코드를 지금 공개한다.
1. Whisper API 개요와 비용 구조
OpenAI Whisper API는 음성 파일을 텍스트로 변환하는 STT(Speech-To-Text) 서비스다. 지원 언어는 한국어 포함 100개 이상이며, 현재 요금은 오디오 1분당 약 $0.006. 1시간짜리 영상 전체를 돌려도 360원 수준이다. 가성비로 따지면 현존 STT 서비스 중 최상위권에 든다.
로컬에서 Whisper 모델을 직접 실행하는 오픈소스 버전도 있지만, GPU가 없는 일반 PC에서는 속도가 너무 느리다. 1시간 영상을 로컬로 돌리면 처리 시간이 20~30분에 달한다. API 버전은 같은 작업을 클라우드에서 1~2분 만에 끝낸다. 비용 대비 시간 절감 효과가 압도적이라 API 방식을 선택했다.
2. 개발 환경 준비 및 패키지 설치
- Python 버전: 3.10 이상
- 필수 외부 프로그램:
ffmpeg(오디오 변환용, 별도 설치 필요) - 핵심 패키지:
openai,yt-dlp,python-dotenv - 필요 API 키: OpenAI API 키
pip install openai yt-dlp python-dotenv
ffmpeg는 파이썬 패키지가 아니라 시스템 프로그램이라 별도로 설치해야 한다. Windows 기준으로 winget install ffmpeg 명령어 한 줄이면 된다. 설치 후 터미널을 재시작하고 ffmpeg -version을 입력했을 때 버전 정보가 뜨면 정상이다. 이걸 빠뜨리면 나중에 오디오 추출 단계에서 조용히 실패한다.
3. 유튜브 다운로드 → 음성 추출 → 텍스트 변환 → 요약 전체 코드
1단계: 유튜브 영상에서 오디오만 추출
영상 전체를 다운로드하면 용량이 크다. Whisper는 음성만 필요하므로 오디오 트랙만 mp3로 추출한다. yt-dlp가 이 작업을 한 줄로 처리한다.
import yt_dlp
import os
def download_audio(youtube_url: str, output_path: str = "audio.mp3") -> str:
ydl_opts = {
"format": "bestaudio/best",
"outtmpl": output_path.replace(".mp3", ""),
"postprocessors": [{
"key": "FFmpegExtractAudio",
"preferredcodec": "mp3",
"preferredquality": "128", # 음성 인식용은 128kbps로 충분
}],
"quiet": True,
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([youtube_url])
print(f"오디오 추출 완료: {output_path}")
return output_path
2단계: Whisper API로 음성을 텍스트로 변환
Whisper API의 파일 크기 제한은 25MB다. 1시간 영상을 128kbps mp3로 추출하면 약 55MB가 나온다. 제한을 초과하므로 파일을 자동으로 분할해 처리하는 로직이 필요하다.
import os
import math
from openai import OpenAI
from dotenv import load_dotenv
from pydub import AudioSegment # pip install pydub
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def transcribe_audio(audio_path: str) -> str:
file_size_mb = os.path.getsize(audio_path) / (1024 * 1024)
# 25MB 이하면 바로 변환
if file_size_mb < 24:
with open(audio_path, "rb") as f:
result = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language="ko" # 한국어 명시하면 정확도 향상
)
return result.text
# 25MB 초과 시 10분 단위로 분할 처리
print(f"파일 크기 {file_size_mb:.1f}MB — 분할 처리 시작")
audio = AudioSegment.from_mp3(audio_path)
chunk_ms = 10 * 60 * 1000 # 10분
chunks = math.ceil(len(audio) / chunk_ms)
full_text = []
for i in range(chunks):
start = i * chunk_ms
end = min((i + 1) * chunk_ms, len(audio))
chunk = audio[start:end]
chunk_path = f"chunk_{i}.mp3"
chunk.export(chunk_path, format="mp3")
with open(chunk_path, "rb") as f:
result = client.audio.transcriptions.create(
model="whisper-1", file=f, language="ko"
)
full_text.append(result.text)
os.remove(chunk_path)
print(f" [{i+1}/{chunks}] 변환 완료")
return " ".join(full_text)
3단계: 변환된 텍스트를 GPT로 핵심 요약
변환된 전체 스크립트를 GPT-4o-mini에 넘겨 핵심 내용을 구조화된 형태로 요약한다. 마지막으로 텍스트 파일로 저장하면 언제든 꺼내 볼 수 있는 강의 노트가 완성된다.
from openai import OpenAI
def summarize_transcript(transcript: str) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "당신은 강의 내용을 정리하는 전문 편집자입니다."},
{"role": "user", "content": f"""다음 강의 스크립트를 아래 형식으로 정리하세요.
## 핵심 주제
## 주요 내용 (5줄 이내)
## 기억할 키워드
[스크립트]:
{transcript[:6000]}"""} # 토큰 한도 고려해 앞부분 우선 처리
],
temperature=0.3
)
return response.choices[0].message.content
# 전체 파이프라인 실행
if __name__ == "__main__":
url = "https://www.youtube.com/watch?v=여기에_영상_ID"
audio_file = download_audio(url)
transcript = transcribe_audio(audio_file)
summary = summarize_transcript(transcript)
with open("lecture_notes.txt", "w", encoding="utf-8") as f:
f.write("=== 전체 스크립트 ===\n")
f.write(transcript + "\n\n")
f.write("=== AI 요약 ===\n")
f.write(summary)
print("완료! lecture_notes.txt 저장됨")
os.remove(audio_file) # 임시 오디오 파일 삭제
4. 직접 맞은 에러 2가지와 해결법
에러 ① FileNotFoundError: ffmpeg — 환경변수 미등록
ffmpeg를 설치했는데도 FileNotFoundError: ffmpeg가 계속 떴다. 설치는 됐지만 시스템 환경변수 PATH에 등록이 안 된 것이었다. 터미널을 껐다 켜도 안 됐다. Windows 기준으로 [시스템 속성] → [환경변수] → [Path]에 ffmpeg의 bin 폴더 경로를 직접 추가한 뒤 터미널을 완전히 재시작하자 해결됐다. winget으로 설치했다면 이 과정이 자동으로 처리되므로 가능하면 winget을 쓰는 게 낫다.
에러 ② 한국어 인식률이 낮을 때 — language 파라미터 누락
처음엔 language 파라미터를 넣지 않았다. Whisper가 자동으로 언어를 감지하는데, 한국어와 영어가 섞인 IT 강의에서 가끔 언어를 영어로 잘못 판단해 한국어 부분을 로마자로 음역하는 문제가 생겼다. language="ko"를 명시하자 한국어 인식 정확도가 눈에 띄게 올라갔다. 한국어 콘텐츠를 처리할 때는 반드시 언어 코드를 지정해야 한다.
5. 실전 활용 시나리오와 비용 계산
이 파이프라인을 어디에 쓸 수 있는지, 비용은 얼마나 드는지 정리했다.
| 활용 시나리오 | 영상 길이 | Whisper 비용 | 처리 시간 |
|---|---|---|---|
| 온라인 강의 노트 자동 생성 | 60분 | 약 360원 | 약 90초 |
| 회의 녹음 자동 요약 | 30분 | 약 180원 | 약 45초 |
| 유튜브 인터뷰 자막 추출 | 20분 | 약 120원 | 약 30초 |
강의를 들을 때마다 손으로 받아쓰던 시간이 사라졌다. 이제 영상을 재생하는 동안 스크립트가 돌고, 영상이 끝날 즈음에 요약 파일이 완성된다. 남은 시간을 이해하고 복습하는 데 쓴다 — 그게 원래 공부의 목적 아닌가.