Для того чтобы пользователи музыкального стриминга могли легко находить песни по тематике и смыслу, а система рекомендаций подсказывала наиболее подходящие песни, необходим процесс извлечения лирики. Это подразумевает автоматизированное извлечение и последующий анализ текстов песен: от романтических баллад до хитов диско. Более того, это позволяет эффективно фильтровать контент для различных возрастных групп.
Меня зовут Дмитрий Берестнев, я Chief Data Scientist HiFi-стриминга Звук, и сегодня расскажу, как мы реализовали распознавание лирики.
Суть проблемы
По статистике, только около 10% лейблов и музыкантов загружают тексты песен (наряду с самими треками) в стриминговые сервисы. Поэтому возникает необходимость самостоятельно расшифровывать тексты. Однако на рынке нет готовых open-source решений для автоматической расшифровки текстов песен (Automatic Lyrics Transcription), и мы в Звуке решили разработать своё.
Мы сразу же столкнулись с проблемами: для полноценного обучения модели не хватало качественной разметки данных, текстов и таймкодов. В открытом доступе не было ни датасетов, ни готовых нейронных сетей для задачи автоматической транскрипции лирики, так как эта задача специфическая и низкоприоритетная для специалистов по распознаванию речи. Поэтому мы отказались от идеи самостоятельно обучать модель и начали тестировать open-source решения для speech2text, применяя различные настройки для улучшения их эффективности в нашем контексте.
Описание задачи
Нам нужно было создать пайплайн для последовательной обработки большого количества аудиофайлов в batch-режиме с сохранением результатов во внутренние хранилища данных. Важно, чтобы решение эффективно функционировало как с русским, так и с английским языками.
Для оценки точности модели мы выбрали целевую метрику Mean Opinion Score (MOS), которая определяется экспертной оценкой от 1 до 5. Качество получаемой разметки должно быть достаточно высоким для понимания смысла песни, то есть даже если отдельные слова распознаны неправильно, общий смысл текста должен оставаться понятным.
Для объективной оценки качества работы системы мы решили использовать прокси-метрику Word Error Rate (WER) — процент неправильно распознанных слов. Текущие SoTA speech2text модели дают WER в районе от 5% до 10%. В последнем соревновании по Automatic Lyrics Transcription лучшие результаты WER на английском языке составляли от 11,5% до 24,3% для различных датасетов. Исходя из этих данных, мы установили порог успеха в 30%, что является достаточно реалистичным и достижимым показателем в наших условиях.
Кроме того, целевая скорость работы модели должна была составлять не более 8 секунд на песню, где мы считаем одну песню как аудиофайл длиной 240 секунд, то есть требуемый RTF = 8 / 240 = 0.033. Это требование учитывает необходимость быстрого и эффективного анализа песен, чтобы интеграция модели в наши процессы была максимально продуктивной.
Что мы сделали
Для реализации пайплайна нам понадобились Airflow для оркестрации процесса, Python с Pytorch для работы моделей и пайплайнов, немного S3 для хранения временных результатов и мощная видеокарта, чтобы не ждать сотню лет результатов инференса. Пайплайн состоит из нескольких этапов: предварительной обработки данных, применения моделей и постобработки, в результате чего получается извлеченный текст. Все этапы реализованы в виде пайплайна в Airflow, работающего в батчевом режиме. Итоговые тексты выгружаются в файлы в Hive, что позволяет другим командам, например, команде рекомендаций, использовать их для создания признаков и интеграции в свои модели.
Для оптимального применения speech2text моделей к песням, мы решили адаптировать пайплайн под специфические особенности музыкального аудио. Важным отличием песен от обычной речи является наличие шума (аккомпанемента) на фоне пения и между фразами, а также возможная невнятность произношения слов (спасибо мамбл рэпу). Соответственно, чтобы оптимально применить готовую speech2text модель к аудиодорожке, надо прежде ее как-то предобработать.
Чтобы решить проблемы шума на фоне и между пением, мы обратились к классу Source Separation моделей, которые разделяют аудиотрек на отдельные элементы (stem'ы). Для этого мы использовали популярную модель HTDemucs, которая выделяет вокал, бас, барабаны и другие элементы. Нам была интересна именно вокальная часть. Мы протестировали и другие модели, но они уступали HTDemucs по качеству. С её помощью мы избавились от 99% шума.
Применение модели HTDemucs на фрагменте “Wham! - Last Christmas” |
Следующим шагом было разделение аудиотрека на сегменты, что является более привычной задачей для сообщества по распознаванию речи. Мы использовали модели VAD (Voice Activity Detection), которые определяют, в какие моменты времени в аудиотреке есть речь, а в какие нет. После экспериментов с моделями от Silero и Pyannote, мы остановились на последнем варианте. В итоге, используя эти две модели последовательно, мы получили очищенный вокал без пауз, готовый для передачи в speech2text модель.
Применение VAD на фрагменте “Wham! - Last Christmas” |
Для задачи speech2text мы тестировали open-source решения от OpenAI (разные версии Whisper) и Nvidia (NeMo conformer). Мы быстро поняли, что маленькие архитектуры не подходят (спасибо мамбл рэпу снова), поэтому проверяли большие конфигурации Whisper v2 и v3 от huggingface. Подбирали гиперпараметры для достижения наилучшего качества транскрибации, измеренного с помощью WER, экспериментируя с параметрами окна, beam search и температурой.
Архитектура Whisper |
После получения результатов в виде распознанного текста, мы тестировали применение корректоров ошибок, основанных на моделях и регулярных выражениях. Например, мы использовали нейросетевую модель T5 от Google для понимания и генерации текста.
Мы экспериментировали с различными комбинациями и настройками решений, что позволило нам создать идеальный пайплайн из HTDemucs, Pyannote VAD и Whisper V3 с нужными настройками и подключением корректора ошибок.
Важно отметить, что мы ориентировались на песни на русском и английском языках. Whisper умеет распознавать язык (предсказание лежит в первом токене декодера), поэтому мы заранее прогнали нашу базу песен через более легкую версию Whisper с одним шагом декодера для определения языка песни. В дальнейшем, мы фиксировали в модели язык аудиотрека, поступающего на вход.
Процесс инференса
В нашем Airflow настроен Directed Acyclic Graph (DAG), который выполняет роль координатора процесса извлечения текстов из аудиотреков. Этот DAG задействует несколько операций: он собирает ID песен, для которых требуется извлечение текста, загружает в специально предназначенный для этого volume. Этот volume присоединен к кластеру, оснащенному видеокартами Nvidia A100. Для оптимизации ресурсов каждая видеокарта разделена на несколько изолированных GPU инстансов (MIG - Multi-Instance GPU), что позволяет эффективнее распределять нагрузку между различными задачами инференса.
Затем, в рамках DAG, запускается процесс инференса, во время которого используется ансамбль наших моделей для обработки выгруженных песен. Это позволяет нам параллельно и эффективно обрабатывать большое количество аудиоданных, минимизируя время ожидания и максимизируя производительность.
После завершения процесса инференса, результаты — тексты песен — автоматически выгружаются на хранилище S3. Это обеспечивает надёжное и безопасное хранение данных, а также их доступность для дальнейшей обработки. Из S3 данные последовательно передаются в Hive, где они становятся доступны для анализа и использования другими командами внутри компании для создания признаков или питания рекомендательных систем.
Специфика музыки
На основе экспериментов с 5 тысячами песен (2 тысячи часов аудио) в различных жанрах мы выяснили, что наилучшие результаты распознавания слов достигаются в жанрах Поп, Нью-Вейв, Поп Рок, Хаус, Диско и Шансон, где WER составляет от 10% до 20%. Это объясняется тем, что в этих жанрах музыка ненавязчивая, а лирика четкая и понятная, что позволяет легко подпевать. Также хорошие результаты показала категория Non-music (что неудивительно), включающая подкасты, аудиоспектакли и радиошоу.
Наименее эффективным оказалось распознавание слов в жанрах Техно, Электро, ДнБ и Метал, где WER превышает 40%. Эти жанры характеризуются агрессивной и тяжелой музыкой, а также различными голосовыми эффектами, что затрудняет понимание слов даже для человека.
Кроме того, английский язык традиционно распознается лучше, чем русский, что связано с особенностями самих моделей. В случае с двуязычными песнями, где присутствуют несколько языков одновременно, мы использовали корректор ошибок и постпроцессинг, что значительно улучшило результаты распознавания.
Результат
В итоге мы адаптировали и модернизировали существующие open-source решения для работы с музыкой и создали собственный ML-сервис, развернутый в нашем внутреннем кластере Kubernetes. Этот сервис в режиме batch-обработки анализирует музыкальные файлы, извлекает из них тексты и выгружает результаты во внутреннее хранилище данных.
Мы достигли важных показателей: точность распознавания характеризуется метриками Mean WER = 24,5%, MOS = 3,665, а RTF = 0,0125 (в почти три раза меньше требуемого, где скорость работы составляет 80 секунд аудио за 1 секунду инференса). В базе Звука сегодня более 70 миллионов музыкальных треков, около половины из которых содержат вокал. Мы уже разметили треть песен, но каждую неделю добавляется около 150 тысяч новых треков. Таким образом, нам предстоит обработать ещё не менее 22 миллионов композиций, что мы планируем сделать в ближайшей перспективе.
Дальше мы планируем оптимизировать процесс извлечения лирики, увеличивая скорость обработки и улучшая качество распознавания текстов для наиболее сложных категорий музыкального контента, таких как Метал. Кроме того, благодаря дополнительно собранным текстам, мы будем уточнять и перестраивать наши рекомендательные алгоритмы для повышения их качества.
Мы также развиваем функцию ситуативного поиска, позволяя пользователям искать контент, связанный с конкретными запросами, например, саундтрек для вечеринки или отдыха. На каждую композицию будет поставлен список тегов, помогающий отнести её к определённой ситуации.
Спасибо, что прочитали! Будем рады вашим вопросам.
PS: Отдельное спасибо команде ML Audio, а именно Антону Нестеренко и Амантуру Аматову, за проделанную работу и помощь со статьей.
talik
Классное описание. Готовый план, для желающих повторить такое же, но свое.