Найти аудиосэмпл в аудиофайле (спектрограмма уже существует)
Я пытаюсь добиться следующего:
- Используя Skype, позвоните в мой почтовый ящик (работает)
- Введите пароль и сообщите почтовому ящику, что я хочу записать новое приветственное сообщение (работает)
- Теперь мой почтовый ящик говорит мне записать новое приветственное сообщение после звукового сигнала
- Я хочу дождаться звукового сигнала, а затем воспроизвести новое сообщение (не работает)
Как я пытался достичь последнего пункта:
- Создать спектрограмму, используя БПФ и скользящие окна (работает)
- Создайте "отпечаток пальца" для звукового сигнала
- Ищите этот отпечаток в аудио, который исходит из скайпа
Проблема, с которой я сталкиваюсь, заключается в следующем:
Результат FFTs на аудио из скайпа и опорный звукового сигнала не то же самые в цифровом смысле, то есть они похожи, но не то же самое, хотя сигнал был извлечен из звукового файла с записью скайпа аудио. На следующем рисунке показана спектрограмма звукового сигнала от аудиозаписи Skype с левой стороны и спектрограмма контрольного звукового сигнала с правой стороны. Как видите, они очень похожи, но не одинаковы...
http://img27.imageshack.us/img27/6717/spectrogram.png
Я не знаю, как продолжить отсюда. Должен ли я усреднить его, то есть разделить его на столбцы и строки и сравнить средние значения этих ячеек, как описано здесь? Я не уверен, что это лучший способ, потому что он уже заявляет, что он не очень хорошо работает с короткими аудиосэмплами, а звуковой сигнал длится менее секунды...
Любые советы о том, как действовать?
2 ответа
Вам следует определить пиковую частоту и длительность (возможно, минимальную мощность за эту длительность для частоты ( среднеквадратическое значение - самый простой показатель)
Это должно быть достаточно легко измерить. Чтобы сделать вещи еще более умными (но, вероятно, совершенно ненужными для этой простой задачи сопоставления), вы можете утверждать о несуществовании других пиков во время окна звукового сигнала.
Обновить
Чтобы сравнить полный аудио фрагмент, вы захотите использовать алгоритм Convolution. Я предлагаю использовать готовую библиотечную реализацию вместо собственной.
Наиболее распространенные алгоритмы быстрого свертывания используют алгоритмы быстрого преобразования Фурье (БПФ) с помощью теоремы о круговой свертке. В частности, круговая свертка двух последовательностей конечной длины определяется путем взятия БПФ каждой последовательности, умножения по точкам и последующего выполнения обратного БПФ. Свертки типа, определенного выше, затем эффективно реализуются с использованием этой методики в сочетании с частями с нулевым расширением и / или отбрасыванием частей вывода. Другие алгоритмы быстрой свертки, такие как алгоритм Шёнхаге-Штрассена, используют быстрые преобразования Фурье в других кольцах.
Википедия перечисляет http://freeverb3.sourceforge.net/ в качестве кандидата с открытым исходным кодом
Редактировать Добавлена ссылка на страницу учебника API: http://freeverb3.sourceforge.net/tutorial_lib.shtml
Дополнительные ресурсы:
http://en.wikipedia.org/wiki/Finite_impulse_response
http://dspguru.com/dsp/faqs/fir
Существующие пакеты с соответствующими инструментами в Debian:
[brutefir - a software convolution engine][3]
jconvolver - Convolution reverb Engine for JACK
libzita-convolver2 - C++ library implementing a real-time convolution matrix
teem-apps - Tools to process and visualize scientific data and images - command line tools
teem-doc - Tools to process and visualize scientific data and images - documentation
libteem1 - Tools to process and visualize scientific data and images - runtime
yorick-yeti - utility plugin for the Yorick language
Сначала я бы немного сгладил его по частоте, чтобы небольшие вариации частоты стали менее значимыми. Затем просто возьмите каждую частоту и вычтите две амплитуды. Выровняйте различия и сложите их. Возможно, сначала нормализуйте сигналы, чтобы различия в общей амплитуде не имели значения. А затем сравните разницу с порогом.