音频指纹识别-它是什么?为什么有用?

音频指纹(也称为声学指纹)是某些音频(例如音乐,环境声音等)的紧凑表示,其中封装了特定于其表示的音频的信息。 音频指纹的作用是捕获诸如歌曲之类的声音的签名 ,以使其与其他声音区分开。 音频指纹识别具有许多应用程序,包括水印,监视音频内容的广播/分发以及基于内容的声音检索。 尽管相同的方法和注意事项也适用于音频指纹技术的其他用途,但后者的应用将成为本文的重点。

与人类指纹用于识别单个人的方式大体相同,需要注意的是,音频指纹被设计为特定于声音实例(音频文件),而不是声音的概念或类别(例如“环境音乐”或“雨声”)。 因此,让我们看看这在实践中是如何工作的。

Shazam和AcoustID等用于服务的大多数音频指纹技术都从音频的时频表示中提取指纹,称为频谱图 (图1显示了某些语音的频谱图)。 频谱图之所以出色,是因为它们使我们能够识别随时间变化的频率内容,以及每个频率有多响或多安静。 这一切都很好,但是由于多种原因,原始形式的频谱图作为音频指纹不是很有用。 首先,它们包含许多信息,其中许多对于音频指纹识别而言可能是多余的。 其次,它们对于音频质量的降低不可靠。 如图2所示,该音频文件与图1相同,但是在不同的环境中播放,具有清晰的背景噪音。 很明显,背景噪声导致了不同的声谱图,但是一件事立即显而易见-峰大部分是完整的。 这样,频谱图峰是生成可靠的音频指纹的良好起点。

有很多方法可以识别峰值,但是我们本质上想要的是识别频谱图中每个区域中的凸点,这些凸点不是任何背景噪声的结果。 每个区域都可以视为2D窗口,其大小将决定我们最终出现的峰数。

图3和图4显示了在有和没有背景噪声的情况下在我们的语音文件上检测到的峰值。 请注意,在较高的频率下,峰看起来更紧密地分组在一起,但这仅是由于绘图所使用的对数频率标度。 取得峰值的一个不错的特性(与其他音频功能(例如频谱统计或过零率)相反)是对噪声的鲁棒性。 即使有清晰可闻的背景噪声,干净音频文件中的大多数峰值也会在嘈杂的文件中检测到,而背景噪声会引入一些额外的峰值。

一旦确定了音频文件中的所有峰值,便有了指纹的起点。 我们可以将每个峰的坐标作为指纹,但是很容易想象有很多共享某些峰位置的音频(或歌曲),因此很明显,一个峰不足以作为唯一峰指纹。 这是Shakem技术背后的人Avery Wang撰写的出色论文中所解释的。 对于在1024个频率上分析的给定音频帧,我们将具有1024个潜在峰值位置,相当于10位信息。 考虑到搜索空间的潜在大小(几百万首歌曲或许多小时的音频),这是非常低的,因此我们需要一种增加指纹熵的方法。 有几种聪明的方法可以做到这一点。 Wang的方法是根据峰对构建指纹(图5)。 峰分成目标区域,每个区域分配一个锚定峰。 目标区域中的每个峰都与锚点配对。 然后可以为每个峰构造一个哈希,该哈希由每个峰对的频率及其之间的距离组成。

但是,有许多替代方法可以增加熵。 例如,我们可以将一段音频中的所有峰值作为指纹(图6)。 在此,部分的大小(即指纹的宽度)是重要的因素,并且将取决于使用情况。 如果它太短,那么我们就有可能具有较低的熵(即,指纹将无法包含足够的信息来区别于其他音频文件的指纹)。 但是,如果时间太长,则会增加存储指纹数据库并在数据库中搜索给定查询所需的信息量。 因此,我们需要在使指纹唯一的信息量与搜索可能数百万个指纹的实用性之间进行权衡。

我们为Hijinx Alive Beat Bugs玩具开发的方法是不寻常的,因为它能够在特别低规格的计算机上执行实时音频指纹识别,实际上是在嵌入式微芯片上,每块成本不到1美元。 对Shazam使用的大规模指纹识别来说,这是一组完全不同的约束条件,并且是如何在不使用高性能硬件的情况下如何使用指纹来创建交互式音频体验的一个示例。

Hijinx Alive Beat Bugs玩具

在此博客中,我们解释了什么是音频指纹,并给出了如何创建音频指纹的一些示例。 重要的是要注意,虽然大多数性能最佳的方法都是基于频谱图中的峰值,但没有一种方法可以生成音频指纹。 一些音频指纹识别方法更适合于扩展到可能数百万个音频文件(以及成千上万个指纹),而其他方法则更适合于特定的硬件约束,例如低内存和性能要求。