YouTube Transcript API для видео с субтитрами и без них

Через YouTube Transcript API вы передаёте ссылку, а получаете текст, JSON, SRT или VTT. Если у видео есть подходящие субтитры, берём их. Иначе расшифровываем звук с помощью ИИ.

  • Сначала субтитры, при их отсутствии — распознавание речи
  • 1 кредит за минуту при любом источнике текста
  • Ссылки watch, youtu.be, Shorts и embed

Выберите, откуда брать текст

Одна запись по разным ссылкам
Принимаем watch, короткие ссылки youtu.be, Shorts, embed и ссылки live, с www и без него. Формат ссылки может отличаться, но видео остаётся тем же.
Субтитры автора в приоритете
При source=auto сначала ищем субтитры, загруженные автором, затем автоматические. Дорожки с автоматическим переводом не используем.
Нет субтитров? Расшифруем звук
Если подходящей дорожки нет, распознаём речь. Чтобы всегда получать новую расшифровку аудио, укажите source=stt.
Источник виден в JSON
Проверьте transcript_source: youtube_captions означает текст из субтитров, speech_to_text — расшифровку звука.
Цена не зависит от источника
За каждую начатую минуту видео нужен 1 кредит. Если транскрибация завершится с ошибкой или вы её отмените, кредиты не потратятся.

Как получить транскрипт YouTube автоматически

Создайте API-ключ в личном кабинете и отправьте ссылку через POST /v1/transcriptions со своего сервера или из скрипта. Подойдёт Python или любой HTTP-клиент. С wait=60 запрос ждёт до 60 секунд. Параметры и коды ответа описаны в документации.

Сразу сохраните ID созданной транскрибации. Если время ожидания истекло, задача продолжает работать. Проверяйте её через GET /v1/transcriptions/:id, а не создавайте заново.

Обрабатывайте статусы отдельно: queued, fetching и transcribing означают, что работа ещё идёт. При completed можно читать транскрипт, при failed нужно разобрать ошибку. Сбой сети или недоступное видео не должны превращаться в пустой текст с пометкой об успехе.

cURL
curl -X POST "https://api.transcript1.com/v1/transcriptions?wait=60" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"youtube","url":"https://youtu.be/dQw4w9WgXcQ"}'

Сохраните transcript_source вместе с текстом

В transcript_source указан источник текста, а в caption_kind — тип субтитров. Поле billed_minutes содержит длительность видео с округлением вверх до целой минуты. Схема объекта поможет разобрать остальные поля.

У субтитров автора сохраняем опубликованный текст, но времён отдельных слов нет. У автоматических субтитров YouTube есть начало каждого слова. При распознавании речи доступны начало, конец и confidence. Запрашивайте include=words, только если эти данные нужны вашему приложению.

У сегментов есть начало и конец в секундах. По ним можно открывать нужное место в плеере, привязывать заметки к записи или передавать ассистенту конкретный фрагмент. JSON ниже показывает структуру ответа, а не слова из видео в примере.

Сокращённый ответ JSON
{
  "id": "tr_8fK2Lm0PqRsTuVwXyZaBcD",
  "status": "completed",
  "transcript_source": "youtube_captions",
  "caption_kind": "auto_generated",
  "language": "en",
  "billed_minutes": 4,
  "transcript": {
    "text": "Welcome back to the channel. Today we are looking at how transcripts are made.",
    "segments": [
      { "start": 0, "end": 4.2, "speaker": null, "language": "en", "text": "Welcome back to the channel." }
    ]
  }
}

Когда выбрать субтитры, а когда распознавание речи

По умолчанию source=auto. Режим captions (только субтитры) вернёт no_captions без списания кредитов, если подходящей дорожки нет. При source=stt всегда расшифровываем звук. Подробности — в настройках source.

Выбирайте captions, если нужен именно опубликованный текст. Для новой расшифровки или определения говорящих используйте распознавание речи. При source=auto и diarize=true сразу переходим к аудио. Сочетание source=captions и diarize=true отклоним: незаметно отключать одну из опций не будем.

Язык тоже влияет на выбор субтитров. Ищем дорожку на указанном языке, а при language=auto — на языке оригинала. Автоматически переведённые дорожки не подходят. Подсказка языка для распознавания речи не переводит запись на другой язык.

Тело запроса для распознавания речи
{
  "platform": "youtube",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source": "stt"
}

Проверьте ошибку, прежде чем повторять запрос

Повтор не откроет приватное видео, не снимет возрастное ограничение и не превратит текущую трансляцию в готовую запись. При no_captions решите, подойдёт ли расшифровка звука. Если обработка ещё идёт, проверяйте существующую задачу по ID. Справочник ошибок поможет выбрать следующий шаг.

Для повторной отправки запроса после сбоя используйте Idempotency-Key. Повторное использование недавней транскрибации — отдельная настройка: должны совпасть видео и параметры. Кешированный текст всё ещё может тарифицироваться как новая задача. Чтение уже готовой транскрибации минут не расходует.

Тот же API принимает TikTok, Instagram и другие поддерживаемые ссылки. Например, YouTube, X, TikTok и Bluesky позволяют сначала искать субтитры, а затем переходить к аудио. Перед добавлением платформы сверьте допустимые сочетания опций с таблицей источников.

Попробуйте бесплатно: 60 минут на старт

Подтвердите почту и получите 60 бесплатных минут. Банковская карта не нужна.

Получить API-ключ

Частые вопросы

Остались вопросы? Напишите в поддержку

Если у видео нет субтитров, текст всё равно будет?

Да. При source=auto расшифруем звук, если подходящих субтитров нет. Если вам нужны только субтитры и такой переход не подходит, укажите source=captions.

Какие ссылки YouTube можно отправлять?

Ссылки watch, youtu.be, Shorts, embed и live. Страница канала или ссылка только на плейлист не выбирают конкретное видео: для них API вернёт 422 invalid_url.

Можно расшифровать приватное видео?

Нет. Нужен доступный публичный ролик или видео с доступом по ссылке. Приватные видео, записи с возрастным ограничением и текущие трансляции не обработаем. Если у вас есть собственный файл, загрузите его.

Сколько стоит расшифровка?

1 кредит за каждую начатую минуту видео, независимо от того, использовали мы субтитры или распознавание речи. После подтверждения почты новый аккаунт получает 60 бесплатных минут один раз. Карта не нужна.

Это Python-пакет youtube-transcript-api?

Нет. transcript1 — размещённый на сервере REST API. Из Python вы обращаетесь к нему по HTTP со своим API-ключом.