Audio AI: выделяем вокал из музыки с помощью свёрточных нейросетей |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-02-22 01:51 алгоритмы машинного обучения, реализация нейронной сети, алгоритмы распознавания речи Взлом музыки для демократизации производного контента
Отказ от ответственности: вся интеллектуальная собственность, проекты и методы, описанные в этой статье, раскрыты в патентах US10014002B2 и US9842609B2. Вот бы вернуться в 1965 год, постучать в парадную дверь студии «Эбби-Роуд» с пропуском, зайти внутрь — и услышать настоящие голоса Леннона и Маккартни… Что ж, давайте попробуем. Входные данные: MP3 среднего качества песни «Битлз» We Can Work it Out. Верхняя дорожка — входной микс, нижняя дорожка — изолированный вокал, который выделила наша нейросеть.
Я занимался обработкой сигналов и изображений ещё до того, как распространился лозунг «глубокое обучение решает всё», поэтому могу представить вам решение в качестве путешествия feature engineering и показать, почему для этой конкретной проблемы нейросеть оказывается лучшим подходом. Зачем? Очень часто я вижу, как люди пишут что-то вроде такого: «С глубоким обучением больше не нужно беспокоиться о выборе признаков; оно сделает это за вас» или ещё хуже… «Разница между машинным обучением и глубоким обучением [погодите… глубокое обучение это по-прежнему машинное обучение!] в том, что в ML вы сами извлекаете признаки, а в глубоком обучении это происходит автоматически внутри сети». Вероятно, такие обобщения исходят из того факта, что DNN могут быть очень эффективны при изучении хороших скрытых пространств. Но так обобщать нельзя. Меня очень расстраивает, когда недавние выпускники и практики поддаются вышеуказанным заблуждениям и принимают подход «глубокое-обучение-решает-всё». Мол, достаточно набросать кучу необработанных данных (пусть даже после небольшой предварительной обработки) — и всё заработает как надо. В реальном мире нужно заботиться о таких вещах, как производительность, выполнение в реальном времени и т. д. Из-за таких заблуждений вы очень надолго застрянете в режиме экспериментов… Feature Engineering остаётся очень важной дисциплиной при проектировании искусственных нейронных сетей. Как и в любой другой технике ML, в большинстве случаев именно она отличает эффективные решения уровня продакшна от неудачных или неэффективных экспериментов. Глубокое понимание ваших данных и их природы по-прежнему очень много значит… От А до Я Хорошо, я закончил проповедь. Теперь разберёмся, зачем мы здесь собрались! Как и с любой проблемой по обработке данных, сначала посмотрим, как они выглядят. Взглянем на следующий фрагмент вокала из оригинальной студийной записи.
Не слишком интересно, верно? Ну, это потому что мы визуализируем сигнал во времени. Здесь мы видим только изменения амплитуды с течением времени. Но можно извлечь всякие другие штуки, такие как амплитудные огибающие (envelope), среднеквадратичные значения (RMS), скорость изменения с положительных значений амплитуды на отрицательные (zero-crossing rate) и т. д., но эти признаки слишком примитивны и недостаточно отличительны, чтобы помочь в нашей проблеме. Если мы хотим извлечь вокал из аудиосигнала, для начала нужно каким-то образом определить структуру человеческой речи. К счастью, на помощь приходит оконное преобразование Фурье (STFT).
Хотя я люблю обработку речи и определённо люблю играться с моделированием входного фильтра, кепстром, сачтотами, LPC, MFCC и так далее, пропустим всю эту ерунду и сосредоточимся на основных элементах, связанных с нашей проблемой, чтобы статья была понятна как можно большему числу людей, а не только специалистам по обработке сигналов. Итак, что же говорит нам структура человеческой речи? Ну, мы можем определить здесь три основных элемента:
Первая попытка с применением правил Давайте на секунду забудем, что называется машинным обучением. Можно ли разработать метод извлечения вокала на основе наших знаний о сигнале? Позвольте попробовать…
Если мы достойно поработаем, результатом должна стать мягкая или битовая маска, применение которой к амплитуде STFT (поэлементное умножение) даёт приблизительную реконструкцию амплитуды STFT вокала. Затем мы объединяем эту вокальную STFT с информацией о фазе исходного сигнала, вычисляем обратный STFT и получаем временной сигнал реконструированного вокала. Делать это с нуля — уже большая работа. Но ради демонстрации применим реализацию алгоритма pYIN. Хотя он предназначен для решения шага 3, но с правильными настройками весьма прилично выполняет шаги 1 и 2, отслеживая вокальную основу даже в присутствии музыки. Пример ниже содержит выходные данные после обработки этим алгоритмом, без обработки невокализированной речи.
Что произойдёт, если вокал обработан реверберацией, задержками и другими эффектами? Давайте взглянем на последний припев Арианы Гранде из этой песни.
Гипотеза: использовать нейросеть как передаточную функцию, которая транслирует миксы в вокалы Глядя на достижения свёрточных нейросетей в обработке фотографий, почему бы не применить здесь такой же подход? Нейросети успешно решают такие задачи, как расцвечивание изображений, повышение резкости и разрешенияВ конце концов, можно же представить звуковой сигнал «как изображение», используя кратковременное преобразование Фурье, верно? Хотя эти звуковые картинки не соответствуют статистическому распределению естественных изображений, у них всё равно есть пространственные закономерности (во времени и частотном пространстве), на которых можно обучать сеть. Слева: удар барабана и базовая линия внизу, несколько звуков синтезатора посередине, всё это смешано с вокалом. Справа: только вокал Проведение такого эксперимента было бы дорогостоящим мероприятием, поскольку трудно получить или сгенерировать необходимые учебные данные. Но в прикладных исследованиях я всегда стараюсь применять такой подход: сначала выявить более простую проблему, которая подтверждает те же принципы, но не требует много работы. Это позволяет оценить гипотезу, быстрее выполнять итерации и с минимальными потерями исправить модель, если она не работает как надо. Подразумеваемым условием является то, что нейросеть должна понимать структуру человеческой речи. Более простая проблема может быть такой: сможет ли нейросеть определить наличие речи на произвольном фрагменте звукозаписи. Мы говорим о надёжном детекторе голосовой активности (VAD), реализованном в виде бинарного классификатора. Проектируем пространство признаков Мы знаем, что звуковые сигналы, такие как музыка и человеческая речь, основаны на временных зависимостях. Проще говоря, ничто не происходит изолированно в данный момент времени. Если я хочу знать, есть ли голос на конкретном фрагменте звукозаписи, то нужно смотреть на соседние регионы. Такой временной контекст даёт хорошую информацию о том, что происходит в интересующей области. В то же время желательно выполнять классификацию с очень малыми временными приращениями, чтобы распознавать человеческий голос с максимально возможным разрешением по времени. Давайте немного посчитаем…
С вышеуказанными требованиями вход и выход нашего бинарного классификатора выглядят следующим образом: Модель С помощью Keras построим небольшую модель нейросети для проверки нашей гипотезы.
При разделении данных 80/20 на обучение и тестирование после ~50 эпох мы получаем точность при тестировании ~97%. Это достаточное доказательство, что наша модель способна различать вокал в музыкальных звуковых фрагментах (и фрагменты без вокала). Если проверить некоторые карты признаков из 4-го свёрточного слоя, то можно сделать вывод, что нейросеть вроде бы оптимизировала свои ядра для выполнения двух задач: отфильтровки музыки и отфильтровки вокала… Пример карты объектов на выходе 4-го свёрточного слоя. Видимо, выходные данные слева являются результатом операций ядра в попытке сохранить вокальный контент, игнорируя музыку. Высокие значения напоминают гармоническую структуру человеческой речи. Карта объектов справа кажется результатом выполнения противоположной задачи От детектора голоса к разъединению сигнала Решив более простую задачу классификации, как нам перейти к реальному выделению вокала из музыки? Ну, глядя на первый наивный метод, мы всё равно хотим как-то получить амплитудную спектрограмму для вокала. Теперь это становится задачей регрессии. Что мы хотим сделать, так это по конкретному таймфрейму из STFT исходного сигнала, то есть микса (с достаточным временным контекстом) рассчитать соответствующий амплитудный спектр для вокала в этом таймфрейме. Хотя такое представление ввода/вывода имеет смысл, после обучения нашей модели несколько раз, с различными параметрами и нормализациями данных, результатов нет. Кажется, мы просим слишком многого… Мы перешли от бинарного классификатора к регрессии на 513-мерном векторе. Хотя сеть в некоторой степени изучает задачу, но в восстановленном вокале всё равно есть очевидные артефакты и помехи от других источников. Даже после добавления дополнительных слоёв и увеличения количества параметров модели результаты не сильно меняются. И тогда встаёт вопрос: как обманом «упростить» для сети задачу, и при этом достичь желаемых результатов? Что если вместо оценки амплитуды STFT вокала обучать сеть получению бинарной маски, которая при применении к STFT микса даёт нам упрощённую, но перцептивно-приемлемую амплитудную спектрограмму вокала? Экспериментируя с различными эвристиками, мы придумали очень простой (и, безусловно, неортодоксальный с точки зрения обработки сигналов...) способ извлечения вокала из миксов с использованием бинарных масок. Не вдаваясь в подробности, суть в следующем. Представим выход как бинарное изображение, где значение ‘1’ указывает на преобладающее присутствие вокального контента на заданной частоте и таймфрейме, а значение ‘0’ указывает на преобладающее присутствие музыки в данном месте. Можем назвать это бинаризацией восприятия, просто чтобы придумать какое-то название. Визуально это выглядит довольно некрасиво, если честно, но результаты удивительно хороши. Теперь наша проблема становится своеобразным гибридом регрессии-классификации (очень грубо говоря...). Мы просим модель «классифицировать пиксели» на выходе как вокальные или не вокальные, хотя концептуально (а также с точки зрения используемой функции потерь MSE) задача по-прежнему остаётся регрессионной. Хотя это различие может показаться неуместным для некоторых, на самом деле оно имеет большое значение в способности модели изучить поставленную задачу, вторая из которых является более простой и ограниченной. В то же время, это позволяет нам сохранить нашу модель относительно небольшой по количеству параметров, учитывая сложность задачи, что-то очень желаемое для работы в реальном времени, что в данном случае было проектным требованием. После некоторых незначительных настроек окончательная модель выглядит так. Как восстановить сигнал временной области? По сути, как в наивном методе. В данном случае на каждый проход мы прогнозируем один таймфрейм бинарной маски вокала. Опять же, реализуя простое скользящее окно с шагом одного таймфрейма, продолжаем оценивать и объединять последовательные таймфреймы, которые в конечном итоге составляют всю вокальную бинарную маску. Создание обучающего набора Как вы знаете, одна из главных проблем при обучении с учителем (оставьте эти игрушечные примеры с готовыми датасетами) — правильные данные (по количеству и качеству) для конкретной проблемы, которую вы пытаетесь решить. Исходя из описанных представлений ввода и вывода, для обучения нашей модели сначала понадобится значительное количество миксов и соответствующих им, идеально выровненных и нормализованных вокальных треков. Такой набор можно создать несколькими способами, и мы использовали комбинацию стратегий, начиная от ручного создания пар [микс <-> вокал] на основе нескольких а капелл, найденных в интернете, до поиска музыкального материала рок-групп и скрапинга Youtube. Просто чтобы дать вам представление, насколько это трудоёмкий и болезненный процесс, частью проекта стала разработка такого инструмента для автоматического создания пар [микс <-> вокал]: Нужно действительно большое количество данных, чтобы нейросеть выучила функцию переноса для трансляции миксов в вокал. Наш окончательный набор состоял примерно из 15 млн образцов по 300 мс миксов и соответствующих им вокальных бинарных масок.Архитектура конвейера Как вы наверное знаете, создать модель ML для конкретной задачи — только полдела. В реальном мире нужно продумать архитектуру программного обеспечения, особенно если нужна работа в реальном времени или близком к нему. Наверное, я сказал достаточно, так почему бы не послушать парочку примеров!? Daft Punk—Get Lucky (студийная запись)
Adele—Set Fire to the Rain (живая запись!)
Да, и «ещё кое-что»… Если система работает для вокала, почему бы не применить её к другим инструментам...? Статья и так довольно большая, но учитывая проделанную работу, вы заслуживаете услышать последнее демо. С точно такой же логикой, как при извлечении вокала, мы можем попытаться разделить стереомузыку на составляющие (барабаны, басы, вокал, другие), сделав некоторые изменения в нашей модели и, конечно, имея соответствующий набор обучения :).
Источник: habr.com Комментарии: |
|