Последние несколько дней я работал над частью своего приложения, где мне нужно одновременно воспроизводить и записывать аудиофайл. Задача, которую мне нужно выполнить, — это просто сравнить запись с воспроизводимым аудиофайлом и вернуть соответствующий процент. Вот что я сделал до сих пор и некоторый контекст моих вопросов:
Целевой API> 15
Я решил использовать формат аудиофайла .wav, чтобы упростить декодирование файла.
- Я использую AudioRecord для записи и MediaPlayer для воспроизведения аудиофайла.
- Я создал решающий класс, чтобы передать свой аудиофайл и преобразовать его в PCM, чтобы выполнить анализ соответствия.
- Я использую следующие спецификации для записи AudioFormat (CHANNEL_MONO, 16 BIT, SAMPLE_RATE = 44100)
- После того, как я передаю аудиофайл декодеру, я затем передаю его классу БПФ, чтобы получить данные частотной области, необходимые для моего анализа.
И ниже несколько вопросов, которые у меня есть:
- Когда я записываю звук с помощью AudioRecord, используется ли формат PCM по умолчанию или мне нужно указать это как-то?
- Я пытаюсь передать запись в класс FFT, чтобы получить данные в частотной области для выполнения моего анализа соответствия. Есть ли способ сделать это без сохранения записи на устройстве пользователя?
- Нужно ли после выполнения анализа БПФ для обоих файлов сохранять данные в текстовом файле, чтобы выполнить анализ сопоставления? Какие есть варианты или возможные способы сделать это?
- Проведя достаточное количество исследований, все источники, которые я нашел, касаются того, как сопоставить запись с песней/музыкой, содержащейся в базе данных. Моя цель - увидеть, насколько близко совпадают два конкретных аудиофайла, как мне это сделать? - Нужно ли мне создавать/использовать хеш-функции для достижения моей цели? Подробный ответ на этот вопрос был бы очень полезен
- В настоящее время у меня есть отдельный поток для записи; отдельная активность по декодированию аудиофайла; отдельная деятельность для БПФ-анализа. Я также планирую запустить анализ соответствия в отдельном потоке или в AsyncTask. Считаете ли вы эту структуру оптимальной или есть лучший способ сделать это? Кроме того, должен ли я передавать свой аудиофайл декодеру в отдельном потоке или я могу сделать это в потоке записи или в потоке MatchingAnalysis?
- Нужно ли выполнять оконную обработку в моих операциях с аудиофайлами, прежде чем я смогу выполнить сравнение соответствия?
- Нужно ли мне декодировать файл .wav или вместо этого я могу просто сравнить 2 файла .wav напрямую?
- Нужно ли перед сравнением выполнять низкотональные операции над аудиофайлами?
- Какие именно данные мне нужно сгенерировать (спектр мощности, энергетический спектр, спектрограмма и т. д.) для проведения сравнения соответствия?
Правильно ли я иду по этому пути или я что-то упускаю?