개발 가이드 · 앱 개발자

YouTube 영상 속 발화를 검색하는 엔진 만드는 법

YouTube 검색은 제목, 설명, 태그만 대상으로 합니다. 팟캐스트 400편 중 어느 회차에서 특정 게스트나 책, 아이디어가 언급됐는지, 그리고 몇 분에 나왔는지는 알려 주지 못합니다. 자막 기반 검색 엔진은 이를 해낼 수 있고, API로 가장 빠르게 만들 수 있는 유용한 제품 중 하나입니다.

추천 대상
팟캐스트 네트워크, 강의 플랫폼, 팬 커뮤니티, 사내 영상 라이브러리
개발 기간
주말
API 엔드포인트
/channels/resolve/batch/transcripts/{video_id}

해결하는 문제

대규모 영상 라이브러리는 사실상 검색이 불가능합니다. 팬들은 어렴풋이 기억나는 장면을 찾으려고 몇 시간 분량의 영상을 뒤지고, 수강생은 설명 하나를 찾으려고 강의 전체를 다시 보며, 기업은 녹화된 발표 속에 묻힌 조직의 지식을 잃어버립니다. 자막을 타임스탬프와 함께 색인하면 모든 라이브러리를 문서처럼 검색할 수 있고, 검색 결과에서 바로 해당 장면으로 이동할 수 있습니다.

첫 버전에 넣을 기능

  • 채널이나 재생목록의 모든 영상을 대상으로 한 문구 및 키워드 검색
  • 일치하는 문장과 정확한 타임스탬프 링크를 함께 보여 주는 검색 결과
  • "제품 가격을 어떻게 정하나요"로 검색해도 "요금 책정하기"를 찾아 주는 시맨틱 검색
  • 날짜, 영상, 화자별 필터
  • 새로 업로드된 영상 자동 색인

단계별 개발 방법

  1. 01

    영상 목록 수집

    채널 핸들이나 재생목록 URL로 /channels/resolve 또는 /playlists/resolve를 호출해 모든 영상 ID와 제목을 가져옵니다.

  2. 02

    자막 일괄 수집

    format.timestamp와 format.paragraphs를 활성화한 상태로 ID 목록을 /batch에 보냅니다. 대량 배치는 비동기로 처리되므로 /batch/{batch_id}를 폴링하거나 웹훅을 사용하세요.

  3. 03

    세그먼트 색인

    각 문단을 영상 ID, 시작 시간과 함께 저장합니다. 키워드 검색은 Postgres 전문 검색으로 충분하며, 의미 기반 검색이 필요하면 pgvector나 벡터 데이터베이스에 임베딩을 추가하세요.

  4. 04

    검색 UI 구축

    상위 결과를 주변 텍스트와 함께 반환하고, youtube.com/watch?v=ID&t=SECONDS 형식의 링크를 제공해 사용자가 정확한 장면으로 이동하게 합니다.

  5. 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 음성 인식으로 오디오를 텍스트로 변환합니다.

오늘 바로 만들어 보세요

매달 무료 크레딧 10개. 신용카드가 필요 없습니다.

YouTube 영상 속 내용 검색 엔진 만들기 | YouTubeTranscript.dev