В прошлой статье мы рассказывали о GigaAM — семействе открытых акустических моделей для русского языка и их дообученных вариантах под распознавание речи и эмоций. Сейчас мы представляем GigaAM-v3 — новую версию модели, которая ещё сильнее поднимает планку качества open source-моделей распознавания речи (Automatic Speech Recognition, ASR) на русском языке.

В этом посте расскажем:

  • что такое HuBERT-CTC и почему он даёт прирост качества минимум 10 % даже по сравнению с распространёнными в индустрии методами предобучения;

  • как мы превратили сырые транскрипции без пунктуации в читаемый текст с помощью GigaChat Audio;

  • как оценивали качество сразу в нескольких доменах и подключали LLM-as-a-judge поверх классического Word Error Rate;

  • и, конечно, как запустить модель у себя.

Коротко о self-supervised-обучении для речи

Грубо говоря, self-supervised learning (SSL) для аудио — это попытка обучить модель понимать структуру речевого сигнала без разметки: мы придумываем прокси-задачу и учим энкодер её решать.

Классические подходы:

  • HuBERT и BEST-RQ. Семплируем аудиозапись, извлекаем признаки, кластеризуем их (k-means или квантизация), а затем учим Transformer Encoder восстанавливать «скрытые токены» на замаскированных участках. Это аналог Masked Language Modeling из BERT, только для звука.

  • wav2vec2.0. Вместо MLM используется контрастивная задача: модель должна отличить «правильный» квантованный вектор для замаскированного сегмента от набора негативных примеров.

Эти методы хорошо работают для создания универсальных foundation-моделей. Но если наша цель — дообучение на задачу ASR, то возникает вопрос: можно ли ближе связать SSL с задачей распознавания?

HuBERT-CTC: учимся у модели распознавания речи

Идея HuBERT-CTC проста: использовать уже обученную ASR-модель как учителя на этапе предобучения.

Классический HuBERT (Рис. 1):

  1. используем SSL-энкодер (например, обученный на кластерах из спектрограмм);

  2. извлекаем признаки из промежуточных слоёв модели;

  3. кластеризуем их с помощью k-means, получая дискретные токены;

  4. учим ту же архитектуру восстанавливать эти токены на замаскированных участках.

Рис. 1. HuBERT
Рис. 1. HuBERT

Наш подход отличается исходной точкой (Рис. 2):

  • вместо универсального SSL-энкодера берём энкодер, дообученный на задаче ASR с CTC-функцией потерь;

  • извлекаем признаковые представления с последнего слоя, чтобы максимально приблизить целевые переменные к задаче распознавания речи;

  • кластеризуем по его представлениям, которые уже хорошо кодируют фонетику и семантику, важные именно для распознавания речи;

  • дальше всё как в HuBERT: маскируем фреймы и восстанавливаем токены для замаскированных участков.

Рис. 2. HuBERT-CTC
Рис. 2. HuBERT-CTC

Что это даёт на практике:

  • в probing-эксперименте (параметры энкодера заморожены, а на признаках с каждого слоя дообучается ASR-декодер; меньший WER означает более подходящее признаковое пространство для ASR-задачи) качество распознавания монотонно улучшается от нижних слоёв к верхним, в отличие от BEST-RQ, где минимальный WER часто достигается на средних слоях модели (Рис. 3);

  • финальный WER после дообучения на задаче распознавания речи снижается примерно на 10 % относительно чистого HuBERT, даже когда используем весь объём размеченных данных;

  • в low-resource-сценариях (10 %, 1 %, 0,1 % данных от всей разметки) выигрыш становится ещё более заметным (Рис. 4).

Рис. 3. HuBERT-CTC: Probing слоёв модели
Рис. 3. HuBERT-CTC: Probing слоёв модели
Рис. 4. HuBERT-CTC: Масштабирование данных
Рис. 4. HuBERT-CTC: Масштабирование данных

Интуитивное объяснение: мы дистиллируем в SSL-модель знания уже обученного ASR-энкодера, но при этом используем огромные объёмы неразмеченного аудио.

Масштабирование данных

Неразмеченные данные и очистка

В GigaAM-v2 мы предобучали модель примерно на 50 тысячах часов русской речи. В v3 мы увеличили этот объём до 700 тысяч часов.

Чтобы не обучать модель на тишине и шуме:

  • применяем Voice Activity Detection, режем длинные записи на минутные фрагменты и отбрасываем сегменты со слишком большой долей тишины;

  • экспериментировали с более «умными» фильтрами (SemDeDup, data pruning), но они почти не влияют на качество при заметных вычислительных затратах, поэтому в финальном пайплайне оставили VAD как основной фильтр.

Размеченные данные и домены

Объём размеченных данных мы увеличили примерно в два раза: до 4 000 часов, причём не просто масштабировали, а расширили разнообразие доменов:

  • сложные тексты, на которых ошибались другие модели (950 часов);

  • спонтанная разговорная речь (450 часов);

  • колл-центры и телефонные записи (350 часов);

  • речь на фоне музыки (110 часов);

  • синтезированная речь (100 часов);

  • речь с особенностями (50 часов).

При этом на открытых тестовых наборах (Golos, Common Voice, Russian LibriSpeech и др.) качество осталось на уровне GigaAM-v2, несмотря на то, что мы существенно увеличили долю сложных внутренних доменов. Именно поэтому мы показываем результаты не только на открытых данных, но и на более специфичных срезах: записи колл-центров и речь с особенностями.

От «сырого» текста к «красивому ASR»

Классический ASR выдаёт транскрипции в служебном формате:

  • всё в нижнем регистре;

  • без знаков препинания;

  • числа и символы вроде % и $ часто записываются словами, удобными для обучения, но не для чтения.

Такой текст хорошо подходит для обучения моделей, но плохо — для людей. Нам же нужен «красивый ASR», который:

  • ставит запятые и точки;

  • корректно пишет числа, проценты, валюты;

  • соблюдает регистр;

GigaChat Audio для генерации данных

Для обучения модели распознавания речи в end-to-end подходе нам необходимы аудиозаписи и соответствующие им транскрипции с пунктуацией и нормализацией. Подготовка такого параллельного корпуса представляет собой отдельную сложную задачу.

Имея в распоряжении open-source-датасеты и внутренние данные с «сырой» транскрипцией, мы восстанавливали нормализацию и пунктуацию с помощью GigaChat Audio (Рис. 5). Мы выбрали именно аудиомодальность, поскольку опора на аудиодорожку позволяет разрешать вопросительные интонации и правильнее обрабатывать паузы в речи.

Пайплайн генерации данных выглядел так:

  1. Используем аудиозапись и исходную транскрипцию из датасета для обучения.

  2. Задаём GigaChat Audio подробный промпт с инструкцией по форматированию текста. Для повышения стабильности и улучшения качества используем in-context learning: в контексте у модели находилось 10 фиксированных примеров с выполнением такой задачи в нужном нам формате.

  3. Получаем текст с пунктуацией, числами, регистром и нужными форматами.

Рис. 5. Разметка end-to-end данных с GigaChat Audio
Рис. 5. Разметка end-to-end данных с GigaChat Audio

Несмотря на подобранный промпт, у GigaChat Audio, как и любой другой генеративной модели, возможны галлюцинации. Чтобы артефакты генерации не попадали в обучение ASR-моделей, мы использовали следующие эвристики для фильтрации:

  • контролируем относительное изменение длины текста — не ожидаем, что LLM значительно увеличит длину фразы (сжать может, но тоже не слишком сильно);

  • выкидываем символы вне заранее заданного алфавита (никаких эмодзи в выводе ASR);

  • убираем весь Markdown, творчество LLM вроде (тишина) и другие артефакты;

  • проверяем согласованность: если в тексте появился символ %, то в оригинале должно быть слово «процент», для $ — «доллар» и т. д.;

  • следим за стандартными метриками различия (CER, WER).

Альтернатива: Forced Decoding

Мы также экспериментировали с Whisper Forced Decoding — когда пунктуация и другие символы добавляются непосредственно на этапе декодирования ASR-модели при форсировании референсного текста. Подробнее об этом подходе мы рассказывали на DataFest в 2024 году (запись выступления).

Преимущество этого подхода в том, что гарантированно не ухудшается WER (на этапе декодирования модель дополнительно вводит знаки пунктуации, не изменяя референсный текст).

А недостатки следующие:

  • заметно падает разнообразие и гибкость нормализации;

  • проседает финальное качество пунктуации по сравнению с применением LLM.

Мы сравнили два рассмотренных подхода на внутренних данных. В датасете присутствовала речь из разных доменов, транскрипцию и знаки пунктуации размечали с помощью асессоров.

Таблица 1. Сравнение подходов для расстановки знаков пунктуации, а также метрик качества обученных моделей. F1 — F1-score по каждому из знаков. В 1 и 2 строках приведены метрики моделей-разметчиков, в 3, 4, 5 — результаты обучения GigaAM на размеченных данных.

Нормализация

F1 (,) ↑

F1 (.) ↑

F1 (?) ↑

WER ↓

CER ↓

GigaChat Audio

Полная

84,2

85,6

74,9

18,4

10,9

Whisper Punctuator

Пунктуация

62,2

85,0

77,7

0,0

0,0

GigaAM from Whisper labels

Пунктуация

50,3

84,1

77,7

12,0

7,8

GigaAM-e2e-CTC

Полная

83,7

86,7

78,6

16,0

8,7

GigaAM-e2e-RNNT

Полная

84,5

86,7

79,8

14,2

8,8

Подход на основе GigaChat Audio значительно опережает Whisper Forced Decoding на запятых. Мы связываем это с тем, что Whisper показывает не такие высокие метрики качества распознавания на русском языке. Стоит отметить, что WER > 10 % связан не с ухудшением контента, а с его нормализацией: добавились термины на английском языке, числа и другие символы. 

Модели GigaAM-v3 и оценка качества

Для GigaAM-v3 мы сохраняем возможность использовать более быструю CTC-версию и RNN-T модель с максимальным качеством. Однако теперь каждая из них доступна и в end-to-end виде с BPE-токенизацией — всего четыре модели. Все они используют один и тот же HuBERT-CTC-энкодер (который доступен в качестве SSL-версии); различаются только данными, декодерами и функцией потерь при дообучении.

Если смотреть только на публичные наборы (Golos, Common Voice, Russian LibriSpeech и др.), то ситуация такая:

  • GigaAM-семейство уже в v2 обгоняло другие открытые модели на  русскоязычных тестах по WER;

  • GigaAM-v3 сохраняет качество на этом домене �� работает в среднем на 30 % лучше на новых.

Однако когда в игре появляется пунктуация и нормализация текстов, классический WER уже не всегда отражает реальное качество:

  • эталонная транскрипция может быть без пунктуации и в нижнем регистре;

  • наш вывод — с пунктуацией, числами, английскими терминами;

  • формально WER может стать хуже, хотя текст стал заметно удобнее для восприятия и использования в приложениях.

Поэтому для финальной оценки мы используем две группы метрик.

Word Error Rate

Считаем WER для «сырых» предсказаний ASR-модели (Таблица 2). Для end-to-end моделей применяем отдельную постобработку.

Постобработка

Для наиболее честного сравнения всех моделей требуется привести всю нормализацию в стандартный «сырой» вид. Заметим, что пунктуацию и заглавные буквы зачастую убрать достаточно легко, но с другими символами сложнее. Рассмотрим основные примеры

  • Числительные. Наиболее широкий пласт предсказаний, требующих приведения в текстовый вид. Они делятся на несколько групп

    • Простые: «1» → «один», «42» → «сорок два». Мы используем библиотеку num2words. Заметим, что даже здесь точность может теряться, когда подразумевается другой падеж, например, «их больше 42-x» → «их больше сорока двух».

    • Учёт падежей. В предыдущем примере сработает простая замена вида «2-го» → «второго», «6-я» → «шестая», «80-е» → «восьмидесятые». Частое свойство таких числительных — наличие «-» в написании. Поэтому их можно достать и прописать нужные отображения руками.

    • Специальные случаи. Конечно, примеры выше покрывают не все случаи, поэтому из остальных мы находим наиболее частые и также заменяем руками: «o2» → «о два», «4K» → «четыре ка», «00» → «ноль ноль».

  • Англицизмы. С ними универсального решения не нашлось, поэтому для них также проводим частотный анализ и заменяем все с числом вхождений во все тестовые сеты хотя бы в 10 раз: «youtube» → «ютуб», «okko» → «окко», «hd» → «аш ди» (так говорят чаще), «sms» → «смс».

  • Междометия. Наши end-to-end модели добавляют в распознавание речевые артефакты, и здесь от них нужно избавиться: «э-э-э» → «», «а-а» → «».

  • Обработка «-». Выше мы уже дважды встречались с ними, но чаще всего выгодно заменять дефис на пробел: «какие-то» → «какие то». Важно сделать эту замену после большинства других фильтров (в отличие от, например, пунктуации).

  • Привычные сокращения. Их обычно найти сложнее всего, вот несколько примеров: «кг» → «килограмм», «км» → «километров», «dj» → «диджей».

Важно отметить, что получить идеальный текст без ручной обработки каждого примера просто невозможно, поэтому end-to-end модели всегда будут в проигрыше, хотя разницу удаётся сильно сократить. Например, для Golos Crowd можно сократить WER для GigaAM-e2e-RNNT с 15,2 для наивной постобработки до 9,1.

Результаты

Таблица 2. Сравнение Word Error Rate GigaAM-v3 с другими открытыми моделями на русскоязычных доменах. Выходы end-to-end моделей проходят постобработку.

v3 CTC

v3 RNNT

e2e CTC

e2e RNNT

T-One + LM

Whisper

Golos Farfield

4,5

3,9

6,1

5,5

12,2

16,4

Golos Crowd

2,8

2,4

9,7

9,1

5,7

19,0

Russian LibriSpeech

4,7

4,4

6,4

6,4

6,2

9,4

MCV 19

1,3

0,9

3,2

3,0

5,2

5,4

Natural Speech

7,8

6,9

9,6

8,5

14,5

13,4

Disordered Speech

20,6

19,2

22,8

23,1

51,0

58,6

Callcenter

10,3 

9,5

13,3

12,6

13,5

23,1

Average

7,4

6,7

10,2

9,7

15,5

20,8

Как мы уже выяснили, постобработка работает не идеально, но только ли она влияет на просадку WER? Оказывается, это не совсем так, есть и примеры иного поведения:

  • Исправление ошибок. Как сама Audio LLM, так и ASR-ученик могут исправлять ошибки в речи. Например, фразу «как продать четыре реалов», которую GigaAM-v3-RNNT распознаёт в точности, обе LLM и GigaAM-v3-e2e-RNNT распознали «Как продать четыре реала?». Этот эффект снижается благодаря наличию в промпте LLM инструкции «Если в аудио неверно указано склонение или слово произнесено с ошибкой, то так и перенеси это в транскрипцию.», но не исчезает полностью.

  • Терминология. End-to-end модель впитывает гораздо больше информации и использует BPE, из-за чего могут страдать редкие слова. Мы заметили этот эффект на названиях городов («Невинномысску» с одной «c» или «Гетеборг» через «и»).

  • Синонимы. Изредка встречается и замена слов: «суперспособность» → «суперсила», «забронируй» → «зарезервируй».

LLM-as-a-judge

Используем независимую языковую модель Gemini 2.5 Pro, чтобы сравнивать транскрипции наших моделей и Whisper, которая обладает теми же свойствами. Модель на основе аудио и сырого текста выбирает, какая лучше, игнорируя «поверхностные» отличия форматирования.

Детали side-by-side сравнения

Чтобы сравнение было наиболее честным, мы в несколько итераций подбираем оптимальный промпт:

  • В Gemini подаются обезличенные транскрипции t1 и t2 со случайным порядком, чтобы на результат не влиял position bias.

  • Далее мы добавляем детали с учётом особенностей русского языка и выходов самого judger-а:

    • Обрабатываем специальные случаи: вариации в нормализации и капитализации; разная пунктуация при обращении к ассистенту; требуем корректности при использовании «ё».

    • Замечаем, что Gemini иногда галлюцинирует и пишет: «The second model hallucinates extra phrases and includes irrelevant timestamps». Это особенно часто происходило на одинаковых транскрипциях, поэтому учитываем в промпте: «If the transcriptions are identical, no model can be considered better» и добавляем фильтр в обработку результатов.

  • В финальной версии проводим sanity check: пробуем сравнить GigaAM-v3-RNNT и GigaAM-v3-e2e-RNNT. Как и ожидается, end-to-end побеждает в подавляющем большинстве случаев.

На Рис. 6 мы приводим результаты side-by-side сравнения Whisper-large-v3 с CTC (синий) и RNNT (красный) с версиями GigaAM-e2e.

Примеры анализа:
t1: «Уменьши яркость на веранде.»
t2: «Уменьши яркость на веранде.»
ans: «Both models provide identical, accurate transcriptions with appropriate capitalization and punctuation.\n\nVerdict [[BOTH_GOOD]]»


t1: «Фильм «1941». Покажи.»
t2: «Фильм 1941. Покажи.»
ans: «Rationale: The first model correctly adds quotation marks for the movie title. Both models incorrectly split a single phrase into two sentences.\nVerdict [[FIRST_BETTER]]»


t1: «Перевод на счет телефона 245 716 22 19 100 рублей.»
t2: «Перевод на счёт телефона 245 716 22 19 100 ₽.»
ans: «t2 correctly transcribed \"счёт\" with the letter \"ё\", which reflects the audio more accurately than t1's \"счет\".\n\nVerdict [[SECOND_BETTER]]»


t1: «Шестнадцатая серия сезона один "Настоящий детектив".»
t2: «16 серия сезона "Один настоящий детектив".»
ans: «t1 accurately transcribed the phrase, correctly identifying \"Настоящий детектив\" as a proper noun. t2 made a semantic error by incorrectly grouping the word \"один\" with the title.\n\nVerdict [[FIRST_BETTER]]»


t1: «Сбер, есть что-то интересное про Райана Гослинга?»
t2: «Бер, есть что-то интересное про Райана Готлинга?»
ans: «Rationale: The first model correctly recognized all words, including the wake word \"Сбер\" and the name \"Гослинга\". The second model misrecognized the wake word as \"Бер\" and misspelled the last name as \"Готлинга\".\nVerdict [[FIRST_BETTER]]»


t1: «Теперь я предоставляю слово тем членам Совета, которые желают выступить с заявлениями после голосования.»
t2: «Теперь я предоставляю слово тем членам совета, которые желают выступить с заявлениями после голосования.»
ans: «Rationale: Модель 1 правильно определила слово \"Совет\" как имя собственное и написала его с заглавной буквы, что более уместно в данном контексте.\n\nVerdict [[FIRST_BETTER]]»


ref: «поставь бэк ту ю селена гомез»
t1: «Поставь бак, что есть, Селена Гомес.»
t2: «Поставь Bach Te Sena Gomez.»
ans: «Rationale: Both models failed to correctly recognize the English song title. The first model transcribed it as \"бак, что есть,\" and the second as \"Bach Te,\" both of which are incorrect and nonsensical in this context.\n\nVerdict [[BOTH_BAD]]»
Рис. 6. Результаты side-by-side сравнения с Whisper для GigaAM-e2e-CTC (синий) и GigaAM-e2e-RNNT (красный)
Рис. 6. Результаты side-by-side сравнения с Whisper для GigaAM-e2e-CTC (синий) и GigaAM-e2e-RNNT (красный)

При каждом подходе к сравнению GigaAM-v3 уверенно опережает Whisper-large-v3 на русскоязычных датасетах и держит качество на уровне или выше GigaAM-v2, несмотря на усложнившийся и расширившийся по доменам датасет.

Ablations

В этом разделе мы расскажем о некоторых архитектурных решениях в финальной версии GigaAM-v3.

Увеличение размера модели

С ростом количества обучающих данных и покрытия различных доменов возникает закономерная идея увеличить размер модели. Мы рассмотрели переход от 220M к 600M для моделей третьей версии

  • GigaAM-v3-CTC и GigaAM-v3-RNNT показали примерно одинаковые улучшения на 10 % относительно 220M бейзлайна, которые вряд ли компенсируют увеличение моделей и, как следствие, замедление более чем в два раза.

  • Для end-to-end моделей мы сравнивали только RNNT-версии. По WER разница оказалась незначительной: около 5 %, однако поскольку автоматическая метрика может быть не до конца показательна, то провели дополнительное side-by-side сравнение по вышеописанным правилам: почти на всех доменах финальное качество сравнимо (Рис. 7).

Рис. 7. Результаты side-by-side сравнения с GigaAM-e2e-RNNT в размерах 220M (GigaAM-e2e-RNNT) и 600M
Рис. 7. Результаты side-by-side сравнения с GigaAM-e2e-RNNT в размерах 220M (GigaAM-e2e-RNNT) и 600M

Размер токенизатора

Для end-to-end моделей мы используем BPE-токенизацию: это попросту удобнее, поскольку размер даже посимвольного словаря уже около 150 (это русский и английский алфавиты в двух регистрах, цифры, пунктуация и другие символы). Построение словаря происходит с помощью алгоритма Unigram, остаётся только вопрос про его финальный размер. Мы анализировали значения 160, 256, 512, 1024, 2048, для удобства остановимся только на некоторых из них

  • В случае RNNT финальный WER постепенно ухудшался с общей деградацией в ~5 % при переходе от 160 до 2048 токенов в словаре. Однако для RNNT важно следить не только за качеством, но и за скоростью работы. Декодирование работает до двух раз быстрее для 1024 токенов по сравнению со 160, почти не меняясь при переходе к 2048. Поэтому мы остановились на размере словаря 1024, проверив, что качество не деградирует слишком сильно (Рис. 8).

Рис. 8. Результаты side-by-side сравнения с GigaAM-e2e-RNNT с размером токенизатора 1024 (GigaAM-e2e-RNNT) и 160
Рис. 8. Результаты side-by-side сравнения с GigaAM-e2e-RNNT с размером токенизатора 1024 (GigaAM-e2e-RNNT) и 160
  • Для GigaAM-v3-CTC ситуация проще, скорость работы изменяется незначительно. При этом деградация качества с ростом размера словаря сохраняется. Размеры 160 и 256 показали идентичные результаты, поэтому мы остановились на 256 токенах для финальной версии.

Как попробовать GigaAM-v3

Мы распространяем GigaAM под MIT-лицензией, примеры инференса и веса доступны в GitHub-репозитории GigaAM.

Установка

Требования:

  • Python ≥ 3.10;

  • установленный ffmpeg в PATH.

git clone https://github.com/salute-developers/GigaAM.git

cd GigaAM

pip install -e .

Использование

import gigaam

model = gigaam.load_model("e2e_rnnt")

text = model.transcribe("example.wav")

print(text)

Заключение

GigaAM-v3 для нас — не финальная точка, а новый базовый уровень для распознавания речи на русском языке.

В этой работе мы показали, что:

  • масштаб до сотен тысяч часов неразмеченного аудио и тысяч часов разметки даёт ощутимый выигрыш, если грамотно собрать домены и не бояться сложных сценариев — колл-центров, речи на фоне музыки, речи с особенностями;

  • LLM-синтетика (GigaChat Audio с аккуратной фильтрацией) позволяет обучить end-to-end модели, которые предсказывают человекочитаемый текст без серьёзного ущерба для классических метрик вроде WER;

  • LLM-as-a-judge помогает честнее сравнивать модели между собой, когда мы выходим за рамки «сырого» текста без пунктуации и нормализации.

Мы продолжаем открыто публиковать веса моделей — нам важно, чтобы качественный ASR на русском был доступен не только большим компаниям, но и исследователям, энтузиастам и маленьким командам. Если вы уже пользуетесь Whisper или другими моделями, то попробуйте подменить их на GigaAM-v3 в своём пайплайне и посмотрите, как изменятся метрики и субъективное восприятие.

При развитии GigaAM мы во многом ориентируемся на запрос сообщества. Именно поэтому мы ушли от NeMo-зависимостей, подготовили конвертацию в ONNX, добавили пунктуацию в наши модели и стали публиковать их на Hugging Face.

Будем рады вашим вопросам, отчётам об ошибках, идеям по доработке и сравнениям на ваших данных. Спасибо, что дочитали!