Реализация автоматической генерации SRT/VTT-файлов субтитров

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация автоматической генерации SRT/VTT-файлов субтитров
Простая
~1 рабочий день
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Реализация автоматической генерации SRT/VTT-файлов субтитров

SRT (SubRip Subtitle) и VTT (WebVTT) — стандартные форматы субтитров. SRT используется в видеоплеерах и при загрузке на YouTube/Vimeo. VTT — для веб-плееров HTML5 и стриминговых платформ.

Генерация SRT и VTT

from faster_whisper import WhisperModel
from datetime import timedelta

model = WhisperModel("large-v3", device="cuda")

def format_time_srt(seconds: float) -> str:
    td = timedelta(seconds=seconds)
    total_seconds = int(td.total_seconds())
    hours = total_seconds // 3600
    minutes = (total_seconds % 3600) // 60
    secs = total_seconds % 60
    milliseconds = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{milliseconds:03d}"

def format_time_vtt(seconds: float) -> str:
    # VTT использует точку вместо запятой
    return format_time_srt(seconds).replace(",", ".")

def generate_srt(audio_path: str, language: str = "ru") -> str:
    segments, _ = model.transcribe(
        audio_path, language=language, vad_filter=True
    )
    lines = []
    for i, seg in enumerate(segments, 1):
        start = format_time_srt(seg.start)
        end = format_time_srt(seg.end)
        text = seg.text.strip()
        lines.append(f"{i}\n{start} --> {end}\n{text}\n")
    return "\n".join(lines)

def generate_vtt(audio_path: str, language: str = "ru") -> str:
    segments, _ = model.transcribe(
        audio_path, language=language, vad_filter=True
    )
    lines = ["WEBVTT\n"]
    for seg in segments:
        start = format_time_vtt(seg.start)
        end = format_time_vtt(seg.end)
        text = seg.text.strip()
        lines.append(f"{start} --> {end}\n{text}\n")
    return "\n".join(lines)

VTT с расширенными возможностями

def generate_vtt_with_styling(segments, speaker_map: dict = None) -> str:
    """VTT с позиционированием и стилями"""
    lines = ["WEBVTT\n"]
    for i, seg in enumerate(segments):
        start = format_time_vtt(seg.start)
        end = format_time_vtt(seg.end)
        speaker = speaker_map.get(seg.speaker, "") if speaker_map else ""

        # Позиционирование: line:90% — внизу экрана
        position = "line:90% position:50% align:center"
        speaker_tag = f"<v {speaker}>" if speaker else ""

        lines.append(f"{i+1}\n{start} --> {end} {position}\n{speaker_tag}{seg.text.strip()}\n")
    return "\n".join(lines)

Постобработка субтитров

def optimize_subtitles(segments: list, max_line_length: int = 42,
                        max_duration: float = 7.0,
                        min_duration: float = 1.2) -> list:
    """Оптимизируем субтитры под стандарты вещания"""
    optimized = []
    for seg in segments:
        duration = seg.end - seg.start
        text = seg.text.strip()

        # Ограничиваем длину строки
        if len(text) > max_line_length:
            mid = text.rfind(" ", 0, max_line_length)
            text = text[:mid] + "\n" + text[mid+1:]

        # Минимальная длительность
        end = max(seg.end, seg.start + min_duration)
        optimized.append({**seg.__dict__, "text": text, "end": end})

    return optimized

Сроки: скрипт генерации SRT/VTT — 1 день. REST API сервис — 2–3 дня.