Сравнение звуковых файлов, если они не полностью идентичны
Есть ли способ программно сравнить два звуковых файла, чтобы определить, идентичны они или почти идентичны? Это не mp3-файлы и не содержат ID3 или других метаданных, а представляют собой обычные wav-файлы. Сравнение значений контрольной суммы может не работать, так как они могут быть не полностью идентичными.
4 ответа
В статье Википедии об акустической дактилоскопии упоминается ряд продуктов, включая libfooid с открытым исходным кодом. По сути, вы рассматриваете возможность перехода в частотную область, принимая грубые уровни в относительно небольшом количестве полос (скажем, 32), чтобы получить строку, которая представляет собой что-то вроде 25 мс звука, сделать это для всего файла, а затем выполнить нечеткое сравнение этих строк для разных файлов. Это довольно сложно, но нужно сделать - сравнение реальных сэмплов ни к чему не приведет, так как простое изменение громкости на несколько процентов приведет к потере всего соответствия.
Процесс сравнения набора звуков по сходствам называется " Индексирование аудио на основе контента", " Извлечение" и " Отпечатки пальцев" в исследованиях в области компьютерных наук.
Один из способов сделать это состоит в том, чтобы:
1) Выполнить несколько бит обработки сигнала для каждого аудиофайла, чтобы извлечь такие функции, как высота тона во времени, частотный спектр, автокорреляция, динамический диапазон, переходные процессы и т. Д.
2) Поместите все функции для каждого аудиофайла в многомерный массив и поместите каждый многомерный массив в базу данных.
3) Используйте методы оптимизации (такие как градиентный спуск), чтобы найти лучшее соответствие для данного аудиофайла в вашей базе данных многомерных данных.
Хитрость, чтобы сделать эту работу хорошо, это какие функции
Есть несколько проектов, которые делают подобные вещи, включая MusicBrainz и EchoNest.
У Echonest есть один из самых простых API, которые я видел в этом пространстве. Очень легко начать.
PS Нет, я не работаю на Echonest и не знаю никого, кто там работает.
Одна вещь, которую вы могли бы попробовать, чтобы получить достаточно приличный отпечаток файла, - это преобразование Фурье и анализ распределения частот, присутствующих в файле. Все еще очень возможно сделать два очень разных звуковых файла, которые имеют одно и то же преобразование Фурье, но это несколько маловероятно, если ваши файлы поступают из не надуманного источника...
Вы можете сравнить два файла WAV по выборкам и рассчитать среднюю разницу по выборкам. Чтобы ускорить процесс, вы можете использовать тот же метод, но сравнить каждый 10-й образец или каждый 100-й образец и получить по существу одно и то же значение (два файла, которые не совпадают или даже близки, будут иметь огромную среднюю разницу для каждого образца).