№1 из 26 проектов в 2026. Сервис распознавания(ASR) речи с разметкой спикеров.
Как рассказывал в прошлом посте, я сделал платформу, которая позволяет мне быстро собирать новые проекты и сервисы. Я планирую сделать 26 сервисов в 2026. За прошедшую неделю собрал и отладил ASR с диаризацией, это первый проект из цикла.
Зачем?
Сервис использует внутри платформы и я сделал публичную версию с бесплатными ежедневными распознаваниями. Если вы искали подобный сервис по приемлемым ценам или вам нужно апи - пишите.
Думаю, если будет спрос, можно сделать российскую версию tl;dv. В чатах стартаперов в последнее время тема поднималась несколько раз.
Технические детали:
Начали с CPU. Первая версия работала на CPU-ноде кластера.
Классический подход: Whisper транскрибирует аудио, потом отдельно диаризация размечает спикеров. На 20-минутном файле — минута обработки. Терпимо, но качество диаризации на CPU оказалось нестабильным: эмбеддинги спикеров на CPU считались чуть иначе, и алгоритм кластеризации путал спикеров. Плюс WER (Word Error Rate) на base/small моделях был заметно выше, чем хотелось.
Перешли на GPU. И тут начались настоящие оптимизации:
Diarize-first pipeline. Вместо классического «сначала транскрибируй, потом размечай» — перевернули: сначала диаризация определяет кто когда говорит, потом Whisper транскрибирует каждый сегмент отдельно. Спикер назначается ДО транскрипции, а не после. Это убрало целый класс ошибок, когда один длинный сегмент содержал реплики двух человек.
Батчинг эмбеддингов. WeSpeaker умеет считать эмбеддинги спикеров батчами. Вместо 115 последовательных вызовов — собираем все фрагменты, паддим до одной длины и прогоняем батчем по 64. Это ускорило диаризацию в разы.
Склейка перед транскрипцией. После диаризации соседние сегменты одного спикера склеиваются в длинные фразы. Количество вызовов Whisper упало с сотен до десятков. Каждый вызов — это накладные расходы, и их сокращение дало ощутимый прирост.
BatchedInferencePipeline с clip_timestamps. Whisper обрабатывает склеенные сегменты через батчевый пайплайн, пропуская внутренний VAD (он уже не нужен — диаризация уже нарезала аудио).
Фильтр фантомных спикеров. Иногда кластеризация создаёт «лишнего» спикера из коротких шумовых фрагментов. Фильтр убирает спикеров, которые говорили менее 5% времени с короткими репликами.
Результат.
20-минутный файл с двумя спикерами обрабатывается примерно за 20 секунд. RTF (Real-Time Factor) — около 0.02. Это значит, что час аудио обрабатывается чуть больше минуты.
Где это работает лучше всего. Наш пайплайн особенно хорошо показывает себя на собеседованиях и рабочих встречах — там, где спикеры говорят длинными фразами и не перебивают друг друга каждые две секунды. Diarize-first подход даёт чистое разделение реплик, а large-v3-turbo отлично справляется с русской речью.
Что ещё есть
+ Саммари встречи через LLM - краткое содержание разговора в один клик.
+ История распознаваний с сайдбаром — все предыдущие транскрипты сохраняются локально.
+ Переименование спикеров - кликаешь на «Спикер 1» и пишешь имя.
+ Скачивание в .txt - весь транскрипт с таймкодами и именами спикеров.
+ SSE-прогресс — видишь в реальном времени, на каком этапе обработка и сколько примерно ждать.
Планы
Если будет интерес — добавлю интеграцию с Zoom/Google Meet/Телемост, автоматическую запись и транскрипцию звонков, API для разработчиков. По сути - tl;dv, но на своей инфраструктуре и с российскими ценами.
Итого
Первый проект из 26 — готов и работает. Неделя от идеи до продакшена. Платформа позволяет не тратить время на авторизацию, деплой, мониторинг и UI — сразу пишешь бизнес-логику.
Впереди ещё 25 проектов в этом году. Подписывайтесь, буду рассказывать о каждом. Ставьте лайки, если было полезно — это мотивирует писать подробнее. Планирую выложить проект на GitHub.
Telegram: @rekrutai_ru - подписывайтесь, там техническая кухня, анонсы и подробности по каждому проекту.