Skip to content

SaraHan774/ytt

Repository files navigation

YouTube Transcript Tool (ytt)

ν•œκ΅­μ–΄ | English | δΈ­ζ–‡

YouTube μ˜μƒμ„ μžλ™μœΌλ‘œ μ „μ‚¬ν•˜κ³  μš”μ•½ν•˜λŠ” CLI λ„κ΅¬μž…λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•

  • πŸ†“ μ™„μ „ 무료 전사: 둜컬 Whisper λͺ¨λΈ μ‚¬μš© (API λΉ„μš© μ—†μŒ)
  • πŸš€ GPU 가속: faster-whisper둜 5-10λ°° λΉ λ₯Έ 처리
  • ⚑ κ·Ήν•œ μ΅œμ ν™”: ffmpeg μ²­ν‚ΉμœΌλ‘œ λ©”λͺ¨λ¦¬ 90% 절감, Prompt Caching으둜 API λΉ„μš© 90% 절감
  • πŸ€– μ΅œμ‹  Claude Sonnet 4.6: κ³ ν’ˆμ§ˆ μš”μ•½
  • 🌍 λ‹€κ΅­μ–΄ 지원: ν•œκ΅­μ–΄, μ˜μ–΄, 쀑ꡭ어 μš”μ•½ 지원
  • πŸ’» CLI μΈν„°νŽ˜μ΄μŠ€: λͺ…λ Ήμ€„μ—μ„œ κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©
  • 🎯 μš”μ•½ μ „μš© λͺ¨λ“œ: 이미 μ „μ‚¬λœ νŒŒμΌμ—μ„œ μš”μ•½λ§Œ λΉ λ₯΄κ²Œ 생성

μ„€μΉ˜

방법 1: Homebrew (ꢌμž₯ - macOS/Linux)

# Tap μΆ”κ°€
brew tap SaraHan774/ytt

# μ„€μΉ˜ (ffmpeg μžλ™ μ„€μΉ˜λ¨)
brew install ytt

# λŒ€ν™”ν˜• μ„€μ • μ‹€ν–‰
ytt-init

방법 2: pip (μˆ˜λ™ μ„€μΉ˜)

1. ffmpeg μ„€μΉ˜ (ν•„μˆ˜)

# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt-get install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

2. Python νŒ¨ν‚€μ§€ μ„€μΉ˜

# μ €μž₯μ†Œ 클둠
git clone <repository-url>
cd ytt

# νŒ¨ν‚€μ§€ μ„€μΉ˜
pip install -r requirements.txt
pip install -e .

3. λŒ€ν™”ν˜• μ„€μ • (ꢌμž₯)

μ„€μΉ˜ ν›„ 처음 yttλ₯Ό μ‹€ν–‰ν•˜λ©΄ μžλ™μœΌλ‘œ λŒ€ν™”ν˜• μ„€μ • λ§ˆλ²•μ‚¬κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€:

# 첫 μ‹€ν–‰ μ‹œ μžλ™μœΌλ‘œ μ„€μ • μ§„ν–‰
ytt

# λ˜λŠ” μˆ˜λ™μœΌλ‘œ μ„€μ • μ‹€ν–‰
ytt-init

# μ„€μ • μ΄ˆκΈ°ν™” 및 μž¬μ„€μ •
ytt-init --reset

λŒ€ν™”ν˜• μ„€μ •μ—μ„œ κ΅¬μ„±ν•˜λŠ” ν•­λͺ©:

  • βœ… μ‹œμŠ€ν…œ ν™˜κ²½ 확인 (ffmpeg, GPU λ“±)
  • πŸ”‘ Anthropic API ν‚€ μ„€μ •
  • 🌍 κΈ°λ³Έ μ–Έμ–΄ 선택 (ν•œκ΅­μ–΄/μ˜μ–΄/쀑ꡭ어)
  • 🎀 κΈ°λ³Έ Whisper λͺ¨λΈ 크기
  • βš™οΈ μžλ™ μš”μ•½ ν™œμ„±ν™” μ—¬λΆ€

4. μˆ˜λ™ API ν‚€ μ„€μ • (선택)

# ν™˜κ²½ λ³€μˆ˜λ‘œ μ„€μ •
export ANTHROPIC_API_KEY="your-api-key"

# λ˜λŠ” CLI λͺ…λ Ήμ–΄λ‘œ μ„€μ •
ytt-config set-api-key "your-api-key"

# μ„€μ • 확인
ytt-config show-config

# λ˜λŠ” .env 파일 생성
echo "ANTHROPIC_API_KEY=your-api-key" > .env

μ‚¬μš© 방법

κΈ°λ³Έ μ‚¬μš©λ²•

# μ „μ‚¬λ§Œ 생성 (μ˜μƒ 정보 + 전사 ν…μŠ€νŠΈ)
ytt "https://youtube.com/watch?v=xxx" ./output

# 전사 + μš”μ•½ (transcript.json μžλ™ 생성)
ytt "https://youtube.com/watch?v=xxx" ./output --summarize

# νƒ€μž„μŠ€νƒ¬ν”„ νŒŒμΌλ„ ν•¨κ»˜ μ €μž₯
ytt "https://youtube.com/watch?v=xxx" ./output --timestamps

# JSON + 메타데이터 νŒŒμΌλ„ ν•¨κ»˜ μ €μž₯
ytt "https://youtube.com/watch?v=xxx" ./output --json --metadata

# μ–Έμ–΄ μˆ˜λ™ μ§€μ • + μš”μ•½
ytt "https://youtube.com/watch?v=xxx" ./output -l ko --summarize

# μ˜μ–΄ μ˜μƒ + μ˜μ–΄ μš”μ•½
ytt "https://youtube.com/watch?v=xxx" ./output -l en --summarize

μš”μ•½ μ „μš© λͺ¨λ“œ

이미 전사가 μ™„λ£Œλœ λ””λ ‰ν† λ¦¬μ—μ„œ μš”μ•½λ§Œ 생성:

# λ¨Όμ € 전사 + JSON μ €μž₯ (--summarize-only μž¬μ‚¬μš©μ„ μœ„ν•΄ --json ν•„μš”)
ytt "URL" ./output -m tiny --json

# λ˜λŠ” --summarize둜 처음 μ‹€ν–‰ν•˜λ©΄ transcript.json μžλ™ 생성됨
ytt "URL" ./output --summarize

# λ‚˜μ€‘μ— μš”μ•½λ§Œ μΆ”κ°€
ytt ./output --summarize-only -l ko

상세 μ˜΅μ…˜

ytt --help

μ£Όμš” μ˜΅μ…˜:

  • --summarize, -s: μš”μ•½λ„ ν•¨κ»˜ 생성 (transcript.json μžλ™ μ €μž₯)
  • --summarize-only: κΈ°μ‘΄ transcript.json으둜 μš”μ•½λ§Œ 생성
  • --timestamps: νƒ€μž„μŠ€νƒ¬ν”„ 포함 전사 νŒŒμΌλ„ μ €μž₯ (transcript_with_timestamps.txt)
  • --json: κ΅¬μ‘°ν™”λœ JSON νŒŒμΌλ„ μ €μž₯ (transcript.json)
  • --metadata: μ˜μƒ 메타데이터 νŒŒμΌλ„ μ €μž₯ (metadata.json)
  • --model-size, -m: Whisper λͺ¨λΈ 크기 (κΈ°λ³Έκ°’: base)
  • --language, -l: μ–Έμ–΄ μ§€μ • (κΈ°λ³Έκ°’: auto - μžλ™ 감지)
  • --no-cleanup: μž„μ‹œ 파일 μ‚­μ œν•˜μ§€ μ•ŠμŒ
  • --no-cache: ν”„λ‘¬ν”„νŠΈ 캐싱 λΉ„ν™œμ„±ν™” (μš”μ•½ μ‹œ)
  • --vad-aggressive: Aggressive VAD μ‚¬μš© (λΉ λ₯Έ 전사, 짧은 무음 포함 κ°€λŠ₯)
  • --force-librosa: librosa μ²­ν‚Ή κ°•μ œ μ‚¬μš© (ffmpeg λΉ„ν™œμ„±ν™”)
  • --verbose, -v: 상세 둜그 좜λ ₯

좜λ ₯ 파일

κΈ°λ³Έ μ‹€ν–‰ μ‹œ transcript.txt ν•˜λ‚˜λ§Œ μƒμ„±λ©λ‹ˆλ‹€. λ‚˜λ¨Έμ§€λŠ” μ˜΅μ…˜μœΌλ‘œ μ„ νƒμ μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.

output/
β”œβ”€β”€ transcript.txt                    # μ˜μƒ 정보 + 전사 ν…μŠ€νŠΈ (항상 생성)
β”œβ”€β”€ transcript_with_timestamps.txt    # νƒ€μž„μŠ€νƒ¬ν”„ 포함 전사 (--timestamps)
β”œβ”€β”€ transcript.json                   # JSON ν˜•μ‹ 데이터 (--json λ˜λŠ” --summarize)
β”œβ”€β”€ metadata.json                     # μ˜μƒ 메타데이터 (--metadata)
└── summary.txt                       # AI μš”μ•½ (--summarize)

transcript.txtμ—λŠ” μ˜μƒ 제λͺ©, URL, μ—…λ‘œλ”, μž¬μƒ μ‹œκ°„μ΄ ν—€λ”λ‘œ ν¬ν•¨λ©λ‹ˆλ‹€.


μ˜ˆμ‹œ

1. ν•œκ΅­μ–΄ κ°•μ˜ 전사 및 μš”μ•½

ytt "https://youtube.com/watch?v=lecture123" ./lectures/ai-basics \
    --summarize \
    --model-size medium \
    --language ko

2. μ˜μ–΄ 팟캐슀트 전사 (λͺ¨λ“  파일 μ €μž₯)

ytt "https://youtube.com/watch?v=podcast456" ./podcasts/ep01 \
    -m tiny \
    -l en \
    --timestamps --json --metadata

3. 배치 처리 슀크립트

#!/bin/bash
# process-videos.sh

while IFS= read -r url; do
  timestamp=$(date +%Y%m%d_%H%M%S)
  ytt "$url" "./batch/$timestamp" --summarize -v
  echo "βœ“ Processed: $url"
done < urls.txt

ν…ŒμŠ€νŠΈ

# 전체 ν…ŒμŠ€νŠΈ
pytest

# 컀버리지 포함
pytest --cov=ytt

# λ‹¨μœ„ ν…ŒμŠ€νŠΈλ§Œ
pytest -m "not integration"

# 톡합 ν…ŒμŠ€νŠΈλ§Œ
pytest -m integration

λΉ„μš©

  • μŒμ„± 전사: 무료 (둜컬 처리)
  • μš”μ•½: Claude API μ‚¬μš©λŸ‰μ— 따름 (μ•½ 0.5-2 tokens per character)

처리 μ‹œκ°„

  • tiny λͺ¨λΈ: μ•½ μ‹€μ‹œκ°„μ˜ 1/10 속도
  • base λͺ¨λΈ: μ•½ μ‹€μ‹œκ°„μ˜ 1/5 속도 (ꢌμž₯)
  • medium λͺ¨λΈ: μ•½ μ‹€μ‹œκ°„μ˜ 1/3 속도
  • large λͺ¨λΈ: μ•½ μ‹€μ‹œκ°„κ³Ό λΉ„μŠ·

μ˜ˆμ‹œ: 16λΆ„ μ˜μƒ β†’ μ•½ 3-4λΆ„ (base λͺ¨λΈ, GPU μ‚¬μš© μ‹œ)


πŸš€ μ„±λŠ₯ μ΅œμ ν™” (v1.1.0+)

yttλŠ” λŒ€μš©λŸ‰ μ˜μƒ 처리λ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

1. ffmpeg 직접 μ²­ν‚Ή (μžλ™ ν™œμ„±ν™”)

효과: λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 80-90% κ°μ†Œ, μ²­ν‚Ή 속도 60λ°° ν–₯상

μž‘λ™ 방식:

  • ffmpegκ°€ μ„€μΉ˜λ˜μ–΄ 있으면 μžλ™μœΌλ‘œ μ‚¬μš©
  • μž¬μΈμ½”λ”© 없이 λ³΅μ‚¬λ§Œ μˆ˜ν–‰ (zero-copy)
  • librosa λŒ€λΉ„ λ©”λͺ¨λ¦¬ 효율 κ·ΉλŒ€ν™”

μ„€μΉ˜ 확인:

# ffmpeg μ„€μΉ˜ μ—¬λΆ€ 확인
ffmpeg -version

# macOSμ—μ„œ μ„€μΉ˜
brew install ffmpeg

# Ubuntu/Debian
sudo apt-get install ffmpeg

μˆ˜λ™ λΉ„ν™œμ„±ν™” (ν•„μš”μ‹œ):

# librosa μ²­ν‚Ή κ°•μ œ μ‚¬μš©
ytt "URL" ./output --force-librosa

2. Prompt Caching (μžλ™ ν™œμ„±ν™”)

효과: API λΉ„μš© 90% 절감 (Claude API μ‚¬μš© μ‹œ)

μž‘λ™ 방식:

  • μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈκ°€ 5λΆ„κ°„ μΊμ‹œλ¨
  • 2번째 청크뢀터 μΊμ‹œ μž¬μ‚¬μš© (토큰 λΉ„μš© 절감)
  • ν’ˆμ§ˆ μ €ν•˜ μ—†μŒ

μˆ˜λ™ λΉ„ν™œμ„±ν™” (ν•„μš”μ‹œ):

# ν”„λ‘¬ν”„νŠΈ 캐싱 λΉ„ν™œμ„±ν™”
ytt "URL" ./output --summarize --no-cache

3. Aggressive VAD (선택적)

효과: 전사 속도 20-30% ν–₯상

μž‘λ™ 방식:

  • 더 짧은 무음 κ΅¬κ°„μ—μ„œ μŠ€ν‚΅ (500ms β†’ 300ms)
  • λΉ λ₯Έ 전사, ν’ˆμ§ˆ μ €ν•˜ μ΅œμ†Œν™”

μ‚¬μš© 방법:

# Aggressive VAD ν™œμ„±ν™”
ytt "URL" ./output --vad-aggressive

μ„±λŠ₯ 벀치마크

30λΆ„ μ˜μƒ 처리 (base λͺ¨λΈ, GPU)

μ΅œμ ν™” 처리 μ‹œκ°„ λ©”λͺ¨λ¦¬ API λΉ„μš©
v1.0.x (μ΅œμ ν™” μ „) 13.9λΆ„ 800MB $0.80
v1.1.0 (μ΅œμ ν™” ν›„) 8.3λΆ„ 150MB $0.08
κ°œμ„ μœ¨ 1.7λ°° 81%↓ 90%↓

60λΆ„ μ˜μƒ 처리

μ΅œμ ν™” 처리 μ‹œκ°„ λ©”λͺ¨λ¦¬ API λΉ„μš©
v1.0.x 27.8λΆ„ 1600MB $1.60
v1.1.0 15.9λΆ„ 180MB $0.16
κ°œμ„ μœ¨ 1.7λ°° 89%↓ 90%↓

졜적 μ‚¬μš© μ˜ˆμ‹œ

# μ΅œλŒ€ μ„±λŠ₯으둜 κΈ΄ μ˜μƒ 처리
ytt "https://youtube.com/watch?v=xxx" ./output \
    --summarize \
    --vad-aggressive \
    --model-size base

# λ©”λͺ¨λ¦¬ μ œν•œ ν™˜κ²½ (ffmpeg μžλ™ μ‚¬μš©)
ytt "https://youtube.com/watch?v=xxx" ./output

# λΉ„μš© μ ˆμ•½ (캐싱 μžλ™ ν™œμ„±ν™”)
ytt "https://youtube.com/watch?v=xxx" ./output --summarize

문제 ν•΄κ²°

GPUκ°€ κ°μ§€λ˜μ§€ μ•ŠμŒ

# CUDA 확인
python -c "import torch; print('CUDA:', torch.cuda.is_available())"

# CPU κ°•μ œ μ‹€ν–‰
CUDA_VISIBLE_DEVICES="" ytt "URL" ./output

API ν‚€ 였λ₯˜

# API ν‚€ 확인
echo $ANTHROPIC_API_KEY

# ν…ŒμŠ€νŠΈ
python -c "import os; print(os.getenv('ANTHROPIC_API_KEY'))"

λ©”λͺ¨λ¦¬ λΆ€μ‘±

# 더 μž‘μ€ λͺ¨λΈ μ‚¬μš©
ytt "URL" ./output -m tiny

상세 λ¬Έμ„œ


λΌμ΄μ„ μŠ€

Apache License 2.0


κΈ°μ—¬

μ΄μŠˆμ™€ PR은 μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€!

About

YouTube Transcript Tool - AI-powered video transcription and summarization with Whisper and Claude

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors