Обнаружение звука внутри звука [Распознавание звука]

Мне нужно создать программное обеспечение, которое распознает звук из небольшого образца звука (A) внутри других образцов звука (B) и выводит, сколько раз A появляется внутри звука из B (если есть совпадение).

Что у меня есть: база данных с сотнями аудиозаписей.

Ввод: новое аудио

Ожидаемый результат: логическое значение, если ввод соответствует сэмплу из базы данных, и сколько раз вход появлялся в совпавшем звуке (из базы данных).

Любой код, проект с открытым исходным кодом, руководства, книги, видео, учебники и т. д. полезны! Спасибо всем!


person Jinmare    schedule 12.05.2020    source источник
comment
Вы уже знаете, что можете использовать звуковые отпечатки пальцев. Попробуйте это, и если у вас есть конкретная проблема, которую вы не можете решить, продолжайте спрашивать здесь. Подобный общий вопрос нарушает правила сообщества.   -  person Lukasz Tracewski    schedule 13.05.2020


Ответы (1)


Это очень широкий вопрос, но позвольте мне немного рассказать о том, как вообще работает распознавание звука, и как вы можете выполнить это самостоятельно.

Я собираюсь предположить, что звук исходит из аудиофайла, а не из потока, но в любом случае его должно быть относительно легко понять.

Основы цифрового аудио

Аудиофайл — это серия сэмплов, которые записываются на устройство с помощью процесса, называемого сэмплирование. Сэмплирование — это процесс преобразования непрерывного аналогового сигнала (например, электрического сигнала микрофона или электрогитары) в дискретный цифровой сигнал.

Для звуковых сигналов выборка почти всегда выполняется с одной частотой дискретизации, которая обычно находится где-то между 8 кГц и 192 кГц. Единственные особенно важные вещи, которые вам нужно знать о выборке:

  1. Самая высокая частота, которую может представить цифровая аудиосистема, называется частотой Найквиста, которая составляет половину частоты дискретизации. Таким образом, если вы используете частоту дискретизации 48 кГц, максимально возможная представленная частота составляет 24 кГц. Как правило, этого достаточно, потому что люди могут слышать только до 20 кГц, поэтому вы можете безопасно использовать любую частоту дискретизации выше 40 кГц, если только вы не пытаетесь записать что-то, что не предназначено для людей.
  2. После сэмплирования цифровой аудиофайл сохраняется в виде значений с плавающей запятой или целых чисел. Чаще всего аудиофайл представляется как 32-битное число с плавающей запятой, 24-битное целое число или 16-битное целое число. В любом случае, большая часть современной обработки звука выполняется с числами с плавающей запятой и обычно масштабируется в пределах окна (-1,0, 1,0). В этой системе чередование -1,0 с и 1,0 с является максимально громкой прямоугольной волной на максимально возможной частоте, а серия 0,0 с - тишиной.

Распознавание звука

Общие алгоритмы распознавания звука сложны и часто неэффективны по сравнению с определенным количеством вариантов использования. Например, вы пытаетесь определить, точно ли аудиофайл соответствует другому аудиофайлу или они будут звучать почти одинаково? Например, давайте рассмотрим простейший алгоритм сравнения аудио (по крайней мере, самый простой, который я смог придумать).

def compareAudioFiles(a, b):
    if len(a) != len(b):
        return False

    for idx in range(len(a)):
        # if the current item in a isn't equal to the current item in b
        if a[idx] != b[idx]:
            return False 

    return True # if the two above returns aren't triggered, a and b are the same.

Это работает **только при определенных обстоятельствах* — даже если аудиофайлы немного отличаются, они не будут сопоставляться как идентичные. Давайте поговорим о нескольких способах, которыми это может потерпеть неудачу:

  1. Сравнение с плавающей запятой — рискованно использовать == между числами с плавающей запятой, потому что числа с плавающей запятой сравниваются с такой точностью, что крошечные изменения в образцах заставят их регистрироваться как разные. Например:
SamplesA = librosa.core.load('audio_file_A.wav')
SamplesB = librosa.core.load('audio_file_A.wav') 

SamplesB[0] *= 1.0...00000001 # replace '...' with lots of zeros

compareAudioFiles(SamplesA, SamplesB) # will be false. 

Несмотря на то, что небольшое изменение в SamplesB незаметно, оно распознается compareAudioFiles.

  1. Нулевое заполнение - одна выборка 0 до или после файла приведет к сбою:
SamplesA = librosa.core.load('audio_file_A.wav')

SamplesB = numpy.append(SamplesA, 0) # adds one zero to the end 

# will be False because len(SamplesA) != len(samplesB)
compareAudioFiles(SamplesA, SamplesB) # False

Есть множество других причин, по которым это не сработает, например, рассогласование фаз, смещение и отфильтрованные низкочастотные или высокочастотные сигналы, которые не слышны.

Вы можете продолжать улучшать этот алгоритм, чтобы компенсировать некоторые подобные вещи, но он все равно, вероятно, никогда не будет работать достаточно хорошо, чтобы сопоставлять воспринимаемые звуки с другими. Короче говоря, если вы хотите сделать это таким образом, чтобы сравнивать то, как звучит звук, вам нужно использовать библиотеку акустических отпечатков пальцев. Одной из таких библиотек является pyacoustid. В противном случае, если вы хотите сравнивать аудиосэмплы из файлов самостоятельно, вы, вероятно, можете придумать относительно стабильный алгоритм, который измеряет разницу между звуками во временной области, принимая во внимание заполнение нулями, неточность, смещение и другие шумы.

Для операций со звуком общего назначения в Python я бы рекомендовал LibROSA.

Удачи!

person Zachary Towbes    schedule 26.05.2020