【技术分析】使用python进行歌曲相似度分析

歌曲的相似度分析和听歌识曲原理核心思路基本一致,都是提取歌曲的声纹进行判断,提取声纹的方法,这里就要搬出我们大学学过的傅里叶变换了

关于傅里叶变换的普及,可以参考链接

https://www.cnblogs.com/h2zZhou/p/8405717.html

这里听歌识曲,是有一个比较出名的开源项目的,叫dejavu,GitHub的地址是,它的特点是识别快,可能只需要试听几秒钟,就可以准确的识别出源歌曲,但是缺点是占用空间较大,这里我做了一个测试,使用dejavu提取了5个歌曲的声纹,查询MySQL这个表的空间使用就有28M (29982720/1024/1024),基本相当于5首mp3歌曲的大小

为什么dejavu生成的歌曲指纹,这个我们后面再说,有没有相对比较节约空间的方法呢,也是有的(方案参考互联网,当然也离不开FFT,即傅里叶变换)

下面我想讲一下这个方法:

首先,我们要对整个歌曲进行分块,比如每秒100分块

其次,对每一个分块进行FFT,接着对频域的结果进行区间划分,取出每一个区间的最大值的坐标,这个坐标,就是歌曲片段的特征值

最后将特征值按顺序排列,就是整个歌曲的指纹了

如果需要对比两首歌曲的相似程度,只需要按顺序比较特征值的相似程度,根据相似度来判断即可

之所以需要对歌曲分块,就是为了记录歌曲的时间序列,如果直接对整个歌曲进行FFT,就损失了时间的关系,另外这个结果也非常的杂乱,有兴趣的可以试试,然后使用matplotlib输出结果图查看

这里我使用程序中导入了3首歌曲,提取了指纹,数据库的占用大小是278528bytes,0.26M,这里需要说一下,我这里是直接存储的字符串结果,并没有压缩,所以实际压缩后甚至可以更小

 

接下来我们就看一下,为什么空间占用的差别在哪里

 

 

 

 

 

 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值