惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
The Register - Security
The Register - Security
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
Recorded Future
Recorded Future
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
B
Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
L
LangChain Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
月光博客
月光博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
The Last Watchdog
The Last Watchdog
P
Privacy & Cybersecurity Law Blog
有赞技术团队
有赞技术团队
G
GRAHAM CLULEY
腾讯CDC
Cyberwarzone
Cyberwarzone
爱范儿
爱范儿
I
Intezer
SecWiki News
SecWiki News

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
От MVP на Whisper до собственной ASR: как мы построили платформу субтитров для RUTUBE
dmitriy_weez · 2026-04-28 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение9 мин

Охват и читатели60

Кейс

Автоматическое создание субтитров для пользовательского контента может выглядеть довольно простой задачей: берем готовую ASR‑модель, распознаем аудио из видео и сохраняем результат.

Именно таким и был наш первый MVP в RUTUBE — сервис на базе Whisper, который позволил быстро проверить гипотезу и запустить субтитры в production. Но очень быстро стало понятно, что между «распознать речь» и «сделать субтитры для всего контента» лежит огромный пласт работы.

Миллионы новых видео, ролики длиной до 24 часов, неизвестный язык, шумный пользовательский контент, требования к качеству текста и жесткие ограничения по скорости обработки — всё это превратило задачу из простого ASR в полноценную платформу с микросервисной архитектурой и собственной системой распознавания речи.

Меня зовут Дима Лукьянов, я лид команды обработки речи и аудио в RUTUBE TECH. В этой статье расскажу, как мы прошли путь от MVP на Whisper до собственной масштабируемой платформы с пропускной способностью около 1200 видео в час на один ASR и какие инженерные решения оказались ключевыми.

Зачем вообще нужны субтитры

На первый взгляд кажется, что субтитры — это небольшая функциональность для отдельной аудитории. Но на практике всё иначе: субтитры нужны гораздо большему числу людей, чем принято думать.

Во‑первых, они критичны:

  • для пользователей с нарушениями слуха,

  • для тех, кто смотрит видео без звука (метро, офис, поездки),

  • в шумной или, наоборот, слишком тихой обстановке,

  • и для контента, где субтитры требуются по закону.

Но есть и менее очевидная, хотя куда более важная часть:

субтитры — это текстовое представление видео.

А значит, они становятся источником для целого набора сервисов:

  • автогенерации названий и описаний,

  • тегирования и классификации,

  • полнотекстового поиска по видео,

  • ускорения модерации и автоматических проверок.

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

Требования к системе

Понимая, какую роль субтитры играют в платформе и какие сервисы на них опираются, мы сформулировали набор требований к системе распознавания речи:

  • Покрытие всего пользовательского контента (UGC).
    Обрабатывать нужно всё — от вертикальных роликов до многочасовых записей стримов.

  • Высокая скорость.
    Целевой ориентир — не более 1 минуты обработки для видео продолжительностью ~15 минут.
    Это критично, если на платформе ежедневно появляются десятки тысяч новых роликов.

  • Качество распознавания.
    Мы ориентировались на WER ~0.1–0.2 в среднем по домену. Ниже — лучше, выше — уже заметно пользователю.

  • Пунктуация и капитализация.
    Это must‑have для хорошей читаемости субтитров и для поиска по тексту.

  • Масштабирование на другие языки.
    Даже если сейчас язык один, архитектура должна позволять горизонтальное расширение.

MVP: «Давайте возьмем Whisper»

Наше первое решение было максимально простым:

  • Кладем ссылку на видео в очередь Kafka.

  • Worker забирает сообщение из очереди.

  • Извлекаем аудиодорожку из видео.

  • Отправляем её в ASR на базе Whisper.

  • По полученному распознаванию формируем файл субтитров.

Архитектура MVP для субтитров

Архитектура MVP для субтитров

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

1. Производительность

Мы использовали Faster Whisper для инференса и в однопоточном режиме получили около 30 видео/час на один инстанс.

Быстрый расчет показал, что для продакшена с ~1 млн видео в день потребуется порядка 1400 инстансов. Очевидно, это не вариант.

2. Ограничения Whisper

Модель сложно адаптировать под конкретный домен из‑за особенностей архитектуры:

  • отсутствует явный alignment между аудио и текстом;

  • ошибки носят генеративный характер и могут приводить к «галлюцинациям»;

  • компоненты нельзя улучшать независимо друг от друга.

В результате качество получалось нестабильным, особенно на сложном пользовательском контенте.

3. Монолит

Весь пайплайн был реализован внутри одного сервиса, что приводило к типичным проблемам:

  • последовательная обработка;

  • неэффективное использование ресурсов;

  • отсутствие гибкости;

  • невозможность переиспользовать результаты распознавания.

В итоге: MVP работает, но не масштабируется, так как. Whisper — отличная универсальная модель, но она не предназначена для высоконагруженного доменного продакшена.

Поэтому мы приняли решение полностью переработать архитектуру. На практике оказалось, что дешевле и предсказуемее построить собственный ASR pipeline, чем пытаться масштабировать исходное решение.

Архитектура production‑платформы

В продакшене мы разделили систему на две ключевые части: Speech Worker и ASR.

Архитектура production-платформы

Архитектура production‑платформы

Speech Worker отвечает за управление задачами, интеграции с внешними сервисами и формирование финальных субтитров.

ASR занимается непосредственно распознаванием речи — превращением аудио в текст. Она состоит из двух основных компонентов:

  • ASR Backend, который выполняет предобработку и постобработку аудио, а также управляет сессиями распознавания;

  • Triton Inference Server, обеспечивающий GPU‑инференс модели.

Такое разделение позволило изолировать вычислительно тяжёлую часть (ASR) и независимо её масштабировать.

Как мы управляем задачами

В основе системы взаимодействия лежит Kafka — через неё проходят все задачи на обработку.

Обработка устроена следующим образом:

  • мы читаем сообщения из Kafka батчами;

  • каждое сообщение превращается в отдельную задачу (1 видео = 1 задача);

  • ограничиваем количество одновременно выполняемых задач;

  • при достижении лимита просто перестаём читать новые сообщения.

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

Это даёт простой и эффективный механизм масштабирования: если нужно увеличить пропускную способность, достаточно добавить новые инстансы ASR и поднять лимит параллельных задач.

Почему субтитры — это не просто текст

Субтитры часто воспринимают как обычный набор строк, но на самом деле это куда более сложная конструкция:

субтитры = текст + тайминги + читаемость

Любая ошибка заметна сразу:

  • если тайминги «плывут» — зритель теряет контекст;

  • если строки разбиты плохо — текст становится тяжёлым или даже бессмысленным.

Проблема читаемости

Неправильный перенос строки может исказить смысл, замедлить чтение, ухудшить восприятие фразы. Например:


Он в итоге принял
решение начать всё сначала

«принял решение» — это единая конструкция.


Он в итоге принял решение
начать всё сначала

Другой пример:


Мы увеличили throughput
в двадцать раз по сравнению с прошлой системой

акцент («в двадцать раз») уехал на вторую строку.


Мы увеличили throughput в двадцать раз
по сравнению с прошлой системой

Это может показаться незначительным, но именно из таких мелочей складывается пользовательский опыт.

Как мы это решали

Мы взяли за основу правила ручной верстки субтитров:

  • оптимальная длина строк,

  • корректные точки переноса слов,

  • комфортная скорость чтения,

  • время отображения текста на экране.

И построили собственный пайплайн, который включает:

  1. формирование предложений,

  2. разбиение фраз на строки,

  3. корректировка таймингов.

Пайплайн формирования субтитров

Пайплайн формирования субтитров

Ключевой элемент здесь — NLP на базе Spacy: он анализирует слова в тексте и подсказывает, когда переносить слово, а когда это нарушит смысл или ритм чтения.

В итоге субтитры выглядят так, как будто их верстал человек, а не алгоритм.

ASR: где начались настоящие сложности

Оффлайн‑распознавание аудио в пользовательских видео оказалось значительно сложнее, чем казалось на первый взгляд. На практике нам пришлось работать с четырьмя ключевыми проблемами:

  • произвольная длина аудио (от секунд до десятков часов),

  • неизвестный язык,

  • отсутствие речи в части роликов,

  • шумы и артефакты самой разной природы.

Чтобы справиться с этим, мы собрали собственный ASR‑пайплайн, который состоит из трех больших этапов: предобработка аудио, инференс акустической модели и постобработка текста.

ASR-пайплайн

ASR‑пайплайн

Предобработка

  1. Подготовка аудио.
    Экстракция аудио дорожки, ресемплинг, поддержка HLS/DASH. Всё это позволяет работать с любым входом и нормализовать сигнал.

  2. Детекция речи (На базе WebRTC VAD).
    Быстрая фильтрация тишины, музыки и нерелевантных фрагментов. Это существенно снижает нагрузку при распознавании.

  3. Детекция языка (AmberNet).
    Мы берём 5 случайных 12-секундных фрагментов, конкатенируем их и отправляем в детектор языка. Такой подход хорошо работает даже для шумных и нерегулярных данных.

  4. Обработка длинных видео.
    Мы научились читать аудио кусками до 1 часа и корректно восстанавливать временные метки. Это позволяет работать с многочасовыми видео без потери качества и в условиях ограниченной памяти.

Акустическая модель

В качестве акустической модели мы выбрали FastConformer‑L CTC с BPE‑токенайзером. Модель обучена на ~10k часов данных с онлайн‑аугментациями, которые мы разделили на два типа:

  • фоновые — длительные шумы окружения;

  • кратковременные — щелчки, хлопки, перебивки.

Все аугментации накладываются в режиме реального времени, что даёт практически бесконечное количество комбинаций «чистый сигнал + шум».

В результате — стабильное качество на UGC и заметно меньше галлюцинаций по сравнению с Whisper. Итоговые замеры качества мы проводили на специально подготовленном тестовом датасете, разбитом на категории в соответствие с категориями видео на RUTUBE.

WER на разных категориях видео

WER на разных категориях видео

Инференс

Для инференса мы используем Triton Inference Server.
Обрабатывать многочасовое аудио целиком — не вариант: это потребовало бы слишком много GPU‑памяти, причём из‑за неравномерной длины роликов большая часть этой памяти простаивала бы впустую.

Поэтому мы применили простой, но очень эффективный приём:

режем аудио на чанки по 8 секунд с перекрытием 1.6 секунды.

Это даёт два ключевых преимущества:

  • эффективный батчинг — GPU загружен равномерно, нет пустых прогонов;

  • лучший контекст — модель видит больше, чем при чистом стриминге, но без лишних вычислений.

Благодаря этому 1 час аудио обрабатывается примерно за 11 секунд, что примерно в 19 раз быстрее Whisper при сопоставимом качестве.

Постобработка

Чтобы получить качественный читаемый текст, мы используем несколько вспомогательных блоков:

  • словарь замен (нормализация доменных сущностей);

  • детектор числительных (корректировка чисел и количественных выражений);

  • KenLM как языковую модель;

  • BERT‑пунктуатор для восстановления пунктуации и капитализации.

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

Результаты

В итоге нам удалось достичь целевых метрик:

  • в среднем ~5 секунд на полную обработку видео длиной ~15 минут;

  • при параллельной обработке — порядка 1200 видео/час на один ASR.

Показатель

Время обработки, сек

Видео 15 мин

Видео 1 ч

Видео 2 ч

Экстракция аудио

1.12

3.90

7.30

Детекция речи

0.23

0.90

1.78

Детекция языка

0.95

Распознавание

2.71

11.34

20.52

Субтитры

0.08

0.28

0.66

Общее время

5.09

17.37

31.21

Что оказалось важным

По ходу работы мы сделали несколько практических выводов:

  • Стриминговый подход работает даже для оффлайн‑задач.
    Чанкование и батчинг дают выигрыш и по скорости, и по эффективности использования ресурсов.

  • Собственная модель — это необходимость.
    Публичные решения хорошо показывают себя в бенчмарках, но плохо адаптируются под конкретный домен.

  • Качество субтитров ≠ только низкий WER.
    Читаемость, переносы, пунктуация и тайминги влияют на пользовательский опыт не меньше.

  • Часть препроцессинга можно убрать.
    Если модель правильно обучена, она сама становится устойчивой к шуму и артефактам.

Вывод

На практике задача создания субтитров быстро выходит за рамки распознавания речи. Это и распределённая архитектура, и ML, и работа с текстом, и требования к UX.

Система, которая начиналась как экспериментальный MVP, сегодня обрабатывает тысячи часов пользовательского контента в день — и делает это за секундные задержки.
Это стало возможно только благодаря тому, что мы не стали рассматривать компоненты изолированно и оптимизировали весь процесс целиком.

Подписывайтесь на этот блог и канал Смотри за IT, если хотите знать больше о создании медиасервисов. Там рассказываем об инженерных тонкостях и продуктовых находках, делимся видео выступлений и кадрами из жизни команд Цифровых активов «Газпром-Медиа Холдинга» таких, как RUTUBE, PREMIER, Yappy.