我需要构建一个软件,该软件可以从其他音频样本(B)中的一个小音频样本(A)进行音频识别,并输出A在来自B的音频中出现的次数(如果存在匹配项)。 / p>
我所拥有的:拥有数百种音频的数据库
输入:新音频
预期的输出:如果输入与数据库中的样本匹配,并且匹配的音频(来自数据库)中的输入出现了多少次,则为布尔值。< / p>
任何代码,开源项目,指南,书籍,视频,教程等都非常有用!谢谢大家!
答案 0 :(得分:2)
这是一个非常广泛的问题,但让我尝试备份一下,并描述一下音频识别的一般工作原理以及您自己如何执行此操作。
我将假设音频来自音频文件而不是流,但是无论哪种方式,它都应该相对容易理解。
数字音频基础
音频文件是一系列采样,它们通过称为 sampling 的过程记录到设备中。采样是将连续的模拟信号(例如,来自麦克风或电吉他的电信号)转换为离散的数字信号的过程。
对于音频信号,几乎总是以单个采样率进行采样,该采样率通常在8kHz至192kHz之间。关于采样,要了解的唯一特别重要的事情是:
音频识别
相对于一定数量的用例,用于音频识别的通用算法复杂且效率低下。例如,您是否要确定一个音频文件是否与另一个音频文件完全匹配,或者它们听起来是否几乎相同?例如,让我们看一下最简单的音频比较算法(至少是我能想到的最简单的算法)。
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
可以识别。
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
祝你好运!