听歌识曲是如何工作的,看完这个你就懂啦!
使用的算法是《An Industrial-Strength Audio Search Algorithm》,部分算法借鉴了Github的dejavu(https://github.com/worldveil/dejavu)项目。
上一篇:
为获得良好的阅读体验,你可能先需要了解 散列(哈希),python基础语法,一定的代码阅读能力,一定的语文理解能力(up写的很乱)。
在开始阅读本篇文章之前,最好认真阅读一下论文《An Industrial-Strength Audio Search Algorithm》,最好是一个字一个字,一个图一个图的把paper看下来(然后你就不需要来看这篇文章了,笑)
paper下载链接:https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf
中文翻译:https://blog.csdn.net/yutianzuijin/article/details/49787551
建议读英文的鸭。
好的,那么正式开始。
基本原理:对于每个音频,我们都要给他生成一些特殊的指纹,然后用这些指纹和要识别的歌曲进行比较,最后取匹配率最高的那个,就是识别出来的歌曲啦~
听起来是不是非常简单鸭~~~~
那么怎么生成这个指纹呢,好问题!我们要分为三个步骤:生成频谱图(频域图像)。
在频谱图的基础上计算出Constellation Map(星状图)
对星状图进行处理,生成指纹哈希。
首先是生成频谱图。
为了生成频谱图,我们就得把歌曲最开始拿出来的数据进行一波傅里叶变换,把时域信号转变为频域信号。什么?你不知道傅里叶变换(Fourier Transformation)?不如看看这个:https://zhuanlan.zhihu.com/p/19759362
但是,傅里叶变换有一个缺陷,那就是它在变换过程中把时间信息丢失了,也就是说傅里叶变换不能反映时间维度局部区域上