Всем привет! Меня зовут Антон Ермилов, я руковожу командой разработки эффективных моделей машинного обучения в Yandex Cloud. Самый популярный среди наших ML-сервисов — Yandex SpeechKit, сервис распознавания и синтеза речи. В SpeechKit мы уже создали модели распознавания речи для 10 европейских языков, турецкого и казахского, а также модели синтеза речи для пяти языков. Недавно мы добавили узбекский язык.
В этой статье я расскажу на примере узбекского, как мы добавляем новый язык в сервис: как создаются технологии синтеза и распознавания речи, как мы обучаем модели, какие встречаются сложности.
Примерно с середины 2022 года к нам в команду стали приходить регулярные запросы от технологических партнёров и клиентов на узбекский язык. Мы оценили перспективы и решили добавить синтез и распознавание на узбекском в SpeechKit.
Как создаётся новый язык
Несмотря на то что пользователи не всегда разделяют речевые технологии на синтез и распознавание, это два кардинально разных по созданию и эксплуатации продукта. Сейчас в Yandex Cloud не все языки имеют и синтез, и распознавание. Дело здесь в потребностях клиентов для каждого конкретного языка: для целей речевой аналитики синтез не нужен, а для озвучки текстового контента, например создания аудиокниг, не нужно распознавание. Однако в случае с узбекским было понятно, что нам нужны обе технологии, так как основной запрос от клиентов был на голосовых роботов.
Самое важное при создании моделей и синтеза, и распознавания — иметь хорошие базы для обучения. Эти базы организованы одинаково — аудио с точной текстовой разметкой, а вот требования к процессам различаются. В случае синтеза аудио должно быть максимально качественными, а в случае распознавания — максимально близким к тому, которое планируется распознавать. В нашем случае это преимущественно аудио из телефонного канала, то есть сжатый до 8 кГц звук с посторонними шумами и помехами на линии.
Мы берём для базы распознавания образцы телефонных аудиозаписей из двух источников: краудсорсингового сервиса, где пользователи озвучивают заданный текст, и переданных нам материалов клиентов и партнёров, которые до передачи были очищены от персональных данных и конфиденциальной информации.
Процесс создания синтеза: четыре нейросети под капотом
Для создания синтеза на новом языке нам необходимы записи речи хорошего диктора длительностью около 30 часов. Хорошего — значит, помимо приятного голоса, диктор должен ещё правильно дышать, иметь стабильный тембр, правильную, соответствующую контексту, подачу, хорошую дикцию.
Также имеет большое значение место, где записывается диктор. Например, фоновый шум даже в минимальном объёме может вызвать артефакты и помехи в синтезе.
При записи диктора обычно присутствует войскоуч — специалист, который следит за тем, чтобы диктор строго следовал тексту, не менял манеры повествования. Кроме того, коуч не пропускает предложений с неправильным дыханием, кашлем, посторонними звуками, вовремя предлагает диктору передохнуть, чтобы голос не менялся, и в целом следит за корректностью поведения диктора.
Вычищенный от некорректных дублей материал используется для обучения модели. Но перед обучением ML-модели данные нужно привести к специальному формату: извлечь акустические признаки из аудиодорожек, снять интонационный контур, предобработать тексты.
Расскажу вкратце, как устроена модель синтеза речи. Она состоит из акустической модели, которая объединяет предсказание интонационного контура, длительностей символов и акустических признаков речевого сигнала, и вокодера. Вокодер использует выход акустической модели для генерации самой аудиозаписи.
Таким образом, целиком модель синтеза речи состоит из четырёх компонентов, которые в зависимости от используемой архитектуры могут обучаться независимо или совместно. На вопрос, какой из вариантов обучения является правильным, даже мы пока не можем ответить однозначно, а потому продолжаем активно проводить эксперименты в этом направлении.
После обучения модели синтеза речи нельзя сразу её использовать, нужно сначала убедиться в том, что качество работы модели удовлетворит ожидания пользователей. Для этого мы просим пользователей краудсорсинговой платформы оценить, нравится ли им результат работы синтеза. С помощью набора специальных вопросов можно отлавливать разнообразные проблемы в синтезированных записях: механические шумы, «проглатывание» некоторых звуков или неправильную расстановку акцентов и интонаций во фразах. Таким образом, в работе по подготовке модели синтеза речи участвуют не только разработчики и аналитики, но и тысячи людей, занимающихся краудсорсингом.
Синтез уникального голоса
Многие компании хотят, чтобы голос в их коммуникациях с клиентами был уникальным. С того момента как мы создали синтез на новом языке, в том числе на узбекском, мы используем технологию Brand Voice — синтез уникального голоса. Можно записать своего диктора или найти диктора с нашей помощью.
Чтобы создать Brand Voice на узбекском, понадобится около 20 часов записей диктора. С каждым новым проектом это время будет сокращаться. Для синтеза голоса нового диктора на русском языке сейчас требуется всего около 2 часов.
Для нового диктора мы проводим запись в студии, контролируем речь, нарезаем и готовим записи для обучения модели и создаём модель. Голосового помощника можно использовать, например, для озвучивания напоминаний о записи к врачу или для подтверждения заказов.
Пример записи диктора на русском языке
Пример записи на русском языке: склейка фраз диктора
Распознавание речи на узбекском и мультиязычная модель
Для распознавания требуется гораздо больше данных, чем для синтеза. Потому что синтезируем мы один конкретный голос, а распознавать требуется очень разнородную речь: разные голоса, манеры речи, разные типы акустики.
Чтобы собрать датасет для распознавания, мы используем более широкий набор источников. Это и аудио из открытого интернета, и специально записанное аудио в нужном формате, и датасеты от внутренних заказчиков — сервисов Яндекса. Все записи должны быть точно размечены, то есть каждому слову на аудио должно соответствовать его буквенное значение. Для того чтобы этого достичь, у нас выстроен процесс сбора данных с использованием краудсорсингового сервиса.
Например, рассмотрим процесс транскрибации неразмеченных аудио с помощью краудсорсинга. При разметке клиентских записей все аудио анонимизируются, разбиваются на маленькие кусочки, каждый из которых затем предлагается записать текстом.Проверку правильности полученной разметки мы также доверяем краудсорсингу: если несколько исполнителей сошлись в том, что расшифровка записи корректна, этот кусочек используется нами для обучения или оценки качества модели.
SpeechKit непрерывно развивается, клиенты регулярно приносят новые аудиозаписи для распознавания. Соответственно, в самих данных мы практически не ограничены. Но чем больше исполнителей на конкретном языке готовы нам помогать, тем быстрее мы размечаем имеющиеся данные.
После сбора все данные предобрабатываются: тексты приводятся к единому виду, а аудиозаписи аугментируются — меняются частоты, скорость, громкость. Это нужно, чтобы модель училась распознавать аудио разного качества: с диктофона, с телефона, из шумного помещения, с разными шумовыми эффектами, высокой и низкой частотой. При этом тексты распознавания должны генерироваться единообразно. Для узбекского это важно в том числе из-за наличия апострофов (прямого ʼ
и перевернутого ʻ
), для записи которых реальные люди часто используют похожие, но всё-таки разные символы, например одинарные кавычки. И, наконец, предобработанные данные подаются на вход модели.
Хочется отметить, что все языки в SpeechKit работают в рамках единой мультиязычной модели. Это возможно во многом благодаря её трансформерной архитектуре. Модель обучается распознавать не только узбекскую речь, но и речь на других языках. С одной стороны, это облегчает жизнь разработчикам, потому что обучение и эксплуатация единой модели требует меньше ресурсов. С другой стороны, такой подход помогает модели лучше обучаться распознаванию языков даже с малым количеством данных за счёт переиспользования информации из других языков. Например, для узбекского это работает благодаря его схожести с турецким и казахским языками, которые мы уже давно умеем распознавать.
Особенная узбекская латиница
В Узбекистане уже больше 20 лет используется латинский алфавит. При этом, помимо стандартных букв, есть ещё несколько дополнительных букв с особыми, характерными для узбекского языка звуками. А также есть одна буква, которая звучит не так, как в других языках с латиницей, — это буква «X». В узбекском она обозначает твёрдый [х]
, и в этом есть некоторая загвоздка, особенно когда речь заходит об иностранных словах, которых в узбекском достаточно много.
Например, популярная в Узбекистане машина Nexia: марка написана на английском, и жители Узбекистана привыкли читать это как «Нексия», но синтез произнесет Нэхия и будет формально прав.
Ещё одна особенность в том, что узбекский алфавит активно меняется. Добавляются и изменяются новые буквы, и нам приходится учитывать это в распознавании и синтезе, но при этом не отказываться от старых обозначений, так как не все пользователи успевают за изменениями.
Процесс нормализации
После того как модель синтеза научилась произносить звуки, соответствующие конкретным буквам, а модель распознавания – писать буквы, соответствующие конкретным звукам, начинается следующий этап работы над языком, менее очевидный, чем первые, — нормализация. Это перевод числительных, сокращений и символов в оптимальный для использования формат.
Допустим, если вам нужно озвучить номер машины, то проще отправить в синтез запрос Х777АХ750, но без нормализации модель не сможет это озвучить и потребуется вводить запрос «ха семьсот семьдесят семь…». Большинство людей так делать не готовы, поэтому мы и проводим нормализацию. Делаем технологию поэтапно, начиная с числительных и впоследствии дорабатывая более редкие сценарии, такие как даты, популярные сокращения (вроде «ул. Пушкина д. 4, кв. 1») и другие.
Пока это не слишком быстрый процесс, потому что он требует и понимания особенностей языка, и наличия соответствующих данных — параллельных корпусов с текстами в «сыром» и нормализованном виде. Для этого мы сейчас пытаемся по максимуму использовать все возможности: ищем открытые датасеты, собираем синтетические данные там, где это возможно, и подключаем краудсорсинг для нормализации текстов с нужными типами сущностей — адресами, датами, сокращениями.
Некоторые тут могут сказать, что все эти сложности со сбором данных не нужны — можно же делать нормализаторы на правилах. И они будут отчасти правы, поскольку в некоторых языках отдельные типы нормализаций действительно могут быть легко реализованы с помощью правил. Например, нормализация чисел в английском.
Проблема возникает в тот момент, когда нормализация начинает зависеть от контекста, а построение правил начинает требовать работы нескольких экспертов-лингвистов. Нам же хочется делать универсальную технологию, применимую одновременно для нормализации и денормализации текстов, сравнительно легко переносимую на другие языки и не требующую очень глубокого погружения в особенности языка.
Бесконечная история: улучшение языка после создания
После того как мы создали первую версию языка, начинается следующая часть работы — его улучшение. Эта часть может продолжаться бесконечно. Даже имея отличное качество распознавания на русском языке, мы по-прежнему находим области для улучшения. Это могут быть слова узкой тематики, такие как национальные блюда или юридические термины, а могут быть новые акустические условия — аудио с диктофона или с микрофона в шумном помещении.
В Yandex Cloud выстроен процесс дообучения моделей, работает он на основе обратной связи от клиента. Есть два вида данных, которые мы используем для дообучения: аудио, которые мы размечаем и добавляем в модель, и тексты, которые мы озвучиваем и так же добавляем в модель. Работы по дообучению всегда бесплатны для клиента.
Для улучшения синтеза нам важно учесть на своей стороне особенности, необходимые всем клиентам, такие как нормализация, и дать каждому проекту инструмент для настройки индивидуальных нюансов, например звучания фамилий и названий товаров. Для этого мы обучаем наши модели синтезировать речь не только из текста, но и из его фонемной записи, которая, в отличие от текста, не зависит от особенностей конкретного языка. И в таком варианте появляется возможность корректировать произношение отдельных слов, если они должны быть озвучены не по правилам языка.
Узбекский — шестнадцатый язык в SpeechKit. Что дальше?
Для узбекского языка сейчас доступны синтез и распознавание, проводится нормализация. Также мы работаем над улучшением процесса создания нового языка, чтобы добавлять другие языки быстрее.
В русском мы расширяем функционал моделей распознавания — добавляем определение эмоций и пола говорящего. Планируем добавить определение сущностей, чтобы распознавать, какие фрагменты аудио являются фамилией, адресом, датой. После того, как реализуем всё это для русского, будем протягивать в другие языки.