Сопоставление двух аудиофайлов с помощью БПФ (Android Studio)

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

  • Целевой API> 15

  • Я решил использовать формат аудиофайла .wav, чтобы упростить декодирование файла.

  • Я использую AudioRecord для записи и MediaPlayer для воспроизведения аудиофайла.
  • Я создал решающий класс, чтобы передать свой аудиофайл и преобразовать его в PCM, чтобы выполнить анализ соответствия.
  • Я использую следующие спецификации для записи AudioFormat (CHANNEL_MONO, 16 BIT, SAMPLE_RATE = 44100)
  • После того, как я передаю аудиофайл декодеру, я затем передаю его классу БПФ, чтобы получить данные частотной области, необходимые для моего анализа.

И ниже несколько вопросов, которые у меня есть:

  • Когда я записываю звук с помощью AudioRecord, используется ли формат PCM по умолчанию или мне нужно указать это как-то?
  • Я пытаюсь передать запись в класс FFT, чтобы получить данные в частотной области для выполнения моего анализа соответствия. Есть ли способ сделать это без сохранения записи на устройстве пользователя?
  • Нужно ли после выполнения анализа БПФ для обоих файлов сохранять данные в текстовом файле, чтобы выполнить анализ сопоставления? Какие есть варианты или возможные способы сделать это?
  • Проведя достаточное количество исследований, все источники, которые я нашел, касаются того, как сопоставить запись с песней/музыкой, содержащейся в базе данных. Моя цель - увидеть, насколько близко совпадают два конкретных аудиофайла, как мне это сделать? - Нужно ли мне создавать/использовать хеш-функции для достижения моей цели? Подробный ответ на этот вопрос был бы очень полезен
  • В настоящее время у меня есть отдельный поток для записи; отдельная активность по декодированию аудиофайла; отдельная деятельность для БПФ-анализа. Я также планирую запустить анализ соответствия в отдельном потоке или в AsyncTask. Считаете ли вы эту структуру оптимальной или есть лучший способ сделать это? Кроме того, должен ли я передавать свой аудиофайл декодеру в отдельном потоке или я могу сделать это в потоке записи или в потоке MatchingAnalysis?
  • Нужно ли выполнять оконную обработку в моих операциях с аудиофайлами, прежде чем я смогу выполнить сравнение соответствия?
  • Нужно ли мне декодировать файл .wav или вместо этого я могу просто сравнить 2 файла .wav напрямую?
  • Нужно ли перед сравнением выполнять низкотональные операции над аудиофайлами?
  • Какие именно данные мне нужно сгенерировать (спектр мощности, энергетический спектр, спектрограмма и т. д.) для проведения сравнения соответствия?

Правильно ли я иду по этому пути или я что-то упускаю?


person Zack    schedule 04.01.2017    source источник
comment
Вы находитесь в пути над вашим услышал. Прежде чем вы даже подумаете о том, чтобы попытаться сделать это на мобильном устройстве, вам нужно разработать алгоритм, который может хорошо работать при передаче двух волновых файлов во время работы на вашем настольном компьютере. Рассмотрим, например, как вы будете обрабатывать два идентичных файла (вы никогда не найдете этого в реальном мире, но просто ради аргумента), которые отличаются только неизвестной задержкой. Вам лучше поверить, что звуковой стек Android вставляет задержку! Теперь рассмотрим комбинацию задержки, шума и разнообразной частотной характеристики. Теперь добавьте комнатное эхо....   -  person Chris Stratton    schedule 04.01.2017
comment
@ChrisStratton Я предполагаю, что задержку можно устранить, добавив скользящее окно или обрезав / обрезав оба сигнала, чтобы их продолжительность совпадала, это правильно? Или, может быть, использование хеш-функций позволит нам игнорировать временную задержку?   -  person Zack    schedule 04.01.2017
comment
Соберите набор записей тестовых данных, напишите несколько алгоритмов, придумайте способ их оценки. Кроме использования его для сбора данных (телефонные микрофоны отличаются от компьютерных), даже не прикасайтесь к мобильному устройству, пока не получите хорошие результаты в тестовой среде.   -  person Chris Stratton    schedule 04.01.2017
comment
@ChrisStratton Я предполагаю, что записываю звук с помощью телефона и сохраняю его, скажем, в файл .wav? После того, как я выполню то, что вы сказали, что тогда?   -  person Zack    schedule 04.01.2017
comment
@ChrisStratton И как мне их оценивать? Должен ли я использовать спектральную плотность энергии для подсчета очков?   -  person Zack    schedule 04.01.2017
comment
Что вам нужно для оценки, так это успех ваших алгоритмов в поиске известных взаимосвязей между файлами.   -  person Chris Stratton    schedule 04.01.2017


Ответы (1)


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

  • Ваш первый шаг, чтобы найти БПФ, верен, но затем вам нужно будет построить двухмерный график между временем и частотой, называемый спектрограммой.
  • Этот массив спектрограмм содержит более миллиона отсчетов, и мы не можем работать с таким объемом данных. Таким образом, мы находим пик в амплитудах. Пиком будет пара (время, частота), соответствующая значению амплитуды, которое является максимальным в локальной окрестности вокруг него. Нахождение пика будет вычислительно затратным процессом, и разные приложения или проекты делают это по-разному. Мы используем пики, потому что они менее чувствительны к фоновому шуму.
  • Теперь разные песни могут иметь одинаковые пики, но разница будет заключаться в порядке и разнице во времени возникновения. Поэтому мы объединяем эти пики в уникальные хеши и сохраняем их в базе данных.
  • Выполните вышеуказанный процесс для каждого аудиофайла, который вы хотите, чтобы ваше приложение распознало и сопоставило с ним из вашей базы данных. Хотя сопоставление не простое, и разницу во времени также следует учитывать, потому что песня может быть из любого момента, и у нас есть отпечаток полной песни. Но это не проблема, потому что отпечаток пальца содержит относительную разницу во времени.

Это довольно подробный процесс, и вы можете найти более подробное объяснение по этой ссылке http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf

Есть некоторые библиотеки, которые могут сделать это за вас дежавю (https://github.com/worldveil/dejavu) и хромапринт (это на С++). Musicg от google написан на java, но плохо работает с фоновым шумом.

Сопоставление двух аудиофайлов — сложный процесс, и, как и в комментариях выше, я также советую вам попробовать сначала на ПК, а затем на телефонах.

person deepankar    schedule 10.02.2017