- BrainTools - https://www.braintools.ru -

Почему Cluely и другие плохо слышат русских айтишников: разбор того, как Whisper ломается и что мы сделали с этим

фото с реального собеседования нашего клиента

фото с реального собеседования нашего клиента

В январе я купил подписки на Cluely, Final Round AI и Sensei. Хотел посмотреть как они справляются с русским айти-собесами, раз уж все три заявляют о поддержке русского. Подключил по очереди к тестовому звонку в Телемосте (сомневаюсь, что платформа имела роль, но все же), прогнал одну и ту же запись: Senior Python backend разработчик, 45 минут, стек FastAPI + PostgreSQL + Kafka + Kubernetes. Обычный русский спикер, если важно – из Москвы, с речью проблем не было, нормальный микрофон

Все три выдали транскрипт и все три провалились, как неожиданно..

“Кафка” в половине случаев становилась “как-то” или “кофта”. “Кубернетис” превращался в “губер нет тест”. “Сабскрайбер патерн” – в “саб скрайп патерн”. “Middleware для CSRF” – “мидл-вер для си эс эр эф” – это еще норм

Проблема не в том, что человек говорил по-русски, и не в том, что Whisper не умеет русский (сноска: хорошо не умеет). Whisper умеет русский нормально, около 9.8% WER на Common Voice. Проблема в другом: русскоязычный айтишник не говорит ни на чистом русском, ни на чистом английском. Он говорит на гибриде: русская грамматика плюс английские термины плюс своеобразное произношение этих терминов плюс местами свой жаргон вроде “гошечки” и “крудошлёпа”

Этот гибрид ни один из популярных STT не держит. Потому что его в тренировочных данных почти нет

Разбираю ниже, как устроена эта проблема, что с ней делают конкуренты (почти ничего), и что сделали мы в JobPath

Как устроена речевая часть в ассистентах для собеседований

Архитектурно у всех продуктов в нише одно и то же:

  1. Перехват аудио с системного output (чтобы слышать интервьюера через Zoom/Мит/Телемост) плюс опционально с микрофона кандидата

  2. Speech-to-text в реальном времени. Аудио превращается в транскрипт

  3. LLM. Транскрипт плюс контекст (резюме, стек, прошлые ответы) уходит в модель, обратно приходит ответ

  4. Вывод на экран так, чтобы не попасть в демонстрацию экрана интервьюеру

Интересное с точки зрения [1] распознавания речи происходит на втором шаге: если 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, и на пятисотой ошибке [2] делаю 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 часов на обучение [3]

Почему Cluely и другие плохо слышат русских айтишников: разбор того, как Whisper ломается и что мы сделали с этим - 3

Поверх 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 [4]. Для российского пользователя это значит, что аудио собеседований хранится в США и при утечке попадает в публичный доступ вместе с транскриптами. JobPath хранит аудио локально на устройстве пользователя. На сервер уходят только транскрипты (кстати, собираемся криптовать эти данные)

Где у нас всё ещё плохо

Не хочу создать впечатление [5], что 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)

  • Память [6]: 3.2 ГБ GPU VRAM с LoRA, 6+ ГБ без

  • Полное время от конца фразы интервьюера до первого токена ответа в UI: примерно 1.5 секунды

Почему Cluely и другие плохо слышат русских айтишников: разбор того, как Whisper ломается и что мы сделали с этим - 4

Что дальше

Работаем над тремя направлениями:

Региональные адаптеры для акцентов стран СНГ. Казахский и узбекский на русском это значительная часть нашей аудитории, и сейчас мы с ними работаем хуже чем могли бы

Украинский и другие языки СНГ как первоклассная поддержка, а не через английский режим Whisper

Снижение латенси, пробуем distil-whisper с нашим LoRA адаптером, цель 150-200 мс вместо текущих 400

Если кто-то работает над похожими задачами, особенно интересно обменяться опытом [7] по code-switching и по сбору корпуса технической речи не на английском. Пишите в комментариях (!)

Сам продукт JobPath [8]. Бесплатный тариф включает 15 минут ассистента в день, можно попробовать и проверить, о чем я говорю :)

Автор: billiedark

Источник [9]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/29226

URLs in this post:

[1] зрения: http://www.braintools.ru/article/6238

[2] ошибке: http://www.braintools.ru/article/4192

[3] обучение: http://www.braintools.ru/article/5125

[4] в разборе на medium: https://medium.com/@ann_p/cluely-leaked-my-data-so-here-are-the-best-alternatives-0fcc81fa433a

[5] впечатление: http://www.braintools.ru/article/2012

[6] Память: http://www.braintools.ru/article/4140

[7] опытом: http://www.braintools.ru/article/6952

[8] JobPath: https://jobpath.world/

[9] Источник: https://habr.com/ru/articles/1026778/?utm_campaign=1026778&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100