检测音频中的音频[音频识别]



我需要构建一个软件,从其他音频样本(B(中的小音频样本(A(进行音频识别,并输出A出现在B的音频内部的次数(如果有匹配(。

我拥有的:包含数百个音频的数据库

输入:新音频

预期输出:如果输入与数据库中的样本匹配,则为布尔值,以及输入在匹配的音频(来自数据库(中出现的次数。

任何代码,开源项目,指南,书籍,视频,教程等都是有用的!谢谢大家!

这是一个非常广泛的问题,但让我尝试备份并描述一下音频识别的一般工作原理,以及您自己如何执行此操作。

我将假设音频来自音频文件而不是流,但无论哪种方式都应该相对容易理解。

数字音频的基础知识

音频文件是一系列样本,通过称为采样的过程记录到设备中。采样是将连续模拟信号(例如,来自麦克风或电吉他的电信号(转换为离散数字信号的过程。

对于音频信号,采样几乎总是以单个采样率完成,通常介于8kHz和192kHz之间。关于采样,唯一需要了解的特别重要的事情是:

  1. 数字音频系统可以表示的最高频率称为奈奎斯特速率,它是采样速率的一半。因此,如果您使用的是 48kHz 的采样率,则可能的最高表示频率为 24kHz。这通常足够了,因为人类只能听到高达 20kHz 的声音,因此您可以安全地使用 40kHz 以上的任何采样率,除非您尝试录制不适合人类的内容。
  2. 采样后,数字音频文件以浮点或整数值的形式存储。大多数情况下,音频文件表示为 32 位浮点数、24 位整数或 16 位整数。无论如何,大多数现代音频处理都是使用浮点数完成的,并且通常在窗口(-1.0,1.0(内缩放。在这个系统中,交替的-1.0s和1.0s是在尽可能高的频率下尽可能响亮的方波,而一系列0.0s是静音。

音频识别

音频识别的一般算法很复杂,相对于一定数量的用例来说,通常效率低下。例如,您是否正在尝试确定一个音频文件是否与另一个音频文件完全匹配,或者它们听起来是否几乎相同?例如,让我们看看最简单的音频比较算法(至少是我能想到的最简单的算法(。

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

祝你好运!

最新更新