听歌识曲是如何工作的,看完这个你就懂啦!

使用的算法是《An Industrial-Strength Audio Search Algorithm》,部分算法借鉴了Github的dejavu(https://github.com/worldveil/dejavu)项目。

在开始之前,我们首先要认真阅读一下论文《An Industrial-Strength Audio Search Algorithm》。

paper下载链接:https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf

中文翻译:https://blog.csdn.net/yutianzuijin/article/details/49787551

建议读英文的鸭。

为获得良好的阅读体验,你可能先需要了解: mysql数据库的基础知识,python基础语法,一定的代码阅读能力,一定的语文理解能力(up写的很乱)。

如果你没有看过之前的部分,请移步:

第一部分:67712c3ad32ada50e7fe460d0894a34a.png

第二部分:77d91a01a2411fed5d38d7784609b605.png

好的,那么今天我们进入算法解析的最后一部分,搜索与匹配。

首先,我们要建立起一个数据库来储存上一步中获取的指纹信息。

Up在这里使用了orm框架SQLalchemy

其中一个表来储存歌曲信息,一个表来储存歌曲信息对应的指纹,两个表用歌曲的id作为外键相连。1dbeec7722c28c5526dad8f59b2593cc.pngSQLAlchemy 建表

注意,fingerprint 这个 column 必须要加上 index,这将会大大减少查询速度,千真万确。b033f028c4b6e4b24273701fb1d2b5d0.pngSongs 表

songs 表为歌曲信息表:

id 用来储存歌曲id,

name用来存储歌曲名字

filehash用来储存该歌曲文件的哈希

fingerprinted用来判断该歌曲是否已经进行了fingerprint395bb00c39276ccdb39505d6c24e934c.pngFingerprints 表

Fingerprints 表为储存指纹的表:

id为指纹id,没什么用

song_id 是外键,记录对应的歌曲信息

fingerprint就是获取到的指纹信息

offset就是该指纹的offset位置

建完这个表,然后你就可以把指纹信息全都放进去了。

a739ef1ba60c42f0cacc586144e75f71.png

然后,我们来讲讲搜索与识别的基本原理:首先输入一段声音,然后和之间一样,获取这一段声音的指纹。

对获取到的每一个指纹,在数据库中搜索相同的指纹,并将指纹对应的歌曲信息,以及offset偏移值保存。

有相同 offset差值越多的 歌曲 就是识别出的歌曲。tk’=tk+offset [1]

这样子说可能有点抽象,我们来举个栗子。

假如假如在某个音频中,你提取到了1个指纹,这个指纹是 c19dde0ecb8fca81b6c98d5ee3775c26cbb32a610c82a5ecda515b0beb86d357, 且它在那段音频中的offset 是 30。

通过这个指纹,你在数据库中取到了如下的数据45f7e83b4c6a43cfd9e8995c5a93ebe7.png取得的数据

然后我们可以计算得到 offset 差值分别为 70, 70 ,170, 20, 93, 160, 90, 70f04b2765e9f7a5b3d1307562aa24d16c.pngoffset 差值

在这里,我们可以看到,offset差值是 70 且 id 为 1 的有 3 个,offset差值是 170 且 id 为 1 的有一个,offset差值是 20 且 id 为 2 的有1 个,offset差值是933 且 id 为 3 的有一个……

所以在这些数据中,最多就是 出现 3 次的那个值。也就是id为1的歌曲。所以,识别结果就是id为1 的歌曲。

有人会问,为什么不一首歌一首歌的检索呢,因为慢。

接下上代码。

获取所有匹配的指纹,并将歌曲信息与offset差值保存下来。

27e5d21d9ecc5c4bc6be8105e3cdfea1.png获取所有匹配的指纹

对数据进行处理,得出相同offset差值最多多的歌曲,也就是识别出来的歌曲。

c94c74a1157989925f1764218243445a.png处理数据

mostpossible 就是最有可能的歌曲。

结束。Reference:

[1]: Wang, Avery. "An Industrial Strength Audio Search Algorithm." Ismir. Vol. 2003. 2003.

转载请先获得许可。

更多推荐