В январе я купил подписки на Cluely, Final Round AI и Sensei. Хотел посмотреть как они справляются с русским айти-собесами, раз уж все три заявляют о поддержке русского. Подключил по очереди к тестовому звонку в Телемосте (сомневаюсь, что платформа имела роль, но все же), прогнал одну и ту же запись: Senior Python backend разработчик, 45 минут, стек FastAPI + PostgreSQL + Kafka + Kubernetes. Обычный русский спикер, если важно – из Москвы, с речью проблем не было, нормальный микрофон
Все три выдали транскрипт и все три провалились, как неожиданно..
“Кафка” в половине случаев становилась “как-то” или “кофта”. “Кубернетис” превращался в “губер нет тест”. “Сабскрайбер патерн” – в “саб скрайп патерн”. “Middleware для CSRF” – “мидл-вер для си эс эр эф” – это еще норм
Проблема не в том, что человек говорил по-русски, и не в том, что Whisper не умеет русский (сноска: хорошо не умеет). Whisper умеет русский нормально, около 9.8% WER на Common Voice. Проблема в другом: русскоязычный айтишник не говорит ни на чистом русском, ни на чистом английском. Он говорит на гибриде: русская грамматика плюс английские термины плюс своеобразное произношение этих терминов плюс местами свой жаргон вроде “гошечки” и “крудошлёпа”
Этот гибрид ни один из популярных STT не держит. Потому что его в тренировочных данных почти нет
Разбираю ниже, как устроена эта проблема, что с ней делают конкуренты (почти ничего), и что сделали мы в JobPath
Как устроена речевая часть в ассистентах для собеседований
Архитектурно у всех продуктов в нише одно и то же:
-
Перехват аудио с системного output (чтобы слышать интервьюера через Zoom/Мит/Телемост) плюс опционально с микрофона кандидата
-
Speech-to-text в реальном времени. Аудио превращается в транскрипт
-
LLM. Транскрипт плюс контекст (резюме, стек, прошлые ответы) уходит в модель, обратно приходит ответ
-
Вывод на экран так, чтобы не попасть в демонстрацию экрана интервьюеру
Интересное с точки зрения распознавания речи происходит на втором шаге: если STT услышал не то, дальше никакой промпт-инженерией не починить: LLM получает “кофта” и генерирует либо ответ про одежду, либо галлюцинацию (пытаясь пофиксить эту проблему системным промптом)
Под капотом у конкурентов на STT три основных варианта:
Whisper (OpenAI, open-source) или его форки. По анализу опенсорсных аналогов Cluely и по ошибкам, которые я наблюдаю в транскриптах, с большой вероятностью это Whisper large-v3. Sensei выдаёт похожие паттерны ошибок. Parakeet по имени намекает на NVIDIA NeMo Parakeet, но я не смог подтвердить это по опенсорс-клонам..
OpenAI Realtime API (gpt-4o-realtime). Использует проприетарный STT. Для русского работает на уровне Whisper или чуть хуже, плюс стоит сильно дороже
Коммерческие API: Deepgram, AssemblyAI, Google Cloud Speech. На русском у них хуже Whisper, кроме Google который сопоставим +-
Все эти варианты упираются в одну и ту же стену на русскоязычных IT-собеседованиях. Дальше про эту стену
Почему Whisper ломается именно на айти-речи
Whisper large-v3 обучали на миллионе часов слабо размеченных данных плюс четыре миллиона часов псевдо-разметки. Откуда эти данные, OpenAI не раскрывает, но по акустическим доменам, где модель работает хорошо, можно примерно понять состав:
-
YouTube с автосубтитрами
-
подкасты и аудиокниги
-
субтитры к фильмам
Русский в этом корпусе есть, но специфика такая, что IT-контента там десятые доли процента. То есть слово “кофта” в обучающей выборке встречается тысячи раз, а слово “Kafka” в значимом русскоязычном контексте – единицы. Когда аудио неоднозначное, модель выбирает более вероятное слово. Это и даёт “кофту” вместо “Кафки”
Дальше идёт самая тяжёлая проблема, которую я и называю code-switching. Русскоязычный айтишник в одной фразе легко переключается между языками:
“Я там сделал subscriber pattern на RabbitMQ, обернул в try-except, и на пятисотой ошибке делаю retry с exponential backoff”
В этой фразе у Whisper на каждом английском слове встаёт вопрос: это русский текст и английская вставка, или это перешли на английский? Решается через мягкий переключатель языка, который работает на длинных английских фрагментах, но на отдельных словах ошибается. “Subscriber” может стать “сабскрайбер” (кириллицей, и дальше LLM уже может не понять что это), или “собеседник”. “Retry” – “ритри” или “три” (число). “Try-except” – “трай эксепт” или “трое-детей”, и так до бесконечности..
Ещё одна большая проблема: русское произношение английских терминов. “Kubernetes” в английском [ku:bər’netis], в русском говорят [куберне́тис], ударение не там. “Nginx” по-английски [ˈendʒɪnɛks], по-русски обычно [энджи́никс] или даже [нгинкс]. “Cache” произносится как [кэш] часто с твёрдым к, без характерного английского смягчения. Whisper обучался на носителях английского, произносящих эти термины корректно. Русский вариант произношения звучит для модели как какое-то другое слово (транскрипции слов брал с вики)
И наконец, собственно технический русский жаргон. Это уже не англицизмы, а чисто русские слова из IT-субкультуры. “Гошечка” (Go), “плюсы” (C++), “жаба” (Java), “шарпы” (C#), “падать в кафку” (писать в Apache Kafka), “катать роллауты” (делать rollout в production), “переливать в прод”, “крудошлёп”. Этих слов в тренировочных данных Whisper в IT-контексте нет совсем. “Гошечка” модель распознаёт либо как “хорошо”, либо как “горшочек”, либо вообще никак..
Если сложить всё вместе: модель должна одновременно понимать русскую речь, корректно распознавать английские термины с русским произношением, не путаться в code-switching и знать айти жаргон. Стандартный Whisper ни одно из четырёх не умеет на уровне, нужном для продакшен-ассистента
Реальные цифры
Чтобы не быть голословным, я собрал тестовый корпус для замеров. Критерий один: такой контент, с которым ассистент должен работать в бою
Что в корпусе:
-
200 минут аудио с настоящих IT-собеседований, собранных с согласия участников
-
пять спикеров, разные регионы (Москва, Питер, Минск, Екатеринбург, Новосибирск), но без сильных акцентов
-
разные стеки: Python, Go, Java, JavaScript, немного C++
-
ручная расшифровка всего как ground truth
Прогнал три системы и получил такой расклад:
|
Модель |
WER на общей речи |
WER на технических терминах |
WER на командах/коде надиктованном |
|---|---|---|---|
|
Whisper large-v3 (vanilla) |
~8% |
~34% |
~52% |
|
whisper-large-v3-russian (Antony66, fine-tune на Common Voice RU) |
~6% |
~29% |
~48% |
|
JobPath (наш fine-tune) |
~4% |
~7% |
~11% |
Общая речь у всех трёх работает прилично. Но на технических терминах разрыв колоссальный: каждое третье слово неправильно у конкурентов против одного из пятнадцати у нас
Что такое “технические термины” в этом замере: названия фреймворков, библиотек, инструментов, протоколов. То есть именно то, что интервьюер спрашивает каждые 30 секунд. Каждое третье такое слово неправильно это сломанный продукт
Как выглядят ошибки в живую
Один и тот же 30-секундный фрагмент аудио через три разных системы. Интервьюер спрашивает про работу с базами данных.
Оригинал (ручная расшифровка):
“Расскажите, как бы вы решали проблему лишних запросов к базе при использовании ORM. Что такое N+1 проблема, как её избегают в SQLAlchemy и в Django?”
Cluely:
“Расскажите, как бы вы решали проблему лишних запросов к базе при использовании о-эр-эм. Что такое эн плюс один проблема, как её избегают в эс-кью-эль-алкемия и в данже?”
Sensei Copilot:
“Расскажите, как бы вы решали проблему лишних запросов к базе при использовании oRm. Что такое н плюс 1 проблема, как её избегают в sqlachemi и в Django?”
JobPath:
“Расскажите как бы вы решали проблему лишних запросов к базе при использовании ORM. Что такое N+1 проблема. Как её избегают в SQLAlchemy и в Django?”
Разница выглядит косметической. На самом деле нет. Когда этот транскрипт уходит в LLM, результат получается совершенно разный, потому что она не понимает контекст
Что конкретно сделали в JobPath
Наш STT это fine-tune Whisper large-v3 на внутреннем корпусе русскоязычных IT-собеседований. Корпус собирали примерно полтора месяца. Часть через явное согласие пользователей на платформе (опция “улучшить распознавание”, с прозрачным описанием что происходит с аудио). Часть через записи интервью коллег и знакомых с их согласием. Часть через публично доступные записи IT-интервью на YouTube (каналы типа “Айти Борода”, “Хабр”, записи митапов) с ручной разметкой.
Объём получился около 30 ГБ очищенного аудио с выверенной разметкой.
Fine-tune делали через LoRA-адаптер. Full fine-tune на large-v3 требует 8+ H100 на несколько дней, таких ресурсов у нас нет:
-
Target modules: q_proj, k_proj, v_proj, out_proj в attention-слоях decoder’а
-
Rank: 32
-
Alpha: 64
-
Dropout: 0.05
-
Learning rate: 1e-4, cosine schedule
-
Batch size 8 с gradient accumulation 4 (effective 32)
-
3 эпохи (дальше шло переобучение)
-
Железо: 2x A100 80GB, примерно 18 часов на обучение

Поверх fine-tune стоит постпроцессинг из трёх слоёв:
Технический словарь терминов с их вариантами русского произношения. Около 4000 элементов. Если Whisper выдал слово, фонетически близкое к известному термину (сравниваем по метафону и двойному метафону), заменяем на канонический вариант. “Куберне́тис” становится “Kubernetes”, “сабскрайбер” становится “subscriber”. Работает детерминированно, задержек не добавляет
Контекст сессии. Когда пользователь в настройках указал свой стек (например, Python + Django + PostgreSQL), этот контекст автоматически подмешивается в initial_prompt при запуске Whisper. Whisper это учитывает при выборе между похожими словами и начинает предпочитать термины из указанного стека
ЛЛМ-постпроцессинг для неуверенных сегментов. Если confidence score транскрипта ниже порога (это бывает редко, примерно в 3-5% сегментов), прогоняем через лёгкую LLM с промптом “исправь только технические ошибки распознавания, смысл не меняй”. Добавляет 200-400 мс задержки, поэтому применяется только когда нужно
Почему зарубежные конкуренты это не делают
У Cluely, Sensei, Sensei, Parakeet в TAM (Total Addressable Market) Россия и СНГ оптимистично 2-3 процента. У них огромные англоязычные рынки: США, Индия, Европа. Инвестировать в fine-tune под русский IT-жаргон это несколько сотен часов инженерного времени плюс инфраструктура для обучения плюс постоянная поддержка модели с обновлениями. Окупится если они получат значимую долю русского рынка, а этого не случится без локализации маркетинга, поддержки, сайта, оплаты и всего остального, чем они заниматься не планируют
Вторая проблема у них посерьёзнее инженерной. Чтобы собрать русскоязычный корпус IT-собеседований, нужна юзер-база в России, которая согласится отдать аудио своих собеседований. У Cluely этой базы нет. JobPath эту базу собирает сам через платформу, у нас пользователи русскоязычные по определению (только с согласия, личного. У всех подряд мы ничего не собираем (!!))
Итого: ни один зарубежный ассистент собеседований не будет нормально работать с русской IT-речью в обозримом будущем. Это не инженерная проблема, а экономическая. Они не упираются в невозможность сделать, они упираются в бессмысленность делать это для себя.
Отдельно про Cluely добавлю один факт, который напрямую не про STT, но для российских пользователей важный. В 2025 году у Cluely произошла утечка данных пользователей, включая записи собеседований. Подробности есть в разборе на medium. Для российского пользователя это значит, что аудио собеседований хранится в США и при утечке попадает в публичный доступ вместе с транскриптами. JobPath хранит аудио локально на устройстве пользователя. На сервер уходят только транскрипты (кстати, собираемся криптовать эти данные)
Где у нас всё ещё плохо
Не хочу создать впечатление, что fine-tune это серебряная пуля. Он даёт огромный буст на том, под что обучался, и не даёт буста на том, под что нет
Сильные региональные акценты: казахский, узбекский, грузинский, армянский на русской речи. Наш корпус оптимизирован под стандартный московско-питерский вариант, и на акцентах WER всё ещё 15-20% на технических терминах. Планируем добавить региональные adapter’ы, но пока это в планах
Плохой микрофон. Встроенный в старый ноутбук, или через bluetooth-наушники 2014 года, или когда человек далеко от микрофона. Физику не обмануть, у всех систем в таких условиях WER улетает за 20%, и у нас, увы..
Надиктованный код. Интервьюер читает вслух длинное имя класса или метода: AbstractSingletonProxyFactoryBean, buildUserPreferencesRepositoryImpl. Всё плохо у всех, включая нас. К счастью, такой формат вопроса редкий, но если встречается, единственный рабочий вариант это когда пользователь руками вводит код в интерфейсе..
Цифры для тех, кто гонится за метриками
Если вам интересны ещё какие-то характеристики стека:
-
WER на техническом русском: 6-7% у нас, 29-34% у конкурентов
-
Latency STT: около 400 мс от конца фразы до готового транскрипта (Whisper large-v3 с LoRA на RTX 3060)
-
Память: 3.2 ГБ GPU VRAM с LoRA, 6+ ГБ без
-
Полное время от конца фразы интервьюера до первого токена ответа в UI: примерно 1.5 секунды

Что дальше
Работаем над тремя направлениями:
Региональные адаптеры для акцентов стран СНГ. Казахский и узбекский на русском это значительная часть нашей аудитории, и сейчас мы с ними работаем хуже чем могли бы
Украинский и другие языки СНГ как первоклассная поддержка, а не через английский режим Whisper
Снижение латенси, пробуем distil-whisper с нашим LoRA адаптером, цель 150-200 мс вместо текущих 400
Если кто-то работает над похожими задачами, особенно интересно обменяться опытом по code-switching и по сбору корпуса технической речи не на английском. Пишите в комментариях (!)
Сам продукт JobPath. Бесплатный тариф включает 15 минут ассистента в день, можно попробовать и проверить, о чем я говорю :)
Автор: billiedark


