Первый этап GSoC 2019 завершается в конце этой недели, и я хотел задокументировать некоторые достигнутые мной успехи, а также процесс, ведущий к этому моменту.

Фон

Организация, в которой я работаю, - это CCExtractor, программный сервис с открытым исходным кодом, который предоставляет услуги субтитров для видео. Я работаю над небольшим ответвлением организации, детищем моего наставника Аади Баджпаи, под названием SwagLyrics for Spotify, в котором отображаются тексты любой песни, которую вы слушаете. в приложение Spotify через веб-сайт с текстами песен Genius.

Мой проект, который я сейчас называю автосинхронизация, пытается синхронизировать эти тексты с их местоположением в аудио. По сути, мы хотим отображать строки этих текстов одновременно с их исполнением, и в идеале это можно было бы сделать в режиме реального времени, независимо от воспроизводимой песни. Представьте себе старую службу Musixmatch, которую использовал Spotify, но теперь синхронизация выполняется автоматически, а не вручную пользователями Musixmatch.

Моя основная идея заключалась в том, чтобы использовать алгоритм обнаружения ядер слогов (SND), чтобы приблизительно оценить количество произносимых слогов в музыкальном фрагменте, затем сопоставить это с результатами алгоритма расстановки переносов на самих текстах и, наконец, сопоставить эти слоги.

Вокальная изоляция

Большая часть работы, которую я проделал на первом этапе GSoC, - это исследования. Моим первоначальным планом на этом этапе было реализовать SND на Python. Эта задача оказалась намного проще, чем я думал: алгоритм, изначально написанный как сценарий для PRAAT, отдельной программы анализа звука, был легко переведен на Python с помощью оболочки под названием Parselmouth. На точную настройку и выполнение этой задачи у меня ушло около 2 дней.

Вскоре я обнаружил, что более сложной проблемой было получение входов для SND. Аудиофайл песни не соответствовал бы требованиям, поскольку элементы фона, такие как перкуссия, бас, гитара и т. Д., Серьезно запутали бы мой алгоритм SND. Итак, проблема заключается в вокальной изоляции - как мы можем удалить все или почти все фоновые инструменты, чтобы получить относительно чистую изолированную дорожку только вокальной, лирической части музыки, которую мы затем можем ввести в SND?

Алгоритмы

Я предвидел эту проблему до того, как начал проект, хотя и не предполагал, насколько сложной будет эта проблема. Изначально я планировал использовать алгоритм под названием REPET. Это выглядело многообещающе - оно было разработано для полноформатных треков, быстрее, чем многие альтернативы, и, возможно, могло быть интегрировано в обработку в реальном времени.

Результаты не выглядели ахти. У меня было несколько тестовых файлов, которые я нашел на Youtube (подробнее о поиске тестового набора позже), и ни одна из нескольких версий REPET, похоже, не изолировала вокал до степени, необходимой для удаленной точности SND. Кроме того, REPET занимал больше времени, чем я мог подумать - для того, чтобы обработка в реальном времени стала возможной, время обработки должно быть как минимум меньше, чем продолжительность самой песни, но это не было в случае с REPET. Моя первоначальная наивность в отношении процесса вокальной изоляции превратилась в глубокую кроличью нору, и я начал исследовать десятки других алгоритмов вокальной изоляции в Интернете.

Я не буду вдаваться в подробности каждого из них, но этот процесс был полон препятствий. Во-первых, для большинства более привлекательных алгоритмов не было доступных реализаций с открытым исходным кодом. Я не думал, что это большая проблема, но мне было неприятно реализовывать технический язык обработки сигналов. Даже когда я мог реализовать алгоритм, им требовались гиперпараметры для работы, которые никогда не указывались в статьях. Если бы я выбрал значения по умолчанию, результаты были бы ужасными.

Я наконец нашел статью, в которой дается огромный обзор сообщества исследователей вокальной изоляции. Я узнал, какие типы алгоритмов подходят для полноформатных треков (что нам нужно), какие быстрее, какие создают больше искажений или меньше звуковых артефактов. Я также нашел nussl, библиотеку, реализующую несколько самых популярных алгоритмов, опубликованных на данный момент.

Nussl была находкой, хотя и не идеальной. Одной из основных проблем было устаревание: nussl был написан на Python 2 и использовал более старые версии Numpy, Scipy и PyTorch. Я потратил много времени на обновление этих функций и изменение этих операторов деления с истинного деления на классическое (спасибо, Python 3). Некоторые из них, казалось, полностью ломались, независимо от того, сколько я обновлял - алгоритмы глубокой кластеризации и PROJET зависали в течение нескольких часов, и я не знал, работают ли они все еще или что-то не так. Наконец, разобрав все это, я написал несколько коротких скриптов Python, которые вы можете найти в ветке master моего репозитория, чтобы запустить каждый из этих алгоритмов в моих нескольких тестовых файлах и сравнить результаты.

Однако алгоритма, который меня действительно впечатлил, не было даже в библиотеке nussl. Хотя nussl упростил эту задачу, результаты, которые давали эти алгоритмы, были не совсем тем, что я искал. Я нашел то, что мне нужно, в модуле глубокого обучения под названием MSS PyTorch вместе с улучшением под названием MaD TwinNet. TwinNet - это то, с чем я работал совсем недавно. Для этого требуется модель - авторы предоставляют предварительно обученную, но в настоящее время я обучаю свою собственную модель - но она необычайно быстрая и намного более точная, чем все, что я пробовал раньше. Я тестировал его на Rainfall Лиз Нельсон, по общему признанию, lowball с чистым вокалом и только акустической гитарой в фоновом режиме, но он намного превосходит предыдущие алгоритмы и работает в 7 раз быстрее, чем MSS PyTorch, немного превосходя его. 100 секунд для обработки 284-секундной песни. Немного изменив код, я создал конвейер из исходного смешанного аудиофайла → MaD TwinNet → изолированный вокал → SND. Хотя этот вокал все еще не идеален, я считаю, что с некоторой оптимизацией их может быть достаточно, чтобы удовлетворить наши потребности. Вы можете найти этот код и спецификации в phase1 ветке моего репозитория.

Наборы данных

Я также хочу кратко рассказать о наборах данных, которые я использовал. Мне нужен был большой набор, включающий как полноформатные, смешанные треки (так как это лучше всего имитирует то, что мы получили бы от Spotify), а также соответствующий несмешанный вокал. Сначала я использовал бесплатно загружаемый набор данных под названием MUSDB100, который, помимо прочего, содержал 100 полных микшированных треков и их вокальные файлы, но я понял, что треки на самом деле не были популярными песнями, а треки, полученные авторами от SoundCloud. Хотя это в основном приемлемо, и это набор данных, на котором авторы MaD TwinNet обучили свою модель, мне нужна была модель с коммерческими популярными песнями, чтобы мы могли автоматически получать текстовые данные.

Таким образом, я обратился к MedleyDB, набору данных, составленному профессорами Нью-Йоркского университета коммерчески доступных лицензионных песен и их изолированного вокала. Однако для доступа к набору данных требуется одобренный запрос из-за характера лицензии, по которой эти популярные песни предоставляются для исследовательских целей. В настоящее время я обучаю модуль MaD TwinNet на первой версии MedleyDB, которая включает около 100 полноформатных треков. Я жду доступа ко второй версии, в которой есть еще 55 треков, выпущенных совсем недавно. Будем надеяться, что модель, полученная в результате этого набора, может дать лучшие результаты для современной музыки.

Следующие шаги

Я думаю, что следующая фаза автосинхронизации будет сосредоточена в первую очередь на оптимизации этих алгоритмов изоляции голоса, реализации алгоритма расстановки переносов текста и создании приблизительной модели для синхронизации результатов этих двух алгоритмов. Помимо тестирования различных моделей, которые мы создаем для MaD TwinNet, я также хотел протестировать эти алгоритмы вокальной изоляции, поскольку они дали хорошие результаты, согласно статье журнала, на которую я ссылался выше. Я не совсем уверен, как я планирую объединить аудиослоговый анализ с текстовым слоговым анализом, поскольку данные, которые у меня есть, очень скудны и плохо документированы. Я мог бы подумать о получении короткой подписки на Musixmatch, чтобы я мог получать данные с тегами вручную. В любом случае, я еще не слишком много думал об этом, но уверен, что у CCExtractor есть ресурсы, чтобы помочь мне в этом. Вот и хороший этап 2!