Перейти к содержанию
Публикация AiManual

ASR для низкоресурсного языка: как LoRA за полтора часа и настройка декодера улучшили распознавание крымскотатарского

Крымскотатарский почти отсутствует в данных Whisper. LoRA r=32 за 1 час 30 минут на ноутбучной RTX 5090 и подбор декодера снизили WER с 0.3463 до 0.1701. Разбир

Коротко

Что будет в материале

  1. 01

    Задача: распознавание крымскотатарского языка на базе Whisper large-v3

  2. 02

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

  3. 03

    Как построить честный холд-аут для низкоресурсного ASR

  4. 04

    Метрики: WER, CER и folded CER, что они показывают и как агрегировать

Задача: распознавание крымскотатарского языка на базе Whisper large-v3

Крымскотатарский (crh) почти не представлен в обучающих данных Whisper, и по цифрам это видно сразу. Отправной точкой эксперимента стала whisper-large-v3, которую до этого уже дотюнили под crh: на отложенном тесте она дала WER 0.3463, CER 0.1188 и CER folded 0.1070. Грубо говоря, около трети слов требуют правки при выравнивании с эталоном.

Дальше два шага меняют картину. LoRA-адаптер ранга 32 на проекциях внимания обучается 1 час 30 минут на ноутбучной RTX 5090 при пиковом потреблении около 10.4 ГБ VRAM и снижает WER до 0.2010. Подбор параметров декодирования без единого изменённого веса доводит результат до 0.1701 WER, 0.0702 CER и 0.0658 CER folded. Итог по WER лучше базового примерно вдвое, причём последняя треть улучшения не стоила ни одной секунды обучения.

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

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

LoRA не переписывает веса модели. К выбранным проекциям внимания пристраиваются небольшие обучаемые матрицы низкого ранга, а базовая сеть остаётся замороженной: учится только надстройка. В этом эксперименте ранг равен 32, и такой бюджет уложил дообучение whisper-large-v3 в ноутбук.

Конкретика по железу выглядит так: 1 час 30 минут на ноутбучной RTX 5090, пик около 10.4 ГБ VRAM. Полный файнтюн модели такого размера требует заметно больше памяти и времени, поэтому на одной потребительской карте сценарий редко выглядит разумным. Для домашней или небольшой рабочей станции LoRA здесь единственный практичный путь.

Границы метода тоже стоит назвать прямо. LoRA даёт меньший прирост, чем полный файнтюн, если данных много или домен сильно расходится с предобучением; здесь корпус маленький, 15.54 ч, и этого хватило. Точные конфиги обучения (learning rate, расписание) автор не раскрывает, поэтому повторить шаг за шагом по статье не получится. Воспроизводится подход и порядок проверок, а гиперпараметры придётся подбирать заново на своём материале.

Как построить честный холд-аут для низкоресурсного ASR

Случайный сплит по клипам в такой задаче не работает. Соседние клипы относятся к одной сессии записи, одному диктору и одному микрофону, а выравниватель, которым нарезан корпус, регулярно рубит одно предложение на два соседних клипа. Модель видит почти одинаковый контекст по обе стороны границы train/test, и метрика раздувается без всякого реального качества.

Поэтому холд-аут собрали целыми книгами: две книги, два диктора, которых нет в обучении вообще, 893 клипа общей длительностью 1.86 ч. Наборы разведены по назначению, и это ключевая часть методологии.

НаборОбъёмНазначение
train7 508 клипов / 15.54 чобучение
dev255 клипов / 0.54 ч, две короткие вещи целиком, вынутые из пулавыбор чекпоинта и конфига декодирования, прогоняется десятки раз
test893 клипа / 1.86 ч, две книги целикомфинальное решение, декодируется ровно один раз

Проверка утечек через текстовые 6-граммы

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

Оговорка по фактам: в доступных материалах об этом эксперименте нет подтверждения, что проверку 6-граммами проводили. Автор описывает разделение наборов по книгам и фиксацию правила выбора чекпоинта, а результаты проверки на пересечение n-грамм не приводит. Воспринимайте этот шаг как полезную практику для собственного пайплайна, а не как подтверждённую деталь разбора.

Фиксация правила выбора чекпоинта до просмотра теста

Правило выбора победителя задали заранее: минимальный dev WER. То есть конфигурация, которая пойдёт в финал, определяется на dev-наборе, а test декодируется ровно один раз на решение. Без такого правила тест незаметно превращается в ещё один dev: вы перебираете варианты, смотрите на тестовые цифры и выбираете лучшие из них. При многократном прогоне теста выбирается не лучшая модель, а самая удачливая, и это самая частая причина завышенных отчётов.

Метрики: WER, CER и folded CER, что они показывают и как агрегировать

WER считает правки на уровне слов: замены, удаления и вставки делятся на число слов в эталоне. CER делает то же самое на уровне символов. Крымскотатарские латинские буквы ğ ı ñ ö ş ü ç â считаются различимыми, поэтому пропущенная диакритика идёт в ошибки, даже если слово узнано верно.

Именно для этого рядом печатается folded CER со свёрнутыми диакритиками. Он разводит два разных провала: «услышала не то слово» и «услышала нужное слово, но потеряла диакритику». Разрыв между CER 0.0938 и CER folded 0.0888 после LoRA показывает, какая доля ошибок связана только с диакритикой.

Агрегация корпусная: сумма правок делится на сумму эталонных единиц, а не усредняется по клипам. Среднее по клипам даёт коротким фразам тот же вес, что и длинным, и метрика начинает зависеть от того, как нарезан корпус. Нормализация текста взята из TTS-лестницы того же проекта, чтобы цифры двух экспериментов стояли на одном фундаменте.

Отдельно стоит помнить, что WER сам по себе мало о чём говорит: значение зависит от домена, дикторов и правил нормализации. История с Open ASR Leaderboard, куда добавили Hindi и Indian English, хорошо показывает, зачем для честного сравнения моделей нужны метаданные, публичные и приватные сплиты и отдельные метрики вроде Orthographically-Informed Word Error Rate.

Результаты дообучения: LoRA снижает WER с 0.3463 до 0.2010

Все три конфигурации оценивались на одном и том же отложенном тесте, одним и тем же скорингом: 893 клипа, 1.86 ч, два диктора, которых модель не слышала.

КонфигурацияWERCERCER folded
Базовая модель (whisper-large-v3, ранее дотюненная под crh)0.34630.11880.1070
+ LoRA, 1 ч 30 м на ноутбучной RTX 50900.20100.09380.0888
+ подбор параметров декодирования, ноль изменённых весов0.17010.07020.0658

Один адаптер убрал примерно 42% ошибок относительно базы. Но 0.2010 WER это всё ещё каждое пятое слово с правкой: для продакшена без дополнительной постобработки такого уровня мало. Цифры взяты из публикации автора на Хабре, где приведены те же таблицы.

Соотношение усилий здесь показательное: за 1.5 часа обучения получен основной прирост, а ещё около 0.03 WER снято настройкой генерации, которая не требует ни GPU, ни часов счёта. Декодер в этом разборе сделал примерно половину финального результата.

Настройка декодирования без изменения весов: beam search 4 и no_repeat_ngram_size 5

После LoRA менялись только параметры генерации. Beam search 4 держит на каждом шаге четыре гипотезы вместо одной при жадном декодировании и выбирает лучшую по суммарной вероятности. no_repeat_ngram_size со значением 5 запрещает модели выдавать 5-грамм, который уже встречался в этой же гипотезе. Подбор шёл на dev-наборе, тест декодировался один раз, веса не менялись ни на один параметр.

Итог: WER 0.1701, CER 0.0702, CER folded 0.0658. Практический вывод простой: если обучение уже сделано, но генерация стоит на жадном декодировании, настройки декодера стоит перебрать до того, как собирать новый корпус.

Почему no_repeat_ngram_size вредит на повторах в агглютинативном языке

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

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

Сравнение с wav2vec2 и единый харнесс для seq2seq и CTC

Whisper это seq2seq-модель, wav2vec2 работает через CTC. Сравнивать их цифры напрямую рискованно из-за разных путей нормализации и подсчёта, поэтому в эксперименте харнесс сделали один: обе архитектуры идут через один и тот же путь скоринга и попадают в одну таблицу.

Нормализация при этом не переизобреталась, её взяли из TTS-лестницы того же проекта. Так цифры двух экспериментов стоят на одном фундаменте, а разница отражает модели, а не различия в правилах подсчёта. Оговорка: общий харнесс уравнивает правила оценки, но не отменяет разницы между архитектурами в требованиях к данным и стоимости обучения.

Ограничения эксперимента и что осталось за кадром

Автор прямо перечисляет, чего не раскрывает: конкретные источники аудио, договорённости с правообладателями, внутренние скрипты, промпты и точные конфиги обучения (learning rate, расписание). Полная воспроизводимость результатов поэтому недостижима: повторить можно метод и порядок проверок, но не сборку датасета.

Второе ограничение это обобщаемость. Все цифры получены на одном холд-ауте из двух книг и двух незнакомых дикторов: 893 клипа, 1.86 ч. Другой домен, другая манера чтения, спонтанная речь вместо начитанного текста дадут заметно другой WER, и переносить 0.1701 на произвольную задачу нельзя.

Третье: даже 0.1701 WER с оговорками годится для языка, которого Whisper почти не знает, но это не продакшен-уровень из коробки. Для реальных сценариев обычно нужен больший корпус, проверка именно на своём домене и, возможно, другая архитектура или дополнительная постобработка.

Практические выводы: что делать, если у вас низкоресурсный язык

  1. Соберите холд-аут целыми записями и незнакомыми дикторами. Случайный сплит по клипам в нарезанном корпусе почти гарантированно даёт утечку через соседние фрагменты одного предложения.
  2. Проверьте пересечение текстов train и test через n-граммы. Совпадающий фрагмент означает, что модель могла видеть его при обучении, и метрика перестаёт что-либо значить.
  3. Зафиксируйте правило выбора чекпоинта до просмотра теста, например минимальный dev WER, и декодируйте тест один раз на решение.
  4. Начните с LoRA ранга 32 на проекциях внимания. Это 1.5 часа и около 10.4 ГБ VRAM на ноутбучной RTX 5090, полный файнтюн для первой итерации не нужен.
  5. Переберите параметры декодирования на dev. Beam search 4 и no_repeat_ngram_size 5 дали в этом разборе около 0.03 WER бесплатно, но значение no_repeat_ngram_size проверяйте на своей морфологии.
  6. Считайте WER, CER и folded CER вместе с корпусной агрегацией. Folded CER показывает, сколько ошибок приходится только на диакритику.
  7. Планируйте время на построение честного теста и анализ метрик: обучение занимает полтора часа, а основная работа уходит на то, чтобы этим цифрам можно было верить.

Если хочется отслеживать новые подходы к ASR и оценке моделей без информационного шума, полезно начать с обзора Daily Papers на Hugging Face: оттуда удобно переходить к моделям, датасетам и лидербордам.

Подписаться на канал