Можно ли увидеть, являются ли два файла MP3 одной песней, проанализировав байты файлов? - PullRequest
2 голосов
/ 19 декабря 2010

Это должно быть сделано в C ++ или C .... Я знаю, что мы можем прочитать метаданные MP3, но эта информация может быть изменена кем угодно, не так ли?Так есть ли способ проанализировать содержимое файла и сравнить его с другим файлом и определить, действительно ли это та же самая песня?Я думал о.Совсем не хорошая попытка сделать это.

Ответы [ 7 ]

13 голосов
/ 19 декабря 2010

Это возможно, но очень сложно.

Даже одна и та же оригинальная запись может кодироваться по-разному различными кодировщиками MP3 или одним и тем же кодером с разными настройками ... что приводит к разным результатам, когда MP3 затем декодируется . Вам нужно разработать звуковую модель, чтобы «понять», насколько велики различия, и вынести суждение.

Тогда дело в разных записях. Если я спою «Однажды в королевском городе Дэвида» и Алед Джонс поет, это одна и та же песня? Что делать, если есть две разные версии песни, в которой есть слегка измененная лирика? Клавиша может быть другой, она может быть в другом вокальном диапазоне - все виды вещей.

Насколько разными могут быть две песни, но они все равно считаются "одной песней"? Как только вы решили, что есть небольшое дело реализовать его;)

4 голосов
/ 19 декабря 2010

Если бы мне действительно пришлось это сделать, моей первой попыткой было бы взять преобразование Фурье обеих песен и сравнить гистограммы. Вы можете использовать FFTW (http://www.fftw.org/), чтобы взять преобразование Фурье, а затем сравнить гистограммы, суммируя квадраты разностей на каждой частоте. Если результирующая сумма больше некоторого порога (который вы должны определить экспериментально), тогда песни считаются разными, в противном случае они одинаковы.

2 голосов
/ 19 декабря 2010

Нет. Не так просто.

Вы можете проверить, что они содержат одинаковые закодированные данные, НО:

  • Может быть другой битрейт
  • Может быть та же самая песня, всего 1/100 секунды от

В обоих случаях байты не будут совпадать.

По сути, если решение выглядит слишком простым, чтобы быть правдой, это часто так.

1 голос
/ 27 декабря 2010

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

Если файлы были созданы разными кодировщиками, вам придется извлечь несколько «нечетких»"Особенности ключей от данных и сравнить эти ключи.В спешке я, вероятно, построю алгоритм, подобный следующему:

  • Декодирование аудио в импульсно-кодовую модуляцию (волну) со стандартной скоростью передачи битов.
  • Поиск фиксированного числа запускаемых функцийточки с использованием некоторого алгоритма динамического определения местоположения.Например, найдите 10 самых высоких пиков волны, упорядоченных от начала волны или просто равномерно распределенных по волне (хотя было бы неплохо динамически зафиксировать первую и последнюю позиции, поскольку разные кодировки могут не начинаться и заканчиваться в одной и той же точке.).Улучшение будет состоять в том, чтобы выбирать характерные точки в позициях в волне, которые вряд ли будут слишком повторяющимися.
  • Извлечение набора одномерных скаляров функциональных клавиш из характерных точек.Например, для каждого признака нормализуйте следующие значения n-выборки и посчитайте количество пересечений нуля, отношение пика к среднему, среднее расстояние пересечения нуля, энергию сигнала.Цель состоит в том, чтобы извлечь надежные функции, которые являются относительно уникальными, но при этом остаются характерными, даже если к сигналу добавляется шум и искажения.Очевидно, что это можно улучшить почти бесконечно.
  • Сравните извлеченные функциональные ключи двух файлов с использованием некоторого измерения точности (например, 9 из 10 извлеченных функциональных возможностей должны совпадать по крайней мере на 99% на 4 из 5их извлеченные функциональные ключи).

Преимущество подхода извлечения функций состоит в том, что вы можете создать базу данных функций для всех ваших mp3-файлов и для одного файла задать вопрос: Какие другие медиа-файлыимеют точно или почти точно такую ​​же функцию, как этот.Поиск признаков может быть реализован очень эффективно с помощью R * -деревьев или аналогичных, которые могут быть использованы для быстрого измерения расстояния между n-мерными наборами признаков.

Вышеупомянутая методика по сути является вариантом того, чтоиспользуется в алгоритмах поиска изображений, таких как SIFT, который, вероятно, является основой такого приложения, как Photosynth и Google Goggles.При поиске изображения вы фильтруете изображение на предмет хороших точек-кандидатов для относительно уникальных объектов (таких как углы фигур), затем вы нормализуете область вокруг этого объекта, чтобы получить нормализованный цвет, интенсивность, масштаб и направление объектов.Наконец, вы извлекаете элементы и ищите в n-мерной базе данных признаков других изображений и проверяете, что найденные объекты в других изображениях геометрически расположены по тому же шаблону, что и в вашем поисковом изображении.Техника поиска аудио будет такой же, только проще, поскольку звук одномерный.

1 голос
/ 19 декабря 2010

Если вы имеете в виду «одну и ту же песню» в смысле «одна и та же запись» iTunes , можно сравнить два аудиофайла, но не байтовое сравнение кодированного файла, поскольку даже для одного и того же формата существуют переменные, такие как скорость передачи данных и сжатие, которые выбираются во время кодирования.

Кроме того, каждое кодирование одной и той же записи может включать в себя разные периоды ввода / вывода, разную амплитуду и эквалайзер, и может происходить из разных оригинальных источников (винил, CD, оригинальный мастер и т. Д.). Поэтому вам нужен метод сравнения, который учитывает все эти переменные, и даже в этом случае вы получите «вероятность» совпадения, а не окончательного совпадения.

Если вы действительно имеете в виду «одну и ту же песню», т.е. любую запись любого исполнителя с одинаковым составом и лирикой, то вы вряд ли получите высокую статистическую корреляцию в большинстве случаев, поскольку высота, темп, диапазон, инструментальная аранжировка будут очень разные.

В сценарии "та же запись" могут применяться относительно простые методы обработки сигналов и статистики, в сценарии "та же самая песня" должны использоваться методы ИИ, и даже тогда результаты, которые я подозреваю, будут неудовлетворительными.

0 голосов
/ 28 апреля 2018

Я думаю, что подход быстрого преобразования Фурье (БПФ), подсказанный jstanley , довольно хорош для большинства случаев использования; в частности, он работает для проверки того, что эти две версии одного и того же исполнителя / одного и того же исполнителя / одного и того же битрейта / качества звука.

Чтобы быть более точным, sox и spek (через командную строку и графический интерфейс соответственно) могут сделать это довольно безболезненно.

Spek довольно надежный - просто откройте программное обеспечение и укажите его на два аудио файла.

sox может генерировать спектрограммы (БПФ) из командной строки так: sox "$file" -n spectrogram -o "$outfile".

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

Например, я хотел проверить, есть ли эти два файла:

  1. Soundtrack to an imaginary film mixtape 2011.mp3
  2. DJRUM - Sountrack to an imaginary film mixtape 2011 (for mary-anne hobbs).mp3

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

Soundtrack to an imaginary film mixtape 2011.mp3

DJRUM  - Sountrack to an imaginary film mixtape 2011 (for mary-anne hobbs).mp3

0 голосов
/ 05 июля 2011

Используйте библиотеку EchoPrint с открытым исходным кодом для создания подписи двух аудиофайлов и сравнения их друг с другом.

Библиотека очень проста в использовании и имеет четкие примеры того, как создавать подписи.

http://echoprint.me/

Вы даже можете запросить их базу данных с помощью подписи и найти соответствующие метаданные песни (например, название, исполнитель и т. Д.).

...