유튜브(YouTube)에는 다양한 정보가 넘쳐나는데요. 제목만 보아도 관심이 가는 동영상 콘텐츠들이 쉽게 찾아볼 수 있습니다. 하지만 영상의 내용이 내가 찾는 내용인지 확인하기 어렵고, 동영상을 시청하지 않으면 내용을 확인할 수 없다는 단점이 있습니다. 오늘은 유튜브 텍스트 추출 후, 제미나이(Gemini) API를 사용하여 내용을 요약하는 방법을 알아보겠습니다.
1. “유튜브 요약하기”가 왜 필요한가?
우선 코드를 통해 얻게되는 결과물은 유튜브 영상의 요약본입니다. 이미 릴리스 AI와 같은 유튜브 요약 기능을 제공하는 강력한 서비스가 있지만, 무료로 사용하기에는 한계가 있습니다. 또한 이미 서식이 갖추어져 있어 사용자가 원하는 형식의 결과물을 얻기에는 부족한 면이 있는데요. 오늘 작성한 코드로 얻을 수 있는 것들은 다음과 같습니다.
- 강의 및 수업 내용 요약: 녹화된 강의나 화상 회의를 빠르게 텍스트로 변환하고 핵심 내용 추출
- 인터뷰 및 회의록 생성: 녹음된 인터뷰나 회의를 텍스트화하여 기록 관리
- 유튜브 영상 콘텐츠 요약: 다운로드한 유튜브 영상의 내용을 텍스트로 추출하고 요약
- 팟캐스트 내용 정리: 오디오 팟캐스트의 주요 내용을 빠르게 파악
- 연구 인터뷰 데이터 처리: 연구 목적으로 수집한 인터뷰 오디오를 효율적으로 텍스트화
1) 코드 동작 및 작성 방법
유튜브 요약 프로그램은 제미나이 3.0을 이용하여 바이브 코딩으로 작성하는 방법을 알아보겠습니다. 우선 정확한 목적을 전달하기 위해서는 계획 및 동작 순서를 전달해야하는데요. 동작 순서는 아래와 같습니다. 전체 코드는 맨 아래로 이동하시면 다운받으실 수 있습니다.
- 사용자가 미디어 파일(MP3, MP4, WAV 등)을 선택
- Whisper AI 모델을 사용하여 음성을 텍스트로 변환
- Gemini API를 사용하여 변환된 텍스트를 5줄로 요약
- 원본 텍스트와 요약본을 별도의 텍스트 파일로 저장
Whisper AI 및 제미나이 API 발급받는 방법은 아래 포스팅을 참고하세요
2) 프롬프트 작성
먼저 동작 순서를 기반으로 바이브 코딩을 위한 프롬프트를 작성합니다. 프롬프트는 자세히 적어 전달했을 때 최적의 답변을 얻을 수 있는데요. 하지만 자세한 프롬프트를 제공했다고 해도 한번에 성공을 장담하지는 않습니다. 제 경험상 AI에게 요청하여 코드를 얻는 바이브 코딩은 한번에 성공하기 어렵고 실행과 수정을 반복하여 코드를 완성해야합니다. 제가 사용했던 프롬프트는 아래에 남겨놓겠습니다.
<프롬프트>
**주제: 로컬 미디어 파일을 Whisper로 텍스트 변환 후 Gemini API로 요약하는 Python 자동화 스크립트 작성**
**[목표]**
로컬 컴퓨터에 있는 오디오 또는 비디오 파일을 선택하여 `openai-whisper`를 통해 텍스트로 변환하고, 변환된 내용을 `google.generativeai` (Gemini)를 사용하여 5줄로 핵심 요약하는 파이썬 스크립트를 작성해줘.
**[상세 요구사항]**
1. **라이브러리 구성**:
* `os`, `torch`, `whisper`, `tkinter`, `google.generativeai`, `datetime`, `sys` 등을 사용할 것.
* Gemini API Key는 상단에 변수(`API_KEY`)로 설정할 수 있게 할 것.
2. **기능 1: 파일 선택 (GUI)**:
* `tkinter`를 사용하여 파일 선택 대화상자를 띄울 것.
* 지원 형식: 오디오(mp3, wav, m4a), 비디오(mp4, avi, mkv, webm).
3. **기능 2: 텍스트 변환 (Whisper)**:
* 함수명 예시: `transcribe_audio`
* Whisper 모델은 **'large'** 사이즈를 로드할 것.
* GPU(`cuda`) 사용 가능 시 GPU를 사용하고, 아니면 CPU를 사용할 것.
* 변환이 끝나면 GPU 메모리 누수를 방지하기 위해 모델 삭제(`del model`) 및 캐시 비우기(`torch.cuda.empty_cache()`)를 반드시 수행할 것.
* 변환된 텍스트를 파일로 저장할 수 있어야 함.
4. **기능 3: 텍스트 요약 (Gemini)**:
* 함수명 예시: `summarize_text`
* 모델은 **'gemini-3-flash-preview'**를 사용할 것.
* 프롬프트 내용: "다음 텍스트를 5줄로 요약해주세요."
* 오류 발생 시 예외 처리를 할 것.
5. **기능 4: 파일 저장 및 경로 설정**:
* 출력 파일명은 원본 파일명 뒤에 **날짜(YYMMDD)**가 붙는 형식을 따를 것.
* 전문: `파일명_251231.txt`
* 요약: `summary_파일명_251231.txt`
* 원본 파일과 동일한 폴더에 저장되도록 경로를 생성할 것.
6. **메인 실행 흐름 (`main` 함수)**:
* 파일 선택 -> 텍스트 변환 -> 변환된 텍스트 파일 저장 -> 요약 생성 -> 요약 파일 저장 순서로 실행.
* 각 단계별로 진행 상황(모델 로드 중, 변환 중 등)을 `print`로 출력할 것.
* `try-except-finally` 블록을 사용하여 사용자가 `KeyboardInterrupt`로 중단하거나 오류 발생 시 깔끔하게 종료되도록 처리할 것.
<주의사항>
– 이 포스팅에서는 동영상, 오디오 파일 다운로드 방법은 다루지 않습니다.
– 동영상, 오디오 파일은 다운로드는 저작권에 문제가 발생할 수 있으니 주의해야합니다.
2. 코드 실행 및 분석
1) 파이썬 라이브러리 설치
Gemini 3 에게 요청하면 상단에 라이브러리를 임포트(Import)하는 구문을 확인할 수 있는데요. 설치되어 있지 않다면, 별도의 설치가 필요합니다. 설치 방법은 제미나이를 통해 물어보거나 아래 코드와 같이 설치할 라이브러리를 입력하면 라이브러리를 설치할 수 있습니다.
바이브 코딩을 통해 생성된 코드는 다를 수 있으니 참고하세요.
import os
import torch
import whisper
import tkinter as tk
from tkinter import filedialog
import google.generativeai as genai
from datetime import datetime
import sys
▼ 라이브러리 설치 명령어 (최신 버전 호환을 위해 upgrade 옵션 사용)
pip install --upgrade torch google-generativeai pandas numpy openai-whisper
ex) pip install --upgrade 라이브러리1 라이브러리2...
2) 제미나이 API 키 등록하기
라이브러리 설치가 완료되었다면, 대본 텍스트에 사용할 제미나이 API 키를 등록해야하는데요. 아래 코드와 같이 발급받은 api키를 입력합니다. Gemini API 키를 발급받는 방법은 아래 포스팅을 참고하세요.
# 기본 설정
API_KEY = '여기에 붙여넣으세요' # Gemini API 키
3) 동영상 및 오디오 파일 선택하기
이 코드는 사용자가 텍스트로 변환할 동영상/오디오 파일을 선택할 수 있는 창을 띄웁니다. 다양한 형식의 동영상 및 오디오 파일의 확장자를 지원하고 있습니다. 코드의 대략적인 작동 방식 및 순서는 아래 내용을 참고하세요.
tk.Tk()와withdraw()로 보이지 않는 기본 창 생성file_types리스트로 선택 가능한 파일 유형 정의 (MP3, MP4, WAV 등)filedialog.askopenfilename()으로 파일 선택 대화상자 표시- 선택한 파일의 경로를 반환
def select_media_file():
root = tk.Tk()
root.withdraw() # 루트 창 숨기기
file_types = [
("미디어 파일", "*.mp3 *.mp4 *.wav *.m4a *.avi *.mkv *.webm"),
("오디오 파일", "*.mp3 *.wav *.m4a"),
("비디오 파일", "*.mp4 *.avi *.mkv *.webm"),
("모든 파일", "*.*")
]
file_path = filedialog.askopenfilename(
title="텍스트 변환할 미디어 파일 선택",
filetypes=file_types
)
return file_path
4) 동영상/오디오 파일 대본 텍스트로 추출하기
이 함수는 Whisper AI를 사용하여 동영상 및 오디오를 텍스트로 변환합니다. 휘스퍼 AI는 오픈소스로 무료로 사용할 수 있는 장점이 있습니다. 아래 코드는 제가 외장 그래픽이 없는 관계로 cpu를 사용하도록 작성된 코드입니다. 만약 외장 그래픽 카드가 장착되어 있다면, CUDA를 사용하도록 변경하여 사용하시기 바랍니다. 작성된 코드의 흐름은 아래와 같습니다.
- GPU 가용성 확인 후 적절한 장치(CUDA 또는 CPU) 선택
- Whisper의 ‘turbo’ 모델 로드
model.transcribe()로 오디오 파일의 텍스트 변환- 변환된 텍스트를 파일로 저장(output_path가 제공된 경우)
- 메모리 관리를 위해 모델 삭제 및 CUDA 캐시 정리
- 예외 처리로 오류 상황 대응
def transcribe_audio(audio_path, output_path=None):
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"사용 장치: {device}")
try:
# Whisper 모델 로드
print("Whisper 'turbo' 모델 로드 중...")
model = whisper.load_model("turbo", device=device)
# 오디오 파일 변환
print(f"'{audio_path}' 파일 텍스트 변환 중...")
result = model.transcribe(audio_path)
transcribed_text = result["text"]
# 텍스트 파일 저장
if output_path:
with open(output_path, "w", encoding="utf-8") as f:
f.write(transcribed_text)
print(f"텍스트가 {output_path}에 저장되었습니다.")
# 메모리 정리
del model
if device == "cuda":
torch.cuda.empty_cache()
return transcribed_text
except Exception as e:
print(f"오디오 변환 중 오류: {e}")
return None
Whisper 모델 종류
동영상 및 오디오 파일에서 텍스트를 추출하기 위해 사용되는 Whisper(휘스퍼)는 여러 종류를 모델을 제공하는데요. 가장 가벼운 tiny 모델에서 부터 turbo, large 등과 같이 강력한 기능을 제공하는 모델까지 제공합니다. 다만 성능에 따라 텍스트로 변환하는 속도 차이가 발생할 수 있으니 아래 표를 참고하여 작업에 적정한 모델을 선택하시기 바랍니다.

5) 텍스트 요약 기능
이 코드는 Google의 Gemini API를 사용하여 대본 텍스트를 요약합니다. 해당 코드에서는 5줄로 요약하는 프롬프트를 사용하였지만, 사용자가 원하는 프롬프트로 수정하여 사용할 수 있습니다.
- API 키로 Gemini 설정(위에서 입력한 api 키 사용)
- ‘gemini-3-flash-preview’ 모델 사용
- 5줄 요약을 요청하는 프롬프트 구성( 프롬프트 수정 가능)
generate_content()로 요약 생성 후 결과 반환- 예외 처리로 API 오류 상황 대응
def summarize_text(text):
try:
# Gemini API 설정
genai.configure(api_key=API_KEY)
model = genai.GenerativeModel('gemini-3-flash-preview')
# 요약 프롬프트 작성
prompt = f"""다음 텍스트를 5줄로 요약해주세요.
텍스트:
{text}
"""
# 요약 생성
response = model.generate_content(prompt)
return response.text
except Exception as e:
print(f"텍스트 요약 중 오류 발생: {e}")
return None
6) 출력 파일 경로 생성 기능
이 함수는 저장할 텍스트 파일의 경로를 생성합니다. 아래 코드에서는 동영상/오디오 파일이 있는 위치에 요약파일을 생성합니다. 생성 형식은 원본 파일 이름 앞에 “summary” 및 현재 날짜를 추가하여 텍스트 파일을 생성합니다.
- 원본 미디어 파일의 디렉토리와 파일명 분리
- 확장자를 제외한 기본 파일명 추출
- 현재 날짜를 YYMMDD 형식으로 가져옴
- 요약 파일인 경우 “summary_” 접두어 추가
- 최종 출력 파일 경로 생성 및 반환
def generate_output_path(media_path, is_summary=False):
# 파일 디렉토리와 파일명 추출
directory = os.path.dirname(media_path)
file_name = os.path.basename(media_path)
# 확장자 제거한 파일명만 추출
base_name = os.path.splitext(file_name)[0]
# 현재 날짜 형식 (YYMMDD)
current_date = datetime.now().strftime("%y%m%d")
# 파일명 생성
if is_summary:
output_file_name = f"summary_{base_name}_{current_date}.txt"
else:
output_file_name = f"{base_name}_{current_date}.txt"
# 전체 경로 생성
output_path = os.path.join(directory, output_file_name)
return output_path
7) 메인 실행 함수
메인 함수는 전체 프로그램의 실행 흐름을 관리합니다. 시스템에 작성된 함수들을 차례대로 실행하며 오류가 발생하였을 때 예외 처리를 실행합니다.
- 프로그램 시작 안내 메시지 출력
- 미디어 파일 선택 함수 호출 및 파일 경로 확인
- 출력 파일 경로 생성
- Whisper로 텍스트 변환 수행
- Gemini API로 텍스트 요약 수행
- 요약 텍스트 파일 저장
- 작업 완료 메시지 출력
- 다양한 예외 상황 처리 (파일 미선택, 변환 실패, 사용자 중단 등)
def main():
try:
print("\n미디어 파일에서 텍스트 추출 및 요약 프로그램")
print("=" * 50)
# 미디어 파일 선택
print("변환할 미디어 파일을 선택해주세요...")
media_path = select_media_file()
if not media_path:
print("파일을 선택하지 않았습니다. 프로그램을 종료합니다.")
return
print(f"선택된 파일: {media_path}")
# 출력 파일 경로 생성
text_output_path = generate_output_path(media_path, is_summary=False)
# 텍스트 변환
print("\nWhisper를 사용하여 텍스트 변환 중...")
transcribed_text = transcribe_audio(media_path, text_output_path)
if not transcribed_text:
print("텍스트 변환에 실패했습니다. 프로그램을 종료합니다.")
return
print(f"텍스트 변환 완료. 파일 저장 위치: {text_output_path}")
# 텍스트 요약
print("\nGemini API를 사용하여 텍스트 요약 중...")
summary_text = summarize_text(transcribed_text)
if not summary_text:
print("텍스트 요약에 실패했습니다.")
return
# 요약 파일 저장
summary_output_path = generate_output_path(media_path, is_summary=True)
with open(summary_output_path, "w", encoding="utf-8") as f:
f.write(summary_text)
print(f"요약 완료. 파일 저장 위치: {summary_output_path}")
print("\n작업이 완료되었습니다!")
except KeyboardInterrupt:
print("\n사용자에 의해 프로그램이 중단되었습니다.")
except Exception as e:
print(f"\n예상치 못한 오류 발생: {e}")
finally:
# 종료 오류 메시지 숨기기
sys.stderr = open(os.devnull, 'w')
print("\n프로그램을 종료합니다.")
마치며
오늘 작성한 “유튜브 텍스트 추출하고 요약하기” 프로그램은 다양하게 활용할 수 있는데요. 다만 Whisper AI 모델을 너무 낮은 품질로 선택하게 되면 내용을 파악하기 힘들어지는 단점이 있습니다. 또한 잡음이 많거나 발음이 정확하지 않으면 해당 내용의 맥락을 이해하기 힘들어집니다. 이럴 땐 맥락에 맞게 제미나이(Gemini)를 이용하여 맥락에 맞게 다시 편집하여 사용하는 걸 추천드립니다.