用 Python 和 Numpy 实现音频数字指纹特征识别

本文讲的是用 Python 和 Numpy 实现音频数字指纹特征识别,

我第一次用 Shazam 的时候,简直惊呆了。除了 GPS 功能和从楼梯摔下仍然没坏之外,能用一段音频片段识别歌曲是我所见过我手机能做到的最不可思议的事了。识别是通过一个叫音频特征识别的过程来实现的,例子包括:

经过几个周末在学术论文和代码中求索,我想出了一个基于 Python 语言开发的,开源的音频特征识别项目,名字叫 Dejavu。 你可以在 GitHub 上找到它:

https://github.com/worldveil/dejavu

按照我的测试数据集,Dejavu 可以通过从磁盘上读取一段未知的波形文件,或者听取 5 秒以上的录音实现 100% 准确率的识别。

以下是你需要了解的所有关于音频特征识别的知识。对信号处理有研究的读者可以略过,从 “Peak Finding” 开始读。

把音乐当作信号处理

作为一名计算机科学家,我之前理解的快速傅立叶变换 (FFT) ,只是一种很高效地能在O(nlog(n)) 时间内计算多项式乘法的方法。但实际上,它在信号处理方面也有很好的应用场景。

音乐,其实就是与一长串数字相似的数字编码。在未压缩的 .wav 文件里,有很多这样的数字 — 每个声道每秒钟 44100 个数字。这意味着三分钟长的歌曲有近 1600 万个数字。

3 分钟 * 60 秒 * 44100 个样本每秒 * 2 声道 = 15,876,000 个信号样本

声道是指,可以用扬声器播放的,独立的信号样本序列。两个耳塞 — 可以想成是立体声,两个声道。一个声道也被称作‘单声道’。现代的环绕音系统可以支持更多的声道。但除非声音在被录制或者混录时已经是多声道,否则多出来没有对应的扬声器就会播放跟其他扬声器一样的信号流。

信号样本

为什么是每秒 44100 个信号样本?这样选择的原因看起来随意,其实与奈奎斯特-香农采样定理有关。这个很长的,数学推导的方法告诉我们,可以准确采集录音的最大频率是有一个理论上限的。这个最大的频率取决于我们信号采样有多

如果你没理解,可以想象看一个扇叶每秒转一个整圈(1Hz)的电风扇。现在闭上你的眼睛,精确地每秒钟快速睁开一下。如果扇叶也是精确的每秒转一圈,对你来说扇叶并没有移动!每次你睁开眼睛,扇叶都会转到相同的位置。但这有问题,实际上,如你所知,扇叶每秒钟可以转 0,1,2,3,10,100,甚至 100万圈。但你却永远感知不到 — 它看起来是静止的!因此为了保证你可以准确地采样(或者‘看到’)高频率的运动(如‘转圈’),你需要以更高的频率采样(或者说‘睁眼’),准确的说,我们需要用运动两倍的频率采样才能确定我们可以觉察到。

就音频录制来说,广泛接受的规则是可以忽略掉 22050Hz 以上的信号,因为人类的耳朵无法听到 20000Hz 以上的频率。因此根据奈奎斯特定理,我们需要加倍地采样:

每秒需要采样的 = 最高频率 * 2 = 22050 * 2 = 44100

MP3 格式的文件压缩了这个采样率,以 1)节省你的硬盘空间,2)惹恼音乐发烧友,但其实纯 .wav 格式文件不过是一串 16 比特的数字序列(加上一个小小的文件头)。

频谱图

因为这些音频样本其实就是信号,我们可以不断地在一小段时间窗口内的歌曲样本上,用快速傅立叶变换生成歌曲的频谱图。下面就是 Robin Thicke 的 “Blurred Lines” 这首歌开始几秒的频谱图。

Blurred Lines

如你所见,这是一个用横轴表示时间,纵轴表示频率,以颜色表示振幅大小的矩阵。快速傅立叶变换展示给我们信号在特定频率的的强度(振幅)。如果我们计算足够次数的滑动窗口 FFT,我们可以把它们拼在一起组成一个矩阵频谱。

重要的是要注意,频率和时间的值是离散的,每对代表一个 “bin”,振幅是实值。颜色表示

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值