位置: 编程技术 - 正文

听歌识曲--用python实现一个音乐检索器的功能(python放歌)

编辑:rootadmin

推荐整理分享听歌识曲--用python实现一个音乐检索器的功能(python放歌),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python写歌,python音乐,python放歌,python歌曲,python爬取歌曲的代码,听歌识曲代码实现,python写歌,听歌识曲代码实现,内容如对您有帮助,希望把文章链接给更多的朋友!

听歌识曲,顾名思义,用设备“听”歌曲,然后它要告诉你这是首什么歌。而且十之八九它还得把这首歌给你播放出来。这样的功能在QQ音乐等应用上早就出现了。我们今天来自己动手做一个自己的听歌识曲

我们设计的总体流程图很简单:

-----录音部分-----

我们要想“听”,就必须先有录音的过程。在我们的实验中,我们的曲库也要用我们的录音代码来进行录音,然后提取特征存进数据库。我们用下面这样的思路来录音

我们录完的歌曲是个什么形式?

如果只看一个声道的话,他是一个一维数组,大概长成这个样子

我们把他按照索引值为横轴画出来,就是我们常常看见的音频的形式。

音频处理部分

我们在这里要写我们的核心代码。关键的“如何识别歌曲”。想想我们人类如何区分歌曲? 是靠想上面那样的一维数组吗?是靠歌曲的响度吗?都不是。

我们是通过耳朵所听到的特有的频率组成的序列来记忆歌曲的,所以我们想要写听歌识曲的话,就得在音频的频率序列上做文章。

复习一下什么是傅里叶变换。博主的《信号与系统》的课上的挺水,不过在课上虽然没有记下来具体的变换形式,但是感性的理解还是有的。

傅里叶变换的实质就是把时域信号变换成了频域信号。也就是原本X,Y轴分别是我们的数组下标和数组元素,现在变成了频率(这么说不准确,但在这里这样理解没错)和在这个频率上的分量大小。

怎么理解频域这个事情呢?对于我们信号处理不是很懂的人来说,最重要的就是改变对音频的构成的理解。我们原来认为音频就是如我们开始给出的波形那样,在每一个时间有一个幅值,不同的幅值序列构成了我们特定的声音。而现在,我们认为声音是不同的频率信号混合而成的,他们每一个信号都自始至终存在着。并且他们按照他们的投影分量做贡献。

让我们看看把一首歌曲转化到频域是什么样子?

我们可以观察到这些频率的分量并不是平均的,差异是非常大的。我们可以在一定程度上认为在图中明显凸起的峰值是输出能量大的频率信号,代表着在这个音频中,这个信号占有很高的地位。于是我们就选择这样的信号来提取歌曲的特征。

但是别忘了,我们之前说的可是频率序列,傅里叶变换一套上,我们就只能知道整首歌曲的频率信息,那么我们就损失了时间的关系,我们说的“序列”也就无从谈起。所以我们采用的比较折中的方法,将音频按照时间分成一个个小块,在这里我每秒分出了个块。

在这里留个问题:为什么要采用小块,而不是每秒一块这样的大块?

听歌识曲--用python实现一个音乐检索器的功能(python放歌)

我们对每一个块进行傅里叶变换,然后对其求模,得到一个个数组。我们在下标值为(0,),(,),(,),(,)这四个区间分别取其模长最大的下标,合成一个四元组,这就是我们最核心的音频“指纹”。

我们提取出来的“指纹”类似下面这样

(, , , ), (, , , ), (3, , , ), (, , , ), (, , , ), (2, , , ), (, , , ), (, , , ), (, , , ), (, , , ), (, , , ), (, , , ), (, , , ), (, , , )

音频处理的类有三个方法:载入数据,傅里叶变换,播放音乐。如下:

这里面的self.high_point是未来应用的核心数据。列表类型,里面的元素都是上面所解释过的指纹的形式。

数据存储和检索部分

因为我们是事先做好了曲库来等待检索,所以必须要有相应的持久化方法。我采用的是直接用mysql数据库来存储我们的歌曲对应的指纹,这样有一个好处:省写代码的时间

我们将指纹和歌曲存成这样的形式:顺便一说:为什么各个歌曲前几个的指纹都一样?(当然,后面肯定是千差万别的)其实是音乐开始之前的时间段中没有什么能量较强的点,而由于我们的采样率比较高,就会导致开头会有很多重复,别担心。

我们怎么来进行匹配呢?我们可以直接搜索音频指纹相同的数量,不过这样又损失了我们之前说的序列,我们必须要把时间序列用上。否则一首歌曲越长就越容易被匹配到,这种歌曲像野草一样疯狂的占据了所有搜索音频的结果排行榜中的第一名。而且从理论上说,音频所包含的信息就是在序列中体现,就像一句话是靠各个短语和词汇按照一定顺序才能表达出它自己的意思。单纯的看两个句子里的词汇重叠数是完全不能判定两句话是否相似的。我们采用的是下面的算法,不过我们这只是实验性的代码,算法设计的很简单,效率不高。建议想要做更好的结果的同学可以使用改进的DTW算法。

我们在匹配过程中滑动指纹序列,每次比对模式串和源串的对应子串,如果对应位置的指纹相同,则这次的比对相似值加一,我们把滑动过程中得到的最大相似值作为这两首歌的相似度。

举例:

曲库中的一首曲子的指纹序列:[fp, fp, fp, fp, fp, fp, fp, fp, fp, fp, fp]

检索音乐的指纹序列: [fp, fp, fp, fp]

比对过程:最终的匹配相似值为3

存储检索部分的实现代码

总结

我们这个实验很多地方都很粗糙,核心的算法是从shazam公司提出的算法吸取的“指纹”的思想。希望读者可以提出宝贵建议。

本文转载于:

Python解析excel文件存入sqlite数据库的方法 一、建立数据库根据需求建立数据库,建立了两个表,并保证了可以将数据存储到已有的数据库中,代码如下:importsqlite3defcreateDataBase():cn=sqlite3.connect('ch

利用Python开发实现简单的记事本 前言本文的操作环境:ubuntu,Python2.7,采用的是Pycharm进行代码编辑,个人很喜欢它的代码自动补齐功能。示例图如上图,我们可以看到这个记事本主要分

Python实现将不规范的英文名字首字母大写 例如输入:['adam','LISA','barT'],输出:['Adam','Lisa','Bart']。方法一defwgw(x):return[x[0].upper(),x[1:].lower()]map(wgw,['adam','LISA','barT'])方法二defwgw1(x):returnx.capitalize()ma

标签: python放歌

本文链接地址:https://www.jiuchutong.com/biancheng/383470.html 转载请保留说明!

上一篇:Python字典简介以及用法详解(python 字典的字典)

下一篇:Python解析excel文件存入sqlite数据库的方法(python解析excel文档)

  • 增值税专用发票的税率是多少啊
  • 公司员工住宿费怎么入账
  • 审核通过的红字发票信息表可以撤销吗
  • 短期借款,应付票据,应付账款和应交税费属于
  • 车辆抵押登记费用可以退回吗
  • 融资租赁咨询服务合同需要交印花税吗
  • 房地产企业销售现房是否预缴增值税
  • 公司收内部职工停车费如何确认收入?
  • 增值税普通发票可以抵扣进项税吗
  • 企业接收政府划入资产的税务处理办法
  • 发票纳税人识别号在哪里看
  • 辅助生产费用怎么归集
  • 税金及附加期末结转分录
  • 预付货款样品费怎么入账
  • 两个公司发工资违法吗
  • 个税抵扣申报截止时间
  • win7s
  • 手动ghost还原硬盘
  • macOS 11 Big Sur beta 4值得升级吗?macOS 11 Big Sur beta 4更新详解
  • 持有至到期投资减值准备
  • 软件入无形资产还是长期待摊费用了
  • 现金支票提取备用金会计处理
  • php记录页面停留多久
  • jupyter用法
  • 【创作赢红包】项目信息分析表
  • 微信实现刮刮卡抽奖效果
  • 公司开一般户经办人是会计还是出纳好
  • 公司费用计入什么科目
  • 防伪税款服务费抵扣
  • 大巴车怎么坐车
  • 会计的借记和贷记什么意思
  • sql2008r2如何使用
  • 外购固定资产对公司影响
  • 在工资模块中进行各工资类别间的汇总
  • 不征税收入怎么申报增值税
  • 免税商品外汇业务
  • 申请财产损失会计分录
  • 买到库存货 退货
  • 预提费用多提了怎么办
  • 财务费用减少记借方还是贷方
  • 出售其他权益工具投资其他综合收益
  • 增值税政策依据
  • 多发了工资怎么做账务处理
  • 基本账户没有流水
  • 事业单位预收账款
  • 分公司人数要求
  • 增值税税控系统专用设备费及技术维护费抵扣
  • 现金日记账的对账工作有哪些
  • 什么是建账户
  • 房地产企业会计科目
  • sqlserver函数大全
  • mysq删除数据库
  • win7自带播放器怎么打开
  • win2003注册表空间不足
  • 如何查看电脑端口号
  • 虚拟机安装win7一直卡在完成安装
  • XP下HTTP的403.9错误-禁止访问:连接的用户过多 重启iis可以解决
  • centos安装问题
  • javascriptz
  • Eclipse和AndroidStudio常用快捷键对比
  • 简单的安卓程序
  • js实现计算器代码
  • android查询数据库
  • three.js入门教程(合集)
  • js如何深度克隆一个对象
  • java模拟浏览器点击
  • 从零开始学公文写作
  • javascript初级教程
  • javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全详解
  • 莱鸟人集团
  • Python Sql数据库增删改查操作简单封装
  • python with 用法
  • 东莞市国家税务局网上办税大厅
  • 留抵税额可以留抵多久
  • 河南省地方税务局房产税管理办法
  • 即征即退的留抵税额是否可以抵一般计税的税额
  • 国税局江西省税务局
  • 个人领税票需要哪些资料
  • 天津市东丽区军粮城派出所电话
  • 四川残疾人社保补贴
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设