Это очень широкий вопрос, но позвольте мне немного рассказать о том, как вообще работает распознавание звука, и как вы можете выполнить это самостоятельно.
Я собираюсь предположить, что звук исходит из аудиофайла, а не из потока, но в любом случае его должно быть относительно легко понять.
Основы цифрового аудио
Аудиофайл — это серия сэмплов, которые записываются на устройство с помощью процесса, называемого сэмплирование. Сэмплирование — это процесс преобразования непрерывного аналогового сигнала (например, электрического сигнала микрофона или электрогитары) в дискретный цифровой сигнал.
Для звуковых сигналов выборка почти всегда выполняется с одной частотой дискретизации, которая обычно находится где-то между 8 кГц и 192 кГц. Единственные особенно важные вещи, которые вам нужно знать о выборке:
- Самая высокая частота, которую может представить цифровая аудиосистема, называется частотой Найквиста, которая составляет половину частоты дискретизации. Таким образом, если вы используете частоту дискретизации 48 кГц, максимально возможная представленная частота составляет 24 кГц. Как правило, этого достаточно, потому что люди могут слышать только до 20 кГц, поэтому вы можете безопасно использовать любую частоту дискретизации выше 40 кГц, если только вы не пытаетесь записать что-то, что не предназначено для людей.
- После сэмплирования цифровой аудиофайл сохраняется в виде значений с плавающей запятой или целых чисел. Чаще всего аудиофайл представляется как 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.
Это работает **только при определенных обстоятельствах* — даже если аудиофайлы немного отличаются, они не будут сопоставляться как идентичные. Давайте поговорим о нескольких способах, которыми это может потерпеть неудачу:
- Сравнение с плавающей запятой — рискованно использовать
==
между числами с плавающей запятой, потому что числа с плавающей запятой сравниваются с такой точностью, что крошечные изменения в образцах заставят их регистрироваться как разные. Например:
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
.
- Нулевое заполнение - одна выборка 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