Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Как сравнить 2 аудио файла, возвращая процент разницы

#c_sharp #java #аудио #cpp


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


Ответы

Ответ 1



Предлагаю такой способ. Вначале строим "изображение сигнала", например, как описано здесь (В сети гуляет много вариантов кода). Теперь задача сводиться к сравнению двух картинок. На самом деле график строить не нужно, можно сравнить в памяти, просто, если представить в виде картинки, легче понять алгоритм. Но по ходу дела могут подстерегать следующие трудности: разная амплитуда. Но это легко исправляется. Называется нормирование. Рассчитываем сраднее (но только значений по модулю!, а то среднее может быть равным нулю), а потом просто домножаем значения на рассчитанный коефициент. погрешности. То, что на слух идентично, на картинке может выглядеть достаточно разным. Поэтому не стоит сравнивать на равенство, а где то так abs(a1 - a2) < e1, где abs - модуль, a1 и а2 две амплитуды. Значение е1 подбирается экспериментально. свиг. Как я бы решал эту задачу. - Вначале вычитал два файла. - Сделал ресемлинг (понижение частоты). По факту - просто подсчитывал среднее квадратичное за каждые десятые секунды. В результате минутный файл будет занимать массив на 600 целых. - Следующим этапом - нормализировал (так как у нас среднеквадратичное, то все значения положительные, то просто ищем максимум. Потом все значения домножаем на 256/максимум. вместо 256 можно подставить свое любимое значение). - теперь просто сравниваем два массива. Если предполагаем, что есть свиги, то применяем классические алгоритмы поиска подстроки в строке. Понятное дело, что бы алгоритм был достаточно интеллектуальным, придется хорошо потрудиться.

Ответ 2



Тк, нужно сравнивать не только файлы но и звук, то из задачи становится что без частотного анализа здесь не обойтись. Я бы попробовал следующее. Логически дискретм отрывок звука (например берем все частоты появившиеся за 100мс, чем чаще тем лучше), строим качественное FFT и сохраняем массив частот. Берем второй отрывок и делаем тоже самое и сравниваем. Попал нипопал сравниваем в %. Вопрос синхронизации отрывков, берем из первого кусок, смотрим есть ли такой же во втором. Вопрос скорости проигрывания, при изменении скорости проигрывания частоты звуков также повышаются. Разница в отрывке между оригиналом и ускоренным будет как правило константа.

Комментариев нет:

Отправить комментарий