python 听歌识曲_Shazam听歌识曲算法解析+python实现-3 检索歌曲
听歌识曲是如何工作的,看完这个你就懂啦!
使用的算法是《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写的很乱)。
如果你没有看过之前的部分,请移步:
第一部分:
第二部分:
好的,那么今天我们进入算法解析的最后一部分,搜索与匹配。
首先,我们要建立起一个数据库来储存上一步中获取的指纹信息。
Up在这里使用了orm框架SQLalchemy
其中一个表来储存歌曲信息,一个表来储存歌曲信息对应的指纹,两个表用歌曲的id作为外键相连。
SQLAlchemy 建表
注意,fingerprint 这个 column 必须要加上 index,这将会大大减少查询速度,千真万确。
Songs 表
songs 表为歌曲信息表:
id 用来储存歌曲id,
name用来存储歌曲名字
filehash用来储存该歌曲文件的哈希
fingerprinted用来判断该歌曲是否已经进行了fingerprint
Fingerprints 表
Fingerprints 表为储存指纹的表:
id为指纹id,没什么用
song_id 是外键,记录对应的歌曲信息
fingerprint就是获取到的指纹信息
offset就是该指纹的offset位置
建完这个表,然后你就可以把指纹信息全都放进去了。

然后,我们来讲讲搜索与识别的基本原理:首先输入一段声音,然后和之间一样,获取这一段声音的指纹。
对获取到的每一个指纹,在数据库中搜索相同的指纹,并将指纹对应的歌曲信息,以及offset偏移值保存。
有相同 offset差值越多的 歌曲 就是识别出的歌曲。tk’=tk+offset [1]
这样子说可能有点抽象,我们来举个栗子。
假如假如在某个音频中,你提取到了1个指纹,这个指纹是 c19dde0ecb8fca81b6c98d5ee3775c26cbb32a610c82a5ecda515b0beb86d357, 且它在那段音频中的offset 是 30。
通过这个指纹,你在数据库中取到了如下的数据
取得的数据
然后我们可以计算得到 offset 差值分别为 70, 70 ,170, 20, 93, 160, 90, 70
offset 差值
在这里,我们可以看到,offset差值是 70 且 id 为 1 的有 3 个,offset差值是 170 且 id 为 1 的有一个,offset差值是 20 且 id 为 2 的有1 个,offset差值是933 且 id 为 3 的有一个……
所以在这些数据中,最多就是 出现 3 次的那个值。也就是id为1的歌曲。所以,识别结果就是id为1 的歌曲。
有人会问,为什么不一首歌一首歌的检索呢,因为慢。
接下上代码。
获取所有匹配的指纹,并将歌曲信息与offset差值保存下来。
获取所有匹配的指纹
对数据进行处理,得出相同offset差值最多多的歌曲,也就是识别出来的歌曲。
处理数据
mostpossible 就是最有可能的歌曲。
结束。Reference:
[1]: Wang, Avery. "An Industrial Strength Audio Search Algorithm." Ismir. Vol. 2003. 2003.
转载请先获得许可。
更多推荐



所有评论(0)