← Блог

Субтитры

Как сделать субтитры к видео автоматически: SRT и VTT через API

Субтитры давно перестали быть чем-то необязательным. До 85% роликов в соцсетях смотрят с выключенным звуком – в метро, на совещании, ночью в постели. Если в вашем видео нет текстовой дорожки, вы просто теряете эту аудиторию: человек пролистывает ролик за три секунды и уходит к конкуренту. В этом гайде я покажу, как делать субтитры автоматически – через распознавание речи по API, с таймкодами и экспортом в SRT или VTT, без часов ручной работы.

Почему субтитры – это «надо», а не «хочется»

Первый аргумент – просмотр без звука. Это главный канал потребления короткого видео: пользователь листает ленту в общественном месте, у него нет наушников, звук выключен по умолчанию. Без субтитров ваш ролик для него немой и бесполезный, с субтитрами – полноценный контент, который досматривают до конца. Разница в досмотрах может быть двукратной.

Второй аргумент – доступность. Значительная часть аудитории имеет те или иные проблемы со слухом, и для неё субтитры – единственный способ услышать вас. Во многих странах для государственных и образовательных материалов текстовая дорожка обязательна на уровне закона.

Третий и четвёртый – поиск и вовлечённость. Текст субтитров индексируется: ролик на сайте вместе с расшифровкой начинает ловить запросы из текста. А зритель, который одновременно читает и слушает, удерживает внимание дольше. Вывод простой: если вы систематически производите видео, субтитры нужны вам в промышленном масштабе – и руками это делать нерационально.

Почему ручной способ проигрывает

Посчитаем экономику ручной расшифровки. Опытный человек тратит на расшифровку часа аудио от трёх до пяти часов – и это без синхронизации таймкодов. Разметка таймкодов добавляет ещё час-полтора. Итого сорокаминутный подкаст – почти полный рабочий день.

Дальше хуже: человек устаёт. На длинных записях с несколькими голосами, акцентами и технической лексикой растёт число ошибок – пропущенные реплики, незнакомые термины, перевирание фамилий. Всё это приходится вылавливать при вычитке, а вычитка – это снова время. Автоматическое распознавание делает тот же объём за минуты и отдаёт результат с таймкодами до отдельного слова.

И ещё одно отличие. Встроенные автокапшены видеохостингов обычно не дают файла субтитров: вы видите текст на экране, но не можете скачать SRT/VTT, отредактировать его или встроить в свой плеер. API-подход отдаёт именно файл – переносимый, редактируемый и готовый к интеграции в любой пайплайн.

Как автоматические субтитры работают «под капотом»

На вход подаётся видео или аудио, дальше происходит три вещи. Первое – извлечение звука: видеофайл содержит видеодорожку и аудиодорожку, для распознавания нужна только аудиодорожка, поэтому её вытаскивают отдельно – чаще всего в WAV или MP3. Это делается одной командой и занимает секунды.

Второе – распознавание речи. Нейросеть нарезает аудио на короткие окна, превращает каждое в спектрограмму – «картинку» распределения частот во времени – и предсказывает по ней последовательность слов. Затем языковая модель расставляет знаки препинания и выбирает осмысленные слова вместо случайных наборов звуков. На выходе – текст, разбитый на сегменты, где каждое слово привязано к своей секунде.

Третье – сборка файла субтитров: из сегментов и таймкодов формируется готовый SRT или VTT, каждая реплика получает метку начала и конца. Именно этот файл подключается к плееру или загружается на YouTube. Важный нюанс: качество итога напрямую зависит от качества аудио на входе – об этом подробнее ниже.

SRT или VTT: что выбрать

SRT (SubRip) – самый старый и универсальный формат. Это простой текстовый файл, где каждый блок состоит из номера, строки с диапазоном времени 00:00:01,000 --> 00:00:04,000 и текста реплики. SRT понимают все: видеоредакторы, YouTube, VLC, Telegram, почти любой плеер. Если не знаете, что выбрать, – берите SRT.

VTT (WebVTT) – более современный веб-ориентированный формат. Структура почти та же, но он поддерживает стили: цвет текста, позиционирование на экране, выравнивание. Это стандарт HTML5, поэтому VTT отлично подходит для собственного веб-плеера или приложения.

Практическое правило: для загрузки на видеохостинги и в редакторы – SRT; для своего веб-плеера или приложения – VTT. Оба формата строятся из одних таймкодов, поэтому переключиться между ними – вопрос одного параметра в запросе, без повторного распознавания.

Пошаговый гайд: от видео до готового файла

Понадобится любой REST-клиент или Python, а из инструментов – только ffmpeg для извлечения аудио. Шаг первый – извлекаем звук. Для русского языка оптимально конвертировать в WAV с частотой 16 кГц, моно:

bash
ffmpeg -i video.mp4 -vn -ac 1 -ar 16000 audio.wav

Разберём флаги: -vn убирает видеодорожку, -ac 1 делает один канал, -ar 16000 задаёт частоту дискретизации 16 кГц. Если видео уже с хорошим звуком, можно отправить и MP3 – API принимает wav, mp3, ogg и flac. Шаг второй – отправляем аудио на распознавание через POST /v1/transcribe. Ключ доступа передаётся в заголовке X-Api-Key – только так, не в URL:

Python
import requests

API = "https://ttsapi.ru/v1"
HEADERS = {"X-Api-Key": "rtt_…"}

with open("audio.wav", "rb") as f:
    r = requests.post(
        f"{API}/transcribe",
        headers=HEADERS,
        files={"audio": ("audio.wav", f, "audio/wav")},
        data={"language": "ru"},
    )

job_id = r.json()["job_id"]

Параметр language подсказывает модели язык записи – если язык известен, передавайте его явно, это почти всегда повышает точность. Распознавание длинных записей выполняется асинхронно: вы получаете job_id и опрашиваете статус, пока задача не завершится. Как только статус completed, забираем готовый файл субтитров:

Python
import time

while True:
    status = requests.get(f"{API}/transcribe/{job_id}", headers=HEADERS).json()
    if status["status"] in ("completed", "failed"):
        break
    time.sleep(2)

srt = requests.get(
    f"{API}/transcribe/{job_id}/subtitles",
    headers=HEADERS,
    params={"format": "srt"},
)
open("subtitles.srt", "w", encoding="utf-8").write(srt.text)

Для VTT меняем один параметр – params={"format": "vtt"}. Файл готов: его можно загрузить на YouTube, положить в Telegram-бота или прикрутить к плееру на сайте. Полный цикл для десятиминутного ролика занимает меньше минуты – вручную на это ушёл бы час-полтора.

Как сделать субтитры качественными

Качество звука решает всё. Записывайте в 16 кГц и выше, без сильной компрессии и эха. MP3 с битрейтом 64 кбит/с заметно хуже WAV или 192+ кбит/с. Один говорящий на канал и минимум фонового шума дают больше, чем любые настройки модели.

Передавайте язык явно и следите за таймкодами. Когда модель не тратит силы на определение языка, она меньше ошибается на коротких фразах. Хороший API отдаёт не только текст, но и уверенность в каждом слове – confidence: слова с низкой уверенностью стоит подсвечивать при вычитке, чтобы быстро проверять сомнительные места, а не вычитывать весь текст целиком.

Диаризацию включайте осознанно. Если в видео несколько говорящих – интервью, подкаст, созвон – включайте разметку спикеров параметром diarization=true: субтитры получатся с метками, кто говорит. На монологе она не нужна и может добавить ошибок. И не перекодируйте телефонный звук: записи из телефонии отправляйте в нативном 8 кГц моно – перекодирование не добавит качества, только раздует файл.

Частые ошибки и как их избежать

Забыть заголовок X-Api-Key или перепутать его с query-параметром. Ключ передаётся только в заголовке; в URL его подставлять нельзя – он осядет в логах прокси и истории браузера. Если ключ засветился – перевыпустите его в кабинете: старый перестанет работать мгновенно.

Опрашивать статус без паузы и отправлять видео целиком. Сотни запросов в секунду не ускорят обработку, но быстро упрутся в лимит 429 – делайте паузу между опросами или используйте webhook. А лишний гигабайт видеодорожки только раздувает загрузку: API принимает аудио, поэтому конвертируйте до отправки.

Игнорировать формат и не проверять результат. Проверяйте, что отдаёте wav, mp3, ogg или flac – экзотические контейнеры вроде m4a конвертируйте заранее. И помните: автоматика – это 95% работы, а не 100%; бегло пройдитесь по именам, аббревиатурам и терминам, десять минут вычитки сэкономят репутацию.

Что дальше

Автоматические субтитры – это процесс, который легко поставить на поток. Когда пайплайн собран, вы обрабатываете десятки роликов в день тем же усилием, что и один: извлечение аудио, распознавание, экспорт SRT/VTT – и файл уходит в плеер или на хостинг. Для видеомейкеров это значит, что каждый ролик выходит с субтитрами без дополнительных трудозатрат; для разработчиков – что субтитры становятся ещё одной функцией продукта.

Полный список эндпоинтов, лимиты и примеры запросов – смотрите документацию.

Если тема распознавания для вас в новинку, начните с базового руководства – Как распознать русскую речь в текст через API: пошаговое руководство.

Начните бесплатно

Бесплатный тариф включает 100 минут аудио в месяц – без привязки карты. Конвертируйте первое видео в субтитры уже сегодня.

Конвертировать первое видео бесплатно смотрите тарифы
← Все статьи