Обнаружение высоты тона с помощью нейронных сетей
Я пытаюсь использовать ANN для определения высоты звука музыкальных нот. Сеть представляет собой простую двухслойную MLP, входы которой в основном представляют собой DFT (усредненные и логарифмически распределенные), а 12 выходов соответствуют 12 нотам определенной октавы.
В сети обучаются несколько сэмплов из этих 12 нот, сыгранных каким-либо инструментом (по одной ноте за раз), и несколько сэмплов "тишины".
Результаты на самом деле хорошие. Сеть способна точно определять те ноты, сыгранные на разных инструментах, они относительно шумные, и даже не теряют здравый смысл при воспроизведении песни.
Цель, однако, состоит в том, чтобы иметь возможность обнаруживать полифонический звук. Так что, когда две или более ноты играются вместе, сработают два соответствующих нейрона. Удивительно то, что сеть фактически уже делает это до некоторой степени (будучи обученным только на монофонических образцах), однако менее последовательно и менее точно, чем для монофонических нот. Мой вопрос: как мне улучшить способность распознавать полифнический звук?
Проблема в том, что я не совсем понимаю, почему это уже работает. Разные ноты (или их DFT) - это в основном разные точки пространства, для которых обучена сеть. Итак, я понимаю, почему он распознает похожие звуки (близлежащие точки), а не то, как он "завершает" вывод для комбинации нот (которые образуют отдаленную точку от каждого из обучающих примеров). Точно так же, как сеть AND, которая обучается по (0,0) (0,1) (1,0) = (0), не должна "делать вывод", что (1,1) = (1).
Грубая сила в этом заключается в том, чтобы обучить сеть как можно большему числу полифонических образцов. Тем не менее, поскольку сеть, кажется, как-то смутно уловила идею из однотонных семплов, здесь, вероятно, есть нечто более фундаментальное.
Есть указатели? (извините за длину, кстати:).
4 ответа
Причина, по которой он работает, вероятно, заключается в том, что вы просто не научили его выбирать один и только один выход (по крайней мере, я полагаю, что вы этого не сделали). В простом случае, когда выходные данные являются просто точечным произведением входных данных и весов, весовые коэффициенты становятся согласованными фильтрами для соответствующего шага. Поскольку все линейно, несколько выходов одновременно активируются, если несколько совпавших фильтров одновременно находят хорошие совпадения (как в случае полифонических нот). Поскольку ваша сеть, вероятно, содержит нелинейности, картина немного сложнее, но идея, вероятно, та же.
Что касается способов его улучшения, обучение с полифоническими образцами, безусловно, является одной из возможностей. Другая возможность - перейти на линейный фильтр. ДПФ полифонического звука - это, в основном, сумма ДПФ каждого отдельного звука. Вы хотите, чтобы линейная комбинация входов стала соответствующей линейной комбинацией выходов, поэтому подходит линейный фильтр.
Кстати, почему вы используете нейронную сеть для этого в первую очередь? Кажется, что просто взглянув на ДПФ и, скажем, взяв максимальную частоту, вам будет легче получить лучшие результаты.
Anssi Klapuri - уважаемый аудио-исследователь, который опубликовал метод для определения высоты звука при полифонической записи с использованием нейронных сетей.
Возможно, вы захотите сравнить метод Клапури с вашим. Он полностью описан в магистерской работе " Методы обработки сигналов для автоматической транскрипции музыки". Вы можете найти его многочисленные статьи в Интернете или купить его книгу, которая объясняет его алгоритм и результаты тестов. Его магистерская работа связана ниже.
https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf
Обнаружение высоты тона при полифонических записях является очень сложной темой и содержит много противоречий - будьте готовы много читать. Ссылка ниже содержит другой подход к обнаружению высоты тона при полифонической записи, который я разработал для бесплатного приложения под названием PitchScope Player. Мой исходный код C++ доступен на GitHub.com, и на него есть ссылки по ссылке ниже. Бесплатная исполняемая версия PitchScope Player также доступна в Интернете и работает в Windows.
Я экспериментировал с развитием CTRNN (непрерывной рекуррентной нейронной сети) для обнаружения разницы между двумя синусоидами. У меня был умеренный успех, но у меня никогда не было времени, чтобы проконтролировать группу этих нейронов (то есть в группах, похожих на улитковые).
Один из возможных подходов - использовать генетическое программирование (GP) для генерации коротких фрагментов кода, который обнаруживает высоту тона. Таким образом, вы сможете сгенерировать правило для определения высоты тона, которое, будем надеяться, будет читабельным для человека.