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

Posted

技术标签:

【中文标题】检测音频中的音频[音频识别] [关闭]【英文标题】:Detecting audio inside audio [Audio Recognition] [closed] 【发布时间】:2020-05-12 19:38:34 【问题描述】:

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

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

输入:新音频

预期输出:一个布尔值,如果输入与数据库中的样本匹配,以及匹配的音频(来自数据库)中出现了多少次输入

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

【问题讨论】:

您已经知道可以使用音频指纹识别。尝试一下,当您遇到无法解决的特定问题时,请继续在这里提问。诸如此类的一般问题违反了社区规则。 【参考方案1】:

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

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

数字音频基础知识

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

对于音频信号,几乎总是以单一的采样率进行采样,通常在 8kHz 到 192kHz 之间。对您而言,关于采样的唯一特别重要的事情是:

    数字音频系统可以表示的最高频率称为奈奎斯特率,它是采样率的一半。因此,如果您使用 48kHz 的采样率,则可能表示的最高频率为 24kHz。这通常是足够的,因为人类只能听到高达 20kHz 的声音,因此您可以安全地使用超过 40kHz 的任何采样率,除非您尝试录制不适合人类的东西。 采样后,数字音频文件以浮点或整数值的形式存储。大多数情况下,音频文件表示为 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.

这**仅在特定情况下有效* - 如果音频文件略有不同,它们将不会被匹配为相同。让我们谈谈这可能会失败的几种方式:

    浮点比较——在浮点数之间使用== 是有风险的,因为浮点数的比较精度如此之高,以至于样本的微小变化会导致它们注册为不同的。例如:
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

祝你好运!

【讨论】:

以上是关于检测音频中的音频[音频识别] [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

开源音频模式识别(指纹)[关闭]

音乐音高类检测音频库[关闭]

Bpm音频检测库[关闭]

iOS中的音频信号处理[关闭]

使用 UWP 监控实时音频并检测枪声/拍手声

通过音频检测单词[关闭]