HOLO — Система анализа музыки — Версия 2

    image

    Введение



    Чуть менее чем год назад я писал на Хабре статью про разрабатываемую мной программу под названием HOLO.image
    Если кратко, то программа «слушает» вашу музыкальную коллекцию и затем позволяет визуально исследовать массив собранных данных, а также составлять плейлисты похожих на заданные образцы композиций.
    Позитивные отзывы позволили сохранить энтузиазм. На связь даже выходил один человек, который предпринял попытку переписать приложение из .NET WinForms в WPF, но после некоторых промежуточных успехов внезапно скрылся из поля зрения. Я его не виню, так как понимаю что проект содержательно весьма тяжёлый, и будучи программистом по основной работе, уделять достаточно времени на HOLO было затруднительно.
    Тем не менее, я и сам затянул с релизом новой версии, но этому есть более позитивные причины, чем банальная лень.

    Возможности

    Вообще говоря, с точки зрения психологии восприятия звука, задача является очень субьективной. Каждый человек будет по-своему оценивать похожи ли Жанна Агузарова и Земфира, Led Zeppelin и Iron Maiden, System of a Down и Metallica. Но интенсивное тестирование на себе и знакомых показало что кое-какие вещи всё-таки можно выразить цифрами. Для каких-то жанров музыки лучше, для каких-то хуже.

    image

    Итак, на данный момент HOLO (The music amalgamation system) умеет следующее:

    Сбор (harvesting) информации о музыкальных записях на компьютере пользователя

    Относительно предыдущей версии был значительно переработан алгоритм как механической обработки файлов, так и статистической обработки звука. В частности, появилась возможность параллельной обработки файлов в несколько потоков.
    Статистическая обработка, если коротко, теперь выглядит следующим образом:
    1) Из файла извлекается фрагмент параметризуемой длины, начиная с 20% общей длины.
    2) Фрагмент нарезается на параметризуемое количество кусков с параметризуемым процентом перекрытия.
    3) Куски преобразуются к FFT-формату, подвергаются сглаживанию и очистке;
    4) Имея некоторый набор заранее подготовленных «центроидов», оценивается расстояние каждого куска до каждого из этих центроидов. Центроиды это спектрограммы специально выбранных фрагментов звука длиной 4096/44100 секунд.
    image

    5) Временная динамика расстояний до центроидов сворачивается в матрицу переходов фрагментов звучания композиции между центроидами. Например, если звук долгое время не меняется (в рамках расстояния до ближайшего центроида), то в диагональной ячейке матрицы переходов значение будет больше;
    6) Матрица переходов и является результатом работы статистической обработки.

    Сбор результатов в базу данных

    Тут изменений не произошло. Как и прежде, на благо страны трудится SQLite.
    image

    Формирование плейлиста на основе любого количества предоставленных образцов записей

    Здесь тоже изменений практически не произошло. Верхний левый список — содержимое базы данных. Нижний левый список — образцы для поиска. Правый список — результирующий плейлист. По нажатию на кнопку «Save and open...» создаётся .m3u8 файл, который открывает любая программа, распознающая M3U-плейлисты.
    image

    Визуализация статистики по каждому отдельному треку

    Это новая функция программы, которая позволяет визуализировать матрицу переходов (см. алгоритм статобработки выше).
    Сама по себе визуализированная матрица пользы для пользователя не несёт и является в основном декоративным элементом программы.
    Однако, зачастую, по ней можно наблюдать как те или иные композиции группируются возле разных центроидов.
    imageimageimage

    Визуализация базы данных целиком

    А вот это, пожалуй, наиболее сложная и свежая функциональность.
    Первый способ визуализации — классический scatter plot. Проблема заключается в том, что данных для его построения в БД слишком много — при семи центроидах матрица перехода содержит 49 элементов, соответственно, мы имеем дело с 49 координатами каждого обработанного файла. При этом очень часто до половины этих координат бывают равны нулю, что тоже не добавляет к наглядности. На помощь пришёл анализ главных компонент, при помощи которого удаётся свернуть значительную часть полезной информации в 5-7 измерений, которые можно визуализировать при помощи двух координат на плоскости, плюс три координаты цвета RGB. В результате scatterplot базы данных представляет собой разноцветное облако, которое, впрочем, можно довольно гибко параметризовать, а также сдвигать и масштабировать.
    image

    Второй способ визуализации — график на параллельных координатах. В данном варианте большое количество координат представляются в виде соответствующего количества параллельных осей, а каждая композиция представляется в виде ломаной, проходящей через точку на каждой из осей. Для лучшей наглядности, ломаные заменяются на сплайны, и поэтому график выглядит как заплетённая коса. Разумеется, для косы также оказывается полезно сжатие данных при помощи анализа главных компонент.
    image

    А попробовать?

    Если вы пользуетесь Windows XP и новее, у вас стоит .NET Framework 4.0, а также установлен ACM-кодек для чтения MP3-файлов (не спрашивайте как проверить его наличие, сам не знаю), то можете попробовать дистрибутив, который находится здесь.
    Любителям поизучать исходный код придётся подождать пока будет настроен нормальный репозиторий.

    Преимущества

    Анализировались аналогичные решения от Apple, Google, Pandora Radio, Last.fm. Во всех случаях поиск ведётся по метаданным, что как минимум неспортивно, а как максимум, субьективно и подвержено мнениям живых оценщиков.
    В отличие от них, HOLO пока является беспристрастным рецензентом и рекомендателем, системой «без учителя». Слово «пока» я употребил потому что планирую внедрить некое подобие подстройки под вкусы пользователя, вспомогательной подсистемы обучения с учителем.
    Ну и, конечно, большой плюс в том что любой пункт плейлиста находится в вашем распоряжении, никакого стриминга с удалённых серверов, всё под вашим контролем.

    Ограничения

    К сожалению, не обошлось и без них:
    1) Пока только Win-платформа;
    2) Пока только MP3-файлы 44.1кГц 16 бит;
    3) При размере базы больше чем 10 тысяч треков х 10 центроидов (~1 млн. записей в БД) скорость формирования плейлиста начинает превышать полминуты и пока не распараллеливается;
    4) Возобновлять сбор БД нельзя, только начать заново;
    5) Указать несколько папок или исключить папки для сбора пока нельзя, используйте символьные ссылки;
    6) Для сколь-нибудь приемлемой скорости набора БД, треки «прослушиваются» не целиком, только фрагмент длиной от 1 до 3 минут. Поэтому всё что не попало в эти рамки не влияет на анализ и формирование плейлистов. Это является одной из наиболее частых причин возгласов «WTF?!» при прослушивании плейлиста.
    7) Но это не единственная причина, к сожалению. Отбросив все метаданные о файлах, качество поиска пока ещё не идеальное, прошу понимать. Но в ~80% случаев плейлист будет состоять из вещей, похожих на образец по темпу, плотности звука, громкости и жанра в целом.

    Послесловие

    На данный момент программа разрослась до более чем сотни килобайт кода. В связи с тем, что программирование на C# не является моей профессией, то качество местами может потрясать воображение. Буду рад содержательным отзывам и добровольцам, которые смогли бы помочь в следующих аспектах:
    0) предложите наилучший способ обратной связи для тех кто захочет потестировать приложение у себя;
    1) подчистка говнокода до приличного состояния;
    2) оптимизация скорости работы, и по возможности, уход от SQLite для выполнения запросов;
    3) допиливание UI;
    4) расширение набора поддерживаемых кроме MP3 форматов до FLAC, AAC и OGG.
    5) уход от платформозависимой библиотеки NAudio, которая делает декодирование MP3 файлов. Это, пожалуй, единственное что не даст скомпилировать HOLO под Mono и, соответственно, запускать на всех поддерживаемых ею платформах.
    Пишите в ЛС.

    UPD: Репозиторий проекта находится здесь.
    Поделиться публикацией

    Комментарии 43

      +4
      Прочитал вашу предыдущую статью по ссылке, но так и не понял, как же с помощью вашей программы можно искать музыку, похожую на ту, что у меня уже есть.
        0
        Что конкретно нужно развернуть подробнее?
        Положим, у вас 10 тысяч песен в коллекции.
        Вы запускаете обработку всех песен и помещение результатов в базу данных.
        Затем вы выбираете одну песню, нажимаете кнопку «Найти» и получаете плейлист, отсортированный по убыванию похожести на образец.
        Если речь не об этом, то поясните в чём?
          0
          Да, речь об этом. Теперь понятно. То есть, это не поиск новой музыки, похожей на ту, что есть в коллекции. Это поиск в коллекции музыки, похожей на ту, что я выбрал сам.
        +4
        Какие красивые графики на параллельных координатах получаются! Еще бы осмыслить, что они значат (широту разброса треков по анализируемым параметрам?).
        Проект очень интересный.
          +1
          Да, именно широту разброса и означают. Только после анализа главных компонент получившиеся анализируемые параметры теряют человекочитаемый смысл, зато прибавляют в математическом смысле.
          0
          Обновил путь поиска музыки, но прежде чем его прописать программа начала сканировать всё что внутри этой папки. Короче хард повис :)
            0
            Извиняюсь, такие казусы у меня тоже бывали. Лучше сразу указывать нужный путь полностью.
            +2
            Какова причина 20%? В тексте статьи не заметил.

            К поддерживаемым форматом еще alac было бы приятно добавить.

            Способ: github
              0
              Причина 20% ошибок при составлении плейлиста? Это значение среднее, и от жанра к жанру оно может колебаться в обе стороны.
              Её порождает, конечно же, несовершенство алгоритма статистической обработки — основная компонента программы, которую я планирую развивать дальше.
                0
                Люто плюсую за гитхаб.
                Решит все Ваши проблемы по аспектам с 0-го по 5-ый, и с GUI тоже.
                Если найдёте желающих помогать с Вашим кодом.

                UPD: глянул предыдущий пост и обнаружил github.com/johnnybuggy/holo

                нынче я в непонятках…
                  0
                  Один раз мне таки удалось закоммитить туда, больше не получалось…

                  И да, кстати, как лучше всего искать желающих в английских интернетах? Где обычно делают анонсы?
                    0
                    Hacker News, Reddit
              +11
              Коллега, рекомендую почитать работы вот этих ребят www.mtg.upf.edu/
              Конкретно вот эту публикацию mtg.upf.edu/system/files/publications/bogdanov_IPM2012.pdf
              Автор вроде как уже защитился, так что информация вполне себе полезная должна быть.

              Для возможности рекомендаций стоит добавить отправку «сэмплов» на сервер и их каталогизировать, использую мета-данные из публичных баз (last.fm, freebase etc.), не знаю правда как к этому отнесутся правообладатели, но тем не менее. Отправлять пользователя к его же музыке это не очень полезно.

              Проблема content-based систем (а иначе вашу и не назовёшь) в том, что рекомендации будут очень сильно похожи на то, что слушает человек. Хотя, в случае экспериментальных или смешанных жанров вы можете получить вовсе бредовые вещи. Взять к примеру кусок какого-нибудь djent трека и часть его будет похожа на что-то инструментальное, часть на электронное. Тут как «повезёт» с куском. Для устранения проблемы обычно используются гибридные системы, куда вам и советую копать.

              Я сейчас пытаюсь зайти несколько с другой стороны, использовать семантическую сеть для алгоритма рекомендаций (в качестве информационной базы используются всё те же публичные БД). Пока всё на зачаточной стадии (первый семестр докторантуры), но в направление верю :)
                +3
                Как я понял по этой и предыдущей статье, цель автора — не найти новую музыку по предпочтениям, а собрать плейлист похожего из того, что уже есть, «под настроение».
                Так что
                > рекомендации будут очень сильно похожи на то, что слушает человек
                это скорее фича.
                  +2
                  Да, вы совершенно правы.
                  +1
                  Да, судя по первой части статьи, то что они делают очень похоже на то что делаю я. Отличие, при беглом осмотре, в том что они пытаются притянуть к произвольному звуку привычные характеристики типа жанра, темпа, мелодичности, экспрессии и т.д. Я считаю это не совсем правильным, так как есть жанры где всё кроме ярлыка самого жанра, определить невозможно (Merzbow — Pulse Demon), но композиция тем не менее входит, пусть и на окраину общего звукового континуума, который можно наблюдать на моём скриншоте про Scatterplot собранной базы данных.

                  Насчёт попадание кусков из разных жанров в одном треке, для примера положим 40% металл, 60% мелодекламация голосом. Чаще всего это будет приводить к тому что в плейлисте будут находиться треки с такой же комбинацией — 40% металла и 60% декламации. Ну или с перекосом в ту или другую сторону, если точных совпадений найдено не будет.
                    +1
                    Отличие, при беглом осмотре, в том что они пытаются притянуть к произвольному звуку привычные характеристики типа жанра, темпа, мелодичности, экспрессии и т.д. Я считаю это не совсем правильным, так как есть жанры где всё кроме ярлыка самого жанра, определить невозможно (Merzbow — Pulse Demon), но композиция тем не менее входит, пусть и на окраину общего звукового континуума, который можно наблюдать на моём скриншоте про Scatterplot собранной базы данных.

                    «Притягивание» характеристик делается как раз для того, чтобы «разбавить» рекомендации и очередная попытка привести такую субъективную область к чему-то формальному. На словах типа «мне кажется» науку не сделаешь. Другой человек просто не сможет этим адекватно воспользоваться как базой. Да, я тоже не очень разделяю их методику, но на абстрактные проценты тоже полагаться нельзя.

                    Послушав трек, что вы привели, я был полностью солидарен с last.fm в плане тегов. Noise/experimental/industrial. Даже описание исполнителя об этом говорит. И на сигнале вы должны будете увидеть характерный график для шума по идее.
                    Насчёт попадание кусков из разных жанров в одном треке, для примера положим 40% металл, 60% мелодекламация голосом. Чаще всего это будет приводить к тому что в плейлисте будут находиться треки с такой же комбинацией — 40% металла и 60% декламации. Ну или с перекосом в ту или другую сторону, если точных совпадений найдено не будет.

                    Вы анализируете не весь трек, разве нет?

                    Музыка субъективна и в качестве анализа качества рекомендаций вы всё равно будете использовать людей. Может стоит на них и ориентироваться, а не на машинный процент?

                    Используйте всю выборку пользователя и на основе неё сделайте статистический вывод о процентном соотношении треков определённого вида (ок, вам не нравится слово «жанр») у пользователя. Дальше из глобальной БД сэмплов можно выбирать похожие треки и в таком же процентном отношении отдавать их пользователю.
                      0
                      Используйте всю выборку пользователя и на основе неё сделайте статистический вывод о процентном соотношении треков определённого вида (ок, вам не нравится слово «жанр») у пользователя. Дальше из глобальной БД сэмплов можно выбирать похожие треки и в таком же процентном отношении отдавать их пользователю.

                      Изначальная цель стоит не совсем так.
                      Довольно часто среди знакомых и на околомузыкальных форумах я слышу «О, а посоветуйте ещё что-нибудь в духе XXX?». В таком случае мы скармливаем наиболее характерные комозиции XXX в качестве образца, на выходе получаем список похожих вещей. У меня это отлично работает почти для всех вариаций рок-музыки.
                        0
                        Но вы всё равно в таком случае ограничены своей фонотекой. Свою фонотеку, как правило, все знают и без софта.
                          0
                          У меня более 100тысяч треков, я знаю далеко не всё :)
                  0
                  Мне кажется идея сама по себе великолепна, смущают вот эти ваши «Центроиды» — спектрограммы специально выбранных фрагментов звука.

                  Правильно ли я понимаю, что это сделано для простоты и по идее надо сравнивать фрагменты «каждый с каждым»?

                  Как насчет сложных композиций? Что если 20% фрагмент попал на нехарактерный участок?
                    0
                    Центроиды носят служебную функцию опорных значений, и их форма выбрана по принципу отличаться друг от друга как можно сильнее, как по громкости, так и по корреляции графика частот.
                    +1
                    У меня возникла задача отсортировать свою коллекцию по темпу композиций (в основном для «режимов» ходьбы, бега и занятий прочим спортом) в ударах в минуту. Коллекция большая, из файлов разных форматов, местами ogg или ape+cue, много композиций с переменным ритмом.
                    Как я понял из статьи (а понял я плохо :( ), подобной возможности в программе нет. Планируется? И если нет, то вы случайно не знаете, какая софтина мне может помочь?

                    И по статье: не могли бы вы для наглядности добавить какой-нибудь составленный программой плейлист похожих на заданную более-менее широко известных композиций?
                      0
                      Возможно в будущем я сделаю выделение человекопонимаемых компонент звука, в частности темпа. Пока темп, как и другие характеристики, зашит просто в совокупность числовых показателей.
                      Но вы можете попробовать, тем не менее. Что-то хорошее может получиться.
                      0
                      Пробежал глазами статью два раза, но так и не понял, какую именно полезную информацию можно извлечь из музыки при помощи сабжа.

                      Понял только, что она строит забавные визуализации, построенные, по сути, с использованием mp3'шек в качестве random seed.
                        0
                        Из звука каждого из файлов извлекаются количественные features, и затем визуализируются разными способами. Где вы там увидели random seed я, честно говоря, не понял.
                          0
                          Я имел в виду, что эти ваши features совершенно ничего не говорят пользователю. Это просто seed для построения причудливых графиков.
                            0
                            А если например два чёрно-белых изображения сравниваются по гистограммам, то значения гистограммы вы тоже назовёте сидом рандома? По-моему это некорректно.
                              0
                              Гистограмма несет человеку полезную информацию. Фотограф, например, может оценить, насколько кадр получился светлый или темный, не полагаясь на цветопередачу убогого экранчика фотоаппарата, который к тому же слепнет на солнце.

                              А вот если на гистограмму наложить еще десяток других графиков, каждый из которых по отдельности что-то значит (хотя не факт, что пользователю есть хоть какой-то толк от каждого из них), да так, что нельзя отличить, какая линия какому показателю соответствует — получится ерунда.

                              Для человека это — произведение спорного искусства, а не средство анализа, как вы заявляете в заголовке статьи.

                              Для машины — может, она и сможет находить похожие изображения по каким-то формальным критериям, но что толку? Для человека важно содержательное сходство, а критерии типа «отношение средней плотности зеленого цвета в строке к количеству строк» (я утрирую, конечно) будет ставить в один ряд изображения, совершенно нерелевантные с точки зрения человека.

                              PS Дискуссия напомнила, как в South Park S15E4 мерялись пиписьками. Каждый придумывал свою формулу так, чтобы характеристики именно его члена дали наибольший результат. Какого-то математического или физического смысла эти формулы, конечно, не содержали.
                        0
                        А в чем преимущество устранения учителя, если конечная цель — это выработка вкуса единственного пользователя этой программы? Почему бы не сделать какой-нибудь плагин, ненавязчиво слушающий вместе с пользователем его плей-лист и настраивающий свою нейронную сеть на основании собранных вами семплов, а потом уже кластеризующий весь остальной непрослушанный объем музыки? Если эти субъективные мнения, выраженные в нейронных сетях, слить в облако, то можно получить и некое подобие объективной кластеризации.
                          0
                          Дело как раз в том что я не пытаюсь подстроиться под вкус слушателя. Точнее как, я беспристрастно пытаюсь найти что-то похожее на то что подано в качестве образца.
                            0
                            Ну, тогда боюсь, программа представляет исключительно научный интерес и результаты будет давать непредсказуемые. Музыкальная гармония — понятие до конца не формализованное на уровне кластеризации оных. Тем более для нескольких инструментов одновременно.
                          0
                          Я вот уже давно не слушаю mp3 с компа-потому что реально надоедает одно и тоже слушать по 10 раз. Я перешел на online станции, и неплохо бы было, чтобы Вашу программу можно было напускать на потокове вещание с тем чтобы она давала рекомендации к тому что слушать.
                            0
                            Всему своё время ;-)
                            +1
                            На Coursera сейчас начался курс Introduction to Recommender Systems — посмотрите, возможно, вам был бы полезен.
                              0
                              Экспериментирую) Подсунул программе AC/DC — Highway to hell.
                              Среди топ10 соответствий оказались 3 песни КиШ.
                              Много думал оО
                                0
                                Всё зависит от того какой объём библиотеки вы обработали и какие жанры она охватывает.
                                Затем, нужно абстрагироваться от названий групп и слушать только звук.
                                И наконец, если в библиотеке нет ничего похожего по звучанию, то программа предлагает просто ближайшие композиции. Я бы мог задать пороговое значение, различия выше которого не допускались бы, но тогда могут возникать ситуации что похожих песен и нет.
                                  0
                                  Библиотека размером в 26К композиций. Ищет похожие кстати очень долго, порядка 5-10 минут.
                                    0
                                    Насчёт скорости выполнения запросов сейчас очень активно думаю.
                                    Можете накидать пару-тройку получающхся у вас плейлистов, если не хотите публично, можно в ЛС. Спасибо.
                                +1
                                Анализировались аналогичные решения от Apple, Google, Pandora Radio, Last.fm. Во всех случаях поиск ведётся по метаданным, что как минимум неспортивно, а как максимум, субьективно и подвержено мнениям живых оценщиков.
                                В отличие от них, HOLO пока является беспристрастным рецензентом и рекомендателем, системой «без учителя».


                                Во-первых, из приведенных только Pandora является чисто expert-based RS. А вот Last.fm насколько мне известно, коллаборативная (ну на самом деле гибридная, скорее всего).

                                Во-вторых, content-based рекомендательные системы могут давать неплохое разнообразие и приятно удивить пользователя (diversity и serendipity), но они очень и очень сильно подвержены, скажем так, «упячкам». То есть периодически вы будете рекомендовать что-то очень и очень странное. Почитайте ocelma.net/MusicRecommendationBook/index.html, там много интересного, в том числе и такого рода исследования.

                                В-третьих, вам как информация к размышлению: генерация плейлистов очень и очень сильно отличается от просто генерации списка похожих. То есть удовлетворение пользователя зависит во многом от того, в каком порядке ему одни и те же треки играть. В этом направлении есть много исследований и даже софта (для создания плейлистов радиостанций).

                                А вообще, это классный проект, вы большой молодец, что смогли в одиночку создать такую систему. Плюс идея интересная — ведь вы анализируете коллекцию пользователя! Удачи вам, я верю, что ваш продукт найдет свою нишу.
                                Рекомендательные системы затягивают, очень интересная область. Сам не могу оторваться =) Правда, я больше в коллаборативной фильтрации работаю, в content-based ничего не смыслю. Надо наверстывать…
                                  0
                                  Спасибо вам за дополнительную полезную информацию.
                                    0
                                    Во-вторых, content-based рекомендательные системы могут давать неплохое разнообразие и приятно удивить пользователя (diversity и serendipity), но они очень и очень сильно подвержены, скажем так, «упячкам». То есть периодически вы будете рекомендовать что-то очень и очень странное

                                    При большом размере «аудитории» Collaborative filtering делает то же самое. При малом — проблема «холодного старта».
                                    Но в любом случае 100% сейчас не даёт ничего. Впрочем, это скорее проблема людей, а не ПО :)
                                    0
                                    Анализировались аналогичные решения от Apple, Google, Pandora Radio, Last.fm. Во всех случаях поиск ведётся по метаданным

                                    Есть еще Echo Nest. Насколько я знаю, у них как раз анализируется музыка.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое