基于音频指纹的听歌识曲系统

发布于:2023-01-16 ⋅ 阅读:(610) ⋅ 点赞:(0)

听歌识曲,我想大家都不陌生。虽然不同的厂商识别率不同(可能是因为版权的原因),但是每个音乐APP都会有这么一个功能。我们以扣扣音乐为例,扣扣音乐听歌识曲功能比较丰富,不仅有基本的听歌识曲还有哼唱识别,识别到对应的歌曲后就直接返回对应的结果,如下图所示。

这里我们只关注听歌识曲部分,这一功能通常使用音频指纹(Audio Fingerprinting)实现。其主要流程大致可以分为两步:1)离线的音频指纹提取;2)在线的音频指纹匹配。音频指纹,顾名思义,和人类的指纹类似,从音频信号中提取唯一确定性的指纹,可用于识别音频样本或快速定位音频数据库中的类似项目。

音频指纹离线提取

音频指纹也是音频的一种特征,常用的提取方式也有三种:1)基于频带能量的音频指纹;2)基于landmark的音频指纹;3)基于神经网络的音频指纹。不管是哪种方式提取音频指纹都需要满足以下条件:时间局部性、平移不变性、鲁棒性和充分熵。

基于频带能量的音频指纹很好理解,就是把音频每一帧划分成一个一个子带,计算子带能量,然后进行差分处理,最后进行二值化来减少指纹内存占用大小,经过上述步骤之后我们就得到了基于频带能量的音频指纹。

​第二种是基于landmarks的音频指纹,这种方法的思想是音频中能量较大的部分不容易受到干扰,因此具有较好的鲁棒性。其流程大致可以分为以下几个步骤:首先记录在一定范围内能量比其它时频点都高的点对应的坐标(Fig 1A->Fig 1B);在匹配时如果直接用坐标图按照滑动窗口的方式进行对比的话计算量太大了,因此需要一个简单快速的方法,我们选定一个锚点,每个锚点对应一个目标区域,锚点与目标区域中的坐标进行哈希运算得到的值

​第三种就是遇事不决深度学习了,得益于深度学习强大的特征提取能力,我们可以用神经网络提取音频指纹,类似于一个embedding的过程,这里就不展开讲了。

音频指纹在线匹配

我们这里使用基于Landmarks的算法提取音频指纹。每个音频指纹的结构为{哈希:时间偏移}。指纹中的每个哈希用于在数据库中搜索匹配的哈希。对于在数据库中找到的每个匹配哈希,从指纹和数据库文件开始的相应偏移时间形成时间对,然后把这个时间对和歌曲ID分到对应的直方图的bin中。当遍历完整个数据后,我们得到了,每个bin内一组时间对代表样本和数据库声音文件之间关联的散点图。当匹配到数据库中文件时,散点图具有类似对角线的pattern,如下图所示

当没有匹配到时则没有类似的pattern。

Performance

我们选了如下的9首歌,然后把《一路向北》第一段的副歌剪切一部分作为听歌识曲的目标。

​算法的结果如下所示,正确匹配到了《一路向北》这首歌,并且定位到的时间是88.928s


本文相关代码,在公众号语音算法组菜单栏点击Code获取。


参考文献:

[1]. http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=152C085A95A4B5EF1E83E9EECC283931?doi=10.1.1.103.2175&rep=rep1&type=pdf

[2]. https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf

[3]. https://arxiv.org/pdf/2010.11910.pdf

[4]. https://ryuk17.blog.csdn.net/article/details/80461049

[5]. https://ryuk17.blog.csdn.net/article/details/80461049