해결하는 문제
대규모 영상 라이브러리는 사실상 검색이 불가능합니다. 팬들은 어렴풋이 기억나는 장면을 찾으려고 몇 시간 분량의 영상을 뒤지고, 수강생은 설명 하나를 찾으려고 강의 전체를 다시 보며, 기업은 녹화된 발표 속에 묻힌 조직의 지식을 잃어버립니다. 자막을 타임스탬프와 함께 색인하면 모든 라이브러리를 문서처럼 검색할 수 있고, 검색 결과에서 바로 해당 장면으로 이동할 수 있습니다.
첫 버전에 넣을 기능
- 채널이나 재생목록의 모든 영상을 대상으로 한 문구 및 키워드 검색
- 일치하는 문장과 정확한 타임스탬프 링크를 함께 보여 주는 검색 결과
- "제품 가격을 어떻게 정하나요"로 검색해도 "요금 책정하기"를 찾아 주는 시맨틱 검색
- 날짜, 영상, 화자별 필터
- 새로 업로드된 영상 자동 색인
단계별 개발 방법
- 01
영상 목록 수집
채널 핸들이나 재생목록 URL로 /channels/resolve 또는 /playlists/resolve를 호출해 모든 영상 ID와 제목을 가져옵니다.
- 02
자막 일괄 수집
format.timestamp와 format.paragraphs를 활성화한 상태로 ID 목록을 /batch에 보냅니다. 대량 배치는 비동기로 처리되므로 /batch/{batch_id}를 폴링하거나 웹훅을 사용하세요.
- 03
세그먼트 색인
각 문단을 영상 ID, 시작 시간과 함께 저장합니다. 키워드 검색은 Postgres 전문 검색으로 충분하며, 의미 기반 검색이 필요하면 pgvector나 벡터 데이터베이스에 임베딩을 추가하세요.
- 04
검색 UI 구축
상위 결과를 주변 텍스트와 함께 반환하고, youtube.com/watch?v=ID&t=SECONDS 형식의 링크를 제공해 사용자가 정확한 장면으로 이동하게 합니다.
- 05
최신 상태 유지
정기 작업으로 채널을 다시 조회해 새 영상 ID를 찾고, 그 영상만 자막을 추출합니다.
스타터 코드
이 아이디어는 "레시피 3: 재생목록을 지식 베이스에 일괄 적재하기" 패턴을 기반으로 합니다. 채널, 프롬프트, 저장소는 원하는 대로 바꿔 쓰세요.
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DB만들 가치가 있는 이유
시청자가 아니라 라이브러리 소유자에게 판매하세요. 팟캐스트 네트워크, 강의 플랫폼, 사내 영상 아카이브를 보유한 기업은 시청자 참여를 유지해 주는 검색 기능에 월 구독료를 기꺼이 지불합니다. 팬 커뮤니티라면 무료 공개 검색에 알림이나 API 접근을 유료 요금제로 제공하는 방식도 효과적입니다.
피해야 할 실수
- 자막 전체를 하나의 문서로 색인하기: 문단 단위 타임스탬프가 없으면 검색 결과가 쓸모없어집니다.
- 이미 처리한 영상 ID를 추적하지 않고 업데이트할 때마다 채널 전체의 자막을 다시 추출하기.
- 정확한 키워드 일치에만 의존하기: 구어는 정돈되어 있지 않으니 시맨틱 검색을 초기에 도입하세요.
이 아이디어에 대한 질문
YouTube 자막을 검색하려면 벡터 데이터베이스가 꼭 필요한가요?
아닙니다. 대부분의 라이브러리는 Postgres 전문 검색만으로도 키워드 검색을 잘 처리합니다. 정확한 단어가 아니라 의미로 일치하는 결과가 필요할 때 임베딩을 추가하세요.
검색 결과를 영상의 정확한 장면에 연결하려면 어떻게 하나요?
각 자막 세그먼트에는 초 단위 시작 시간이 포함됩니다. YouTube URL 뒤에 &t=와 그 숫자를 붙이면 됩니다.
자막이 없는 영상도 색인할 수 있나요?
네. 웹훅 URL과 함께 allow_asr를 활성화하면, 자막이 없을 때 API가 AI 음성 인식으로 오디오를 텍스트로 변환합니다.