Транскрипты видео для RAG и конвейеров LLM
Превращайте видео YouTube и TikTok во фрагменты, по которым LLM может искать и на которые может ссылаться: получайте сегменты с таймингом, делите по времени и сохраняйте ссылки с таймкодами.
Обновлено
Коротко: получайте транскрипт в формате JSON, а не простым текстом. Массив segments содержит время начала и конца каждой строки субтитров, поэтому можно делить по времени и сохранять начало как метаданные. Тогда каждый ответ модели может вести на точный момент в видео.
Почему сегменты с таймингом лучше простого текста#
- Ссылки на источник: фрагмент, который знает, что начинается с 754-й секунды, становится ссылкой на этот момент.
- Естественные границы: строки субтитров заканчиваются на паузах, поэтому фрагменты редко разрезают предложение пополам.
- Происхождение:
source_originпоказывает, взят ли текст у автора, из автоматических субтитров платформы или из транскрипции с помощью ИИ, аlanguageуказывает язык.
Получение и разбиение на фрагменты#
Этот код получает один транскрипт и группирует сегменты в окна примерно по минуте. Структура JSON транскрипта описана в справочнике API.
import requestsAPI = "https://www.transcriptdock.com"H = {"Authorization": "Bearer td_live_YOUR_KEY"}def transcript(url: str) -> dict:job = requests.post(f"{API}/v1/jobs", headers={**H, "Idempotency-Key": f"rag-{url}"[:128]},json={"source": {"url": url}, "mode": "captions_only"}).json()while job["status"] not in ("succeeded", "failed", "cancelled"):job = requests.get(f"{API}/v1/jobs/{job['id']}", params={"wait": 25}, headers=H).json()if job["status"] != "succeeded":raise RuntimeError(job["error"]["code"])return requests.get(f"{API}/v1/transcripts/{job['result_id']}", headers=H).json()def chunks(t: dict, seconds: float = 60.0):"""Group caption segments into windows of about `seconds`, never splitting a segment."""url = t["source"]["canonical_url"]buf, start = [], Nonefor seg in t["segments"]:if start is None:start = seg["start"]buf.append(seg["text"])if seg["end"] - start >= seconds:yield {"text": " ".join(buf), "start": start, "url": f"{url}&t={int(start)}s" if "youtube" in url else url}buf, start = [], Noneif buf:yield {"text": " ".join(buf), "start": start, "url": url}t = transcript("https://www.youtube.com/watch?v=dQw4w9WgXcQ")for c in chunks(t):print(c["start"], c["url"], c["text"][:80]) # embed c["text"], store start and url as metadata
Много видео#
- Найдите видео через поиск видео: поиск по YouTube, канал, плейлист или профиль TikTok.
- Отправьте их как пакет, и вебхук сообщит вашему модулю загрузки, когда завершится каждая задача, вместо опроса.
- Повторное чтение и экспорт транскрипта бесплатны, а отправка уже обработанной ссылки возвращает сохранённый результат, поэтому повторный запуск загрузки не стоит дважды.
Агенты, которые получают данные по запросу#
Индекс нужен не каждому конвейеру. Агент, подключённый к MCP-серверу Transcript Dock, может вызвать get_video_transcript, когда пользователь упоминает видео, и сразу передать текст в свой контекст. Для фреймворков смотрите LangChain и n8n.