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

时间:2020-05-12 19:38:34

标签: python audio artificial-intelligence classification audio-fingerprinting

我需要构建一个软件,该软件可以从其他音频样本(B)中的一个小音频样本(A)进行音频识别,并输出A在来自B的音频中出现的次数(如果存在匹配项)。 / p>

我所拥有的:拥有数百种音频的数据库

输入:新音频

预期的输出:如果输入与数据库中的样本匹配,并且匹配的音频(来自数据库)中的输入出现了多少次,则为布尔值。< / p>

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

1 个答案:

答案 0 :(得分:2)

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

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

数字音频基础

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

对于音频信号,几乎总是以单个采样率进行采样,该采样率通常在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

祝你好运!