В 2024 году состоялся юбилейный, десятый Тотальный диктант. Тогда на него пришёл «Писец». Вы не подумайте, не произошло ничего плохого. «Писец» — это открытая система автоматической расшифровки речи, от журналистского интервью до заседания диссертационного совета. Будто древнерусский пи́сец, который записывает за боярином всё, что тот говорит, и затем сохраняет в виде структурированного текста с таймингами.
Я — Иван Бондаренко, старший преподаватель и научный сотрудник Новосибирского государственного университета, сооснователь стартапа «Сибирские нейросети». Вместе с коллегами я реализовал систему, которая помогает в расшифровке живых бесед на русском языке. Мы назвали её «Писец» и протестировали на Тотальном диктанте. В этой статье расскажу, что у нас получилось: как выбирали модели, наборы данных, инструменты, как использовали Wav2Vec2 и Whisper в пайплайне распознавания, файнтюнили Whisper. Ещё коснусь вопросов робастного обучения, парадигмы минимизации инвариантного риска и понятия среды (environment) в распознавании речи.
От задачи до идеи реализации
В Новосибирске есть замечательный драматический театр «Старый дом». Это антуражное винтажное старое здание, окружённое деревьями. В 2018 году в театре поставили необычный документальный спектакль в жанре вербатим о проблемах современного мегаполиса. Вербатим предполагает, что в основе сюжета лежат реальные истории. Ребята, которые разрабатывали спектакль, ничего не придумывали сами, и, чтобы собрать реальные рассказы, проводили интервью. Одним из участников интервью был я.
Чтобы получить готовый текст одной беседы, авторам спектакля приходилось расшифровывать полуторачасовой разговор, записанный на диктофон. Стоит ли говорить, что времени на это уходило много. Тогда мы помогли театру нашими технологиями распознавания речи: на тот момент это был просто разрозненный набор исследовательских скриптов, которые мы использовали в экспериментах.
На иллюстрации ниже — наша система обработки интервью, которая была поддержана Фондом содействия инновациям: грант «Код — ИИ» первой очереди, в 2022 году.
Первая в мире система стенографирования появилась в древнем Риме и называлась «Тироновы значки». Её создателем был раб оратора Цицерона, писец Тирон.
Эта система использовалась для записи речи в быстром темпе, чтобы фиксировать и записывать устные выступления римских ораторов и историков. Но поскольку рабство уже отменили, а стенограммы всё ещё нужны, вариантов немного.
У нас возникла идея создать опенсорсную систему, которая облегчила бы работу с аудиозаписями журналистам, документалистам, полевым социологам и всем, кто занимается созданием текста в жанре интервью или готовит стенограммы для диссертационных защит. Систему назвали «Писец»: она как Тирон за Цицероном или как древнерусский писец за боярином записывает речь и трансформирует её в текст.
Трёхкомпонентная архитектура «Писца»
Мы задумали «Писца» быстрым и бесплатным, чтобы каждый пользователь мог без проблем выполнить команду pip install на своей машине, не сталкиваясь с серьёзными ограничениями по ресурсам. По этой причине выбрали подход с использованием небольших нейросетей. На основе наших собственных моделей распознавания речи собрали архитектуру:
-
Wav2Vec2 — выполняет первичное распознавание;
-
Языковая модель (LM) — повторно оценивает результаты на основе априорных знаний о языке;
-
Нейросеть с авторегрессионным декодером (или декодировщиком). Например, seq2seq модель с энкодером и авторегрессионным декодером типа T5 — окончательно исправляет ошибки и нормализует текст.
На схеме видно, что Wav2Vec2 что-то распознал, LM его поправила, но с ошибками, а T5 — молодец, справился.
Как обучались компоненты архитектуры:
-
Wav2Vec2 — это дообученная версия модели Wav2Vec, настроенная для работы с русским языком. Мы использовали большой корпус данных, включая голосовые записи от SberDevices, датасеты SOVA, RuDevices, RuAudioBooks и другие.
-
LM — обучалась на большом корпусе русских текстов из Taiga и Википедии. В сумме это около 47 миллионов текстов.
-
T5 — обучалась на выходных данных модели Wav2Vec, с датасетами, которые не использовались для обучения Wav2Vec, чтобы сохранить обучающую способность.
«Писец» получился очень быстрым, даже на CPU. Примерно в 4-5 раз был быстрее реального времени, а на GPU вообще летал. Но насколько хорошо он распознаёт?
Качество распознавания речи
Мы исходили из того, что если система корректно распознаёт два слова из трёх, это уже хороший результат. Это существенно помогает автору интервью, так как облегчает процесс транскрипции. Но чтобы сравнить наше решение с другими системами, нужно было измерить качество распознавания.
В отличие от задач компьютерного зрения, где мы работаем со статической картинкой, речь — динамический объект, а её расшифровка — динамический процесс. Задача: сравнить эталонную расшифровку речи — эталон, с полученной расшифровкой — кандидатом.
Критерий Word Error Rate
Последние 20−30 лет для оценки качества распознавания используют критерий Word Error Rate (WER), который рассчитывается с помощью динамического программирования:
WER= S+D+IN,
где I — число вставок, S — число замен, D — число удалений, необходимых для приведения распознанной фразы к эталонной фразе. N — количество слов в эталонном тексте.
Мы пытаемся сделать минимальное число вставок, замен и удалений, чтобы привести распознанное слово к эталонному, и делим на количество слов в эталонном тексте.
Пример:
Система распознала эталонный текст с ошибками. Чтобы преобразовать такой текст в эталонный, необходимо сделать четыре замены и одно удаление, вставки здесь не нужны:
I = 0, S = 4, D = 1, N = 8
Тогда WER = (4 + 1 + 0) / 8 = 0,625
Значение критерия WER, равное 62,5%, достаточно высокое. Значит, более половины слов правильно распознаны. С помощью этого критерия мы протестировали «Писца» на нескольких открытых датасетах и заметили, что использование языковых моделей, основанных на знаниях о языке, таких как языковая N-граммная модель или трансформеры типа T5, значительно улучшает результаты распознавания.
Результаты тестирования на публичных датасетах:
Здесь возникла проблема: мы получили неоднозначные результаты. В некоторых случаях комбинация LM + T5 даёт лучшие результаты, в других — просто LM работает лучше. Вопрос в том, насколько действительно важно для интервьюера получить текст, который по смыслу близок к тому, о чём говорилось?
Рассмотрим пример. Есть эталонная фраза и два распознавателя речи, которые совершают ошибки:
Эталон: мама мыла раму
Распознано (1): мама мыла даму
Распознано (2): мама мыла окно
В обоих случаях, если рассчитывать WER, результат будет одинаковым — одна ошибка в виде замены. Однако более ожидаемое и предпочтительное поведение для нашего «Писца» — это вариант «мама мыла окно», потому что это ближе к реальной ситуации, даже если не совсем точно совпадает с эталоном «мама мыла раму». Таким образом, хоть мы и распознаём текст с ошибками, верная семантика всё-таки передаётся.
BERT score
Есть ещё одна мера качества — BERT score. Она позволяет оценить не просто лексическое совпадение референса с кандидатом, но и семантическое. Суть в том, что мы используем одну нейросеть для оценки другой.
Как работает BERT score:
-
С помощью модели BERT получаем векторные представления — эмбеддинги — для всех токенов в эталоне и для всех токенов в кандидате.
-
Считаем матрицу similarity (косинусного сходства).
-
BERT-recall: для каждого токена из эталона пытаемся найти наиболее похожий токен из текста кандидата. В числителе записываем сумму произведений.
-
BERT-precision: для каждого токена из текста-кандидата пытаемся найти наиболее похожий токен из текста-эталона, то есть кандидат и эталон меняются местами.
-
На основе precision и recall рассчитываем значение F1-меры и получаем BERT F1. Это тот самый показатель BERT score, который варьируется от 0 до 1, где 1 — идеальный результат и полное совпадение по семантике, 0 — полный провал и отсутствие совпадения. Но, скорее всего, будет что-то среднее.
Например, на рисунке ниже мы уже видим, что оценка качества распознавания может быть разной.
Когда распознано «мама мыла даму», мы видим в правой нижней части матрицы низкие similarity score. Фраза «мама мыла» совпадает на первом уровне, но дальше начинаются расхождения. Когда «мама мыла окно» эмбеддинги более близки, и косинусная близость между ними также выше. Это позволяет нам различать варианты распознавания по смысловой близости и оценить работу «Писца» с точки зрения полезности.
Human evaluation
Самый лучший способ оценить качество генерации, будь то работа с большими языковыми моделями или распознавание речи — это human evaluation, или оценка человеком. Однако с этим не всё однозначно.
С одной стороны, результаты вполне хорошие. Один из моих товарищей защитил диссертацию и использовал «Писца» для подготовки стенограммы. Он сделал всё быстрее, чем мог представить, отнёс материалы в диссовет, но стенограмму вернули и попросили переписать текст. По их мнению, он был неправильный. Оказалось, что члены совета стремятся быть «Цицеронами» в глазах ВАКа, а «Писец» честно распознал их речь, включая «эканья» и «бэканья», как они на самом деле говорят. Встал вопрос: для кого и для каких целей предназначена эта стенограмма? В зависимости от целей важно понять, какую метрику качества мы ожидаем и что должно быть на выходе.
Кроме того, результаты варьировались в зависимости от домена. В некоторых случаях модель показывала 20% WER, в других — 40%. А нам хотелось провести полноценный тест, который оценивал бы качество распознавания как человек.
Как тестировать ИИ
Мы придумали свой подход к тестированию искусственного интеллекта, вдохновившись известной статьёй американского специалиста в области психофизиологии и ИИ Гэри Маркуса «Человек ли я?». Обзор был посвящен тому, как измерять качество искусственного интеллекта. Старый добрый тест Тьюринга, хотя и полезен, к настоящему времени устарел и не учитывает все аспекты интеллекта. В своей статье Маркус предложил несколько альтернативных вариантов теста, например, кофейный тест.
В кофейном тесте искусственный интеллект, зайдя в обычный американский дом, должен найти кофеварку, банку с кофе и приготовить одну чашку. Если ИИ справился, значит, он действительно продемонстрировал высокий уровень интеллекта. Но нам такие тесты не подходят, потому что мы делаем не робота, а алгоритм для распознавания речи и стенографирования.
Так мы пришли к другой идее: отправить искусственный интеллект учиться вместе со школьниками. Пусть он сдаёт экзамены и пишет контрольные как люди. Если проверяющие оценят его так же, как обычного участника, значит, интеллект уже на уровне человеческого. Это показалось интересным. Обдумывая идею, я зашёл в нашу университетскую кофейню, где висела табличка с рекламой Тотального диктанта. И тут меня осенило: диктант — это ведь идеальный тест для системы автоматического стенографирования! Почему бы не отправить «Писца» на Тотальный диктант и не посмотреть, как он справится с задачей?
По пути возник вопрос, как объективно оценить такую систему. Как я уже писал, для системы автоматического стенографирования нормально, если ошибка распознавания WER составляет порядка 30%. Это хороший результат, но Тотальный диктант оценивается строже. Чтобы получить пятёрку, нужно сделать 0 ошибок. Даже несколько ошибок уже приведут к оценке ниже, возможно, к тройке. К тому же, в Тотальном диктанте обращают внимание и на орфографические, и на пунктуационные ошибки, а с пунктуацией у системы распознавания всё традиционно плохо.
Вот критерии оценок за диктант:
Оценка |
Количество ошибок: орфографические/пунктуационные |
||||
«5» |
0/0 |
0/1 |
|
|
|
«4» |
0/2 |
0/3 |
0/4 |
|
|
|
1/0 |
1/1 |
1/2 |
1/3 |
|
|
2/0 |
2/1 |
2/2 |
|
|
«3» |
0/5 |
0/6 |
0/7 |
0/8 |
|
|
1/4 |
1/5 |
1/6 |
1/7 |
|
|
2/3 |
2/4 |
2/5 |
2/6 |
|
|
3/0 |
3/1 |
3/2 |
3/3 |
3/5 |
|
4/0 |
4/1 |
4/2 |
4/4 |
|
Мы начали размышлять. Трёхкомпонентная архитектура «Писца», которую мы использовали, не совсем подходила для решения задач Тотального диктанта. Мы могли бы просто распознавать много слов с ошибками и не расставлять пунктуацию. С одной стороны, задачей было построить систему, которая работает достаточно быстро даже на CPU. Поэтому выбрали архитектуру с небольшими компонентами. Пусть это и нейросети, но они достаточно быстрые. С другой, новая задача — уже более масштабная и требует более высокого качества распознавания. После долгих размышлений и сопротивления мы решили попробовать Whisper. Для распознавания речи с использованием этой модели нужно устанавливать GPU, на CPU процесс будет слишком медленным.
Whisper для расширенной задачи распознавания
Whisper — это полноценная End2End нейросетевая модель для преобразования речи в текст, использующая авторегрессионный декодер. Не просто энкодер, как Wav2Vec2, и не текстовый seq2seq энкодер-декодер, как T5, а полноценный алгоритм. Энкодер прежде всего учитывает акустические характеристики речи, семантика тоже постепенно подмешивается, а декодер — это уже языковая модель, которая генерирует токен за токеном.
Модель |
Число блоков |
Число весов |
Tiny |
4 |
39 000 000 |
Base |
6 |
74 000 000 |
Small |
12 |
244 000 000 |
Medium |
24 |
769 000 000 |
Large |
32 |
1 550 000 000 |
Особенности Whisper:
-
Предобучение. Модель обучена на большом объёме речевых сигналов с аннотациями, причём это «грязные» данные. Половина из них — это англоязычная речь, вторая половина — остальные локальные языки, в том числе, русский.
-
Механизм внимания. Несмотря на мощность, Whisper использует механизм самовнимания — self-attention. В самой простой реализации этот механизм имеет квадратичную сложность, в зависимости от длины последовательности.
-
Ограничения. Из-за ограничения на длину последовательности модель не может эффективно обрабатывать слишком длинные аудиофайлы. Во время обучения Whisper также не работал с очень длинными сигналами, и максимальная длина для эффективного распознавания ограничена 30 секундами. А диктант — это длинный сигнал от 5 минут до получаса, не говоря уже об интервью. Эту проблему тоже нужно было решать.
Вначале мы использовали тот же подход, что применялся в предыдущем поколении «Писца» — обычный chunking с перекрытием.
Для моделей с CTC loss (например, Wav2Vec2) этот метод работает хорошо. Мы разбиваем аудиофайл на фреймы фиксированной длины, например, 30 секунд. Затем вычисляем матрицу логитов для каждого фрейма и смещаем её на 26 секунд, оставляя 4 секунды зазора, по 2 секунды с каждой стороны. Таким образом, движемся равномерно по сигналу, используя буфер фиксированного размера.
Для Whisper этот подход работает хуже: когда применяется такой chunking, мы фактически отключаем возможность лучевого поиска (Beam Search) и ограничиваемся только Greedy Search. Это пагубно влияет на качество распознавания речи, и начинают возникать галлюцинации.
Проблема галлюцинаций Whisper
Примеры неожиданных галлюцинаций на реальных речевых сигналах из датасетов Russian LibriSpeech и Common Voice (русскоязычная часть корпуса):
Эталон
Тщетно тщится щука ущемить леща.
Африка потеряла истинного друга,
и Африке будет его очень не хватать.
Галлюцинации Whisper:
Я не могу сказать, что это было не так.
Африка! Почереееерлаааа аа
Whisper ведёт себя странно. Мы измерили метрики:
-
WER = 0,2805,
-
BERT score = 0,9051
WER чуть меньше 30%, BERT score где-то 0.9 — кажется, результат неплохой, но не единица и достаточно много ошибок. По смыслу вроде что-то передаётся, однако в действительности всё равно ерунда. Почему Whisper так сильно «галлюцинирует»?
Галлюцинации — это такие ошибки, когда модель генерирует текст, который грамматически корректен, но семантически полностью отвязан от контекста. Проблема Whisper в том, что это авторегрессионная модель, которая генерирует токен за токеном с помощью своего декодера. Когда модель сталкивается с нестандартной ситуацией, она начинает генерировать текст, который выглядит грамматически правильным, но не имеет смысла. Это типичная реакция авторегрессионных моделей на сдвиг данных. Когда модель сталкивается с чем-то, что выходит за пределы того, что видела в процессе обучения, то начинает делать то, что хорошо умеет и что видела в тренд-сете — генерировать какой-то текст.
Первое, что мы придумали — сделать так, чтобы в Whisper на вход попадали речевые сигналы, более похожие на те, на которых модель обучалась. Whisper обучался на субтитрах из YouTube-записей, где в основном встречались завершённые речевые фрагменты. Вместо простого chunking мы решили использовать умный chunking, который бы обеспечивал Whisper более типичными сигналами в рамках его домена (in-domain).
Можно выделять фрагменты речевой активности и подавать на вход только эти фреймы. Однако это плохой вариант. Большинство алгоритмов Voice Activity Detection (VAD), будь то простая нейросеть или обычный алгоритм, достаточно примитивны и могут ошибаться, особенно в условиях шумов. Лучшим решением для VAD является само распознавание речи. Когда модель знает, что такое речь, умеет распознавать слова в этой речи и различать их, она может выделять речевую активность и отделять речь от не речи, фоновых шумов и так далее.
Chunking на основе ASR
Мы использовали Wav2Vec2 как VAD «на стероидах». С помощью пайплайна с «chunking with strides», когда длинный сигнал разбивается на короткие фреймы с перекрытием, мы попросили Wav2Vec2 выделить границы слов и предложений. Wav2Vec2 хорошо работает с CTC Loss и может точно определять, где начинаются и заканчиваются слова в речевом потоке. Затем на основе этих границ создавали семантически завершённые фреймы и подавали их на вход Whisper.
Это сработало:
WER = 0,2805 → 0,2206
BERT score = 0,9051 → 0,9187
Chunking на основе VAD ASR
Мы улучшили BERT score почти на 2% и снизили WER примерно на 6%, что уже является значительным достижением. Это позволило сделать модель более робастной, так как мы обеспечили Whisper более типичными данными и снизили влияние сдвига данных. Но мы хотели большего. Что ещё можно было сделать? Адаптировать.
Как расширить возможности Whisper. Дообучение модели
Примерно половина из гигантского обучающего датасета Whisper состоит из английского, а остальная часть — это локальные языки, включая русский. Однако разметка этих данных довольно «грязная», и не всегда понятно, что именно попало в датасет. Мы же стремились распознавать литературную, разговорную и спонтанную речь, и для этого модель нужно было дотюнить.
У нас была гипотеза: Whisper — это отличный акустический энкодер, но не самый лучший лингвистический декодер. Языковая модель, которая представляет собой декодер в Whisper, тоже не идеальна. Для хорошего качества распознавания нужна языковая модель, обученная на огромном объёме текстов. Хотя Whisper был обучен на 600 тысячах часов речи, в текстовом выражении это не так много, а значит, языковая модель может галлюцинировать.
Мы хотели дообучить модель так, чтобы она лучше понимала лингвистические особенности русского языка, но где взять речевые корпуса, которые покрыли бы всё языковое разнообразие?
Шаг первый. Выбор речевого корпуса
Разметки существующих открытых речевых корпусов часто ограничены или заточены под конкретные задачи. К примеру, в корпусах SOVA и RuDevices, разметка очень приблизительная. У Golos — доменно-специфичная. У ребят из SberDevices, наверное, самый хорошо аннотированный, открытый русский речевой корпус (Golos Farfield, Golos Kraut), но и он весьма однообразен и в большей степени предназначен для обучения голосовому управлению умными колонками, такими как колонки Сбера.
Мы хотели сделать наш речевой корпус разнообразным, прежде всего, лингвистически. Поэтому использовали очень большой текстовый корпус — Taiga, созданный Татьяной Шавриной. Этот корпус стал отличной основой для дообучения модели.
Taiga включает более 280 миллионов слов и 40 гигабайт чистых текстов. Корпус охватывает восемь разных рубрик, что позволяет максимально разнообразно представить русский язык:
-
новостные тексты;
-
художественная литература;
-
поэзия;
-
социальные сети;
-
научно-популярные издания.
Шаг второй. Кластеризация модели
Чтобы кластеризировать Taiga, мы использовали sentence embedder. Получили векторные представления всех текстовых фрагментов, а затем применили k-means кластеризацию с десятью тысячами кластеров. На графике ниже отображены проекции sentence embedding текстов из Taiga, и, как можно заметить, существует явная кластерная структура.
Шаг третий. Сэмплирование текстов из окрестностей центров кластеров
Мы выделили около 10 тысяч кластеров и сэмплировали тексты, находящиеся рядом с их центрами. В результате получили небольшой, но достаточно разнообразный текстовый корпус, который покрывает различные особенности языка.
Шаг четвёртый. Генерация парафразов и синтез речи по тексту
На основе полученного текстового корпуса мы синтезировали речь через Yandex SpeechKit, используя как мужской, так и женский голос. Также, чтобы повысить разнообразие, добавили аугментации с помощью инструмента для аугментации данных, и сгенерировали парафразы.
В результате получили синтетический речевой корпус taiga_speech_v2, достаточно однообразный акустически, но очень разнообразный лингвистически, и опубликован в открытом доступе. Мы — принципиальные сторонники open-source и публикуем всё, что делаем, на GitHub и Hugging Face.
Видно, что сигналы в синтетическом корпусе достаточно неплохие и содержат фрагменты и транскрипции разной длины и сложности. Длина текста и речи в целом инкапсулирует множество критериев сложности, что полезно для обучения. Однако для более точной оценки модели и её тюнинга, включая early stopping, важно тестировать на реальных звукозаписях и с реальными людьми. Синтетический корпус — это одно, а реальный корпус — совсем другое.
Шаг пятый. Поиск тестовых данных и Podlodka.io
Нам нужны были тестовые данные, причём максимально разнообразные, которые бы в то же время отражали особенности разговорного языка, когда люди говорят спонтанно, как в обычной жизни. Выбор остановился на подкастах.
Podlodka — известный русскоязычный IT-подкаст. К моменту, когда мы делали Whisper-Podlodka и готовили «Писца» второй версии для Тотального диктанта, у ребят уже было почти 366 выпусков буквально обо всём, что интересно айтишникам — языках программирования, hardware, микропроцессорах, широких темах, вроде винишка, спорта, стоматологии и пр. Есть неплохой выпуск про искусственный интеллект и распознавание речи с моим участием.
Финальный шаг. Тестирование на реальных данных
Для создания тестовых данных мы использовали выпуски Podlodka Podcast. Случайным образом выбрали фрагменты из выпусков и разметили вручную небольшой датасет, буквально полчаса записи.
Для сравнения — синтетических данных мы собрали несколько десятков часов записи, что тоже немного для полноценного обучения. Но стоит отметить, что чем больше модель, особенно такая мощная, как энкодер-декодер, тем меньше данных для supervised fine-tuning ей нужно, чтобы всё обобщить.
Таким образом, у нас было несколько десятков часов разнообразной синтетической речи, которая отражала различные аспекты языка — семантику, лексику, синтаксис, и примерно полчаса реальной речи. Из реальных данных мы использовали часть для тестирования, а оставшуюся часть смешали с синтетическими данными для дообучения модели.
Результаты, которые мы получили, были не совсем однозначными:
WER = 0,2805, BERT-score = 0,9051
WER = 0,2206, BERT-score = 0,9187
WER = 0,2267, BERT-score = 0,9311
Кажется, что Word Error Rate чуточку ухудшился — примерно на 0,6 процентных пунктов. Был 22,06%, стал 22,67%. При этом семантика, отображаемая системой, существенным образом улучшилась, что подтверждается ростом BERT score.
Может возникнуть вопрос, на чём я тестирую модель. Конечно, это не те данные, на которых её обучали. Более того, тесты даже не проводились на тестовой выборке от Podlodka. Мы использовали специфичные данные, чтобы оценить робастность модели. Для этого выбрали домен, который Whisper не видел на этапе supervised fine-tuning — речь врачей о туберкулезе. Это примерно получасовой датасет, содержащий непрерывный, не разбитый на фрагменты речевой сигнал, где врачи общаются друг с другом. Также в этом датасете есть текст, который описывает, что именно говорят врачи.
На основе этих данных мы проводили тесты и проверяли обобщающую способность модели. Результаты такие: модель делает около 22% ошибок — каждое пятое слово распознаёт неверно, но зато хорошо передаёт семантику. Сделаем поправку на то, что это ситуация с разными доменами, когда модель, обученная на речи айтишников, распознавала речь врачей.
На тестовой выборке от Podlodka мы достигли 8-9% WER. Это достаточно низкий показатель.
Для работы с литературной речью мы использовали смесь из трёх датасетов: синтетический корпус Taiga Speech, Podlodka Speech (реальные диалоги людей) и аудиокниги Russian LibriSpeech. И поскольку в основу диктанта положено литературное произведение, пусть даже современное, важно было дотюнить модель, чтобы она лучше распознавала литературный язык.
Тюнинг провели не совсем стандартным способом — использовали концепцию минимизации не эмпирического, а инвариантного риска, когда сама функция потерь формулировалась робастным образом. Помимо обычной предиктивной составляющей, в функцию потерь добавлялась регуляционная составляющая — штраф за неинвариантность в различных средах, если мы знали, что сигналы взяты из разных источников. Например, средой мог быть лингвистический домен, уровень акустических шумов и тому подобное.
Эта версия «Писца» была протестирована на Тотальном диктанте.
Результаты Тотального диктанта
Тестирование проводилось в максимально реалистичных условиях. Мои ученики развернули ноутбук с микрофоном и настроили его так, чтобы учитывать все возможные реверберационные эффекты — эхо, шумы в аудитории, вопросы участников и т. п. Мы не подключались к микрофону диктора и использовали свой, чтобы создать условия, максимально приближенные к реальной ситуации, как если бы мы писали диктант в аудитории.
Наши филологи и лингвисты оценили работу «Писца» на твёрдую тройку. Для сравнения, многие люди пишут Тотальный диктант на двойку, сделав при этом незначительное количество ошибок.
Из 276 слов «Писец» пропустил шесть слов, которые стояли в конце абзаца. Позднее мы выяснили, что это была алгоритмическая ошибка. Ещё семь слов были распознаны неверно, что в основном было связано с морфологическими нюансами, вроде окончаний слов. В целом, Тотальный диктант «Писец» написал на хорошем уровне.
Итоги
Делая робастное распознавание речи, стоит учесть, в каких условиях обучалась модель. Когда вы выкатите её на прод, важно, чтобы сигналы, поступающие на вход в процессе эксплуатации, были максимально схожи с теми, на которых обучалась модель. Сигналы должны быть in-domain — из выборки той же генеральной совокупности.
Если у вас длинный сигнал, его не нужно нарезать случайным образом или равномерными чанками. Попробуйте давать на вход максимально реалистичные сигналы.
Если ваша система работает в специфическом домене, дообучите модель под этот домен или хотя бы под более широкий класс доменов. Если система мультиязычная, то её стоит дообучить под конкретный язык. Тем самым вы можете либо несущественно, либо существенно, в зависимости от домена, снизить ошибку распознавания и повысить семантическое качество того, что генерируется.
Робастность обеспечивается данными. Когда речь идёт о робастном обучении, мы часто упоминаем концепцию минимизации инвариантного риска. Это, конечно, интересный результат и концепция, но она не очень однозначна и спорна.
Самый надёжный способ повысить устойчивость распознавания речи — это увеличение объёма данных. Синтетических, реальных, но максимально похожих на те, что будут в условиях эксплуатации.
Все то, что мы делали, максимально открыто:
-
«Писец» по лицензии Apache 2.0 доступен на GitHub. Его можно скачать, сделать git-клон, pip install и установить виртуальное окружение.
-
Независимая модель Wav2Vec2-Large-Ru-Golos для первичного распознавания.
-
Независимая модель Whisper-Large-V3-Ru-Podlodka для финального распознавания.
Наша система ориентируется на журналистов и учёных, не только айтишников и математиков, но и, например, биологов или филологов. Мы сделали вариант «Писца» в облаке, чтобы люди, которые не являются программистами, могли спокойно его использовать. Этот вариант уже платный. Мы арендуем облако и хотим компенсировать хотя бы эти затраты. Здесь «Писец» может работать онлайн, его можно протестировать до пяти минут прямо с микрофона смартфона.
Автор: bond005