Задача
Заявки к нам приходят голосом, и значительная часть — на смеси двух языков в одной фразе: казахская конструкция с русскими вставками. Владелец сформулировал требование без вариантов: переключателя языка быть не должно, модель обязана определять язык сама.
До этого наши версии распознавания обучались с жёстко зашитым русским языком. На казахской речи это давало не ошибки, а бессмыслицу: приветствие «Ассалаумағалейкум» превращалось в «Ассал, Вашим», целые фразы читались как набор похожих по звучанию русских слов. Стоковая модель с полностью свободным автоопределением вела себя не лучше — на коротком телефонном аудио она уходила в корейский с уверенностью ниже случайной.
Как мерили
Замер должен быть повторяемым, иначе спорить о нём бессмысленно. Условия зафиксированы так:
- Срез: открытый корпус FLEURS, казахская часть, сплит
test, первые 200 записей — 51 минута аудио. В обучение этот сплит не входил. - Метрики: WER (доля неверных слов) и CER (доля неверных символов). Для казахского показательнее CER: язык агглютинативный, одна буква в длинном слове рушит в WER всё слово целиком.
- Нормализация: регистр и пунктуация ошибками не считаются.
- Одинаковость: один и тот же скрипт и один и тот же срез для всех сравниваемых моделей.
Замер «до»
| Модель | WER | CER | Комментарий |
|---|---|---|---|
| сток, младшая (наша база) | 73,8% | 20,8% | три слова из четырёх мимо |
| сток, средняя (втрое крупнее) | 53,4% | 12,4% | половина слов мимо |
Эти две строки — весь ответ на вопрос «а готовые модели разве не умеют казахский». Умеют настолько, что каждое второе слово неверно. Для языка с 20 миллионами носителей это ожидаемо: в обучающих данных его доля мала, и никакой промпт этого не компенсирует.
Что мы сделали
Дообучение одной модели сразу на двух языках страны. Ключевое отличие от предыдущих попыток — каждому примеру ставится свой языковой токен, а не общий русский на весь корпус.
| Параметр | Значение |
|---|---|
| База | младшая модель линии (средняя в имеющуюся видеопамять помещается только с чекпоинтингом и учится слишком долго) |
| Русский корпус | наши живые голосовые заявки: 2702 примера на обучение, 143 на валидацию |
| Казахский корпус | открытый FLEURS: 3054 примера, потолок 2800 за эпоху ради баланса примерно 50 на 50 |
| Метод | LoRA, r=16 — тот же рецепт, что раньше дал 20,9% против 29,7% у стока на русском |
| Обучение | 3 эпохи, 32 минуты, выбор лучшего чекпоинта по валидации: 0,63 → 0,46 → 0,44 |
Отдельно решался вопрос смешанной речи. Правило простое и проверенное на данных: языковой токен фразы — это доминирующий язык, русские вставки остаются внутри как есть. Модель не пытается переводить их и не спотыкается о них.
Вторая защита — от метаний детектора языка. Если детектор уверен, идёт быстрый путь; если сомневается, аудио расшифровывается обоими языками и побеждает вариант с большей фактической уверенностью модели. Живой пример, ради которого это сделано: на одном клипе детектор отдавал перевес русскому в 68% — и ошибался.
Замер «после»
| Модель | WER | CER |
|---|---|---|
| сток, младшая (база нашей версии) | 73,8% | 20,8% |
| сток, средняя (втрое крупнее) | 53,4% | 12,4% |
| наша версия (младшая, дообученная) | 49,0% | 11,3% |
Русский на нашей валидации: 28,2% → 19,9% по словам и 15,7% → 9,1% по символам. То есть одна модель теперь держит оба языка, и добавление казахского не оплачено русским.
Оговорка к русской строке. Эта валидация участвовала в выборе чекпоинта, поэтому сигнал относительный, а не независимый. Честный русский замер требует отдельной отложенной выборки — она собирается. Мы предпочитаем назвать это в тексте, а не показывать цифру как окончательную.
Проверка на реальном звонке, а не на корпусе
Открытый корпус — это начитанная студийная речь, наши клиенты говорят иначе. Поэтому итоговая проверка шла на живом клипе из очереди — том самом, со смешанной речью.
| Что проверяли | Средняя стоковая модель | Наша версия |
|---|---|---|
| Определённый язык | русский (ошибка) | казахский |
| Результат расшифровки | русская бессмыслица | казахская фраза, русская вставка сохранена внутри |
| Время на клип | 68 с | 4,8 с |
Разрыв в уверенности между языками на этом клипе стал таким, что двойная расшифровка теперь включается только на действительно спорных случаях — и каждый такой случай пишется в журнал как кандидат в обучающую выборку по смешанной речи.
Что из этого стоит взять другим
- Проверяйте язык, а не модель. «Модель поддерживает 90 языков» — это про наличие токена языка, а не про качество. Ваш язык проверяется на вашем аудио.
- Размер модели заменяется данными. Дообученная младшая модель обошла втрое более крупную. Считать «возьмём модель побольше» решением — дорого и не всегда работает.
- Смешанная речь — отдельный класс задачи. Её нельзя мерить на чистом корпусе; нужен свой срез из собственных записей, и собирается он только разметкой.
- Называйте порог применимости. Мы говорим прямо: на этой точности расшифровка идёт человеку как черновик, а не в автоматическое решение. Порог — часть результата.