wav2midi 音乐旋律提取算法 附可执行demo

前面提及过,音频指纹算法的思路。

也梳理开源了两个比较经典的算法。

https://github.com/cpuimage/shazam

https://github.com/cpuimage/AudioFingerprinter

后来一段时间,稍微看了下这两个算法,还有不少可以精简优化的空间。

例如抗噪,特征有效性等优化思路。

音频指纹切片后的hash特征信息还是太多了,

不过作为哼唱搜歌的基本应用,是足够的了。

不过我觉得还是可以再进一步提取歌曲的旋律特征的,在音频指纹的基础上更进一步。

  旋律是最重要的音乐要素之一,多应用于音乐内容分析、音乐创作、音乐教育、抄袭检测等方面。

主旋律提取旨在从一段音乐中自动估计对应于主旋律单音音符序列的音高或基频。

流行音乐一般属于复杂的多音音乐,因此主旋律提取面临着许多挑战。

  在这里要特别说一下,音频处理领域碰到的问题都是相似的。首当其冲主要是噪声,其次是音量和语速。

特别是在一些场景下的asr识别,例如实时对话,同声传译之类环境下,语速和音量的干扰影响很多时候多过于噪声。

而很多提供asr服务的厂商对这类情况支持不佳,而据我所知,讯飞的asr中是有内置前处理算法的。

好像有点偏题了,回到主题上来。

也就是说不管做音频还是音乐 上面提到的问题都会造成一定精度影响。

音频前处理算法是非常重要的,一直在做这方面的研究工作,前面着重于降噪和增益方向,下一步应该会着重在语速方面的研究。 

而刚才提到的旋律,也可以认为是语速的一个点。

旋律,节奏,节拍,精确准确度从另一个侧面就可以评估语速,以及风格内容。

所以提取旋律节奏是一个非常值得研究的课题。

也许大家最熟悉的应用场景应该是 游戏节奏类app或者唱K的旋律评分系统。

关于旋律提取这方面的资料比较有限。

在这方向上面,一开始我也是有点蒙圈。

直到我看到一个思路,我突然间豁然开朗。

那就是将歌曲音频 转换为midi电子音乐。

众所周知,midi电子音乐体积非常非常小,在游戏领域应用非常广,几乎是标配。

例如超级玛丽的背景音乐,经典中的经典。

那么是不是可以实现一种算法,将音频转为midi,作为此段音频的指纹呢?

理论上,完全可行,而且刚才提到的唱K的评分系统就是类似的实现。

参照下图:

上面是一段音乐,下面是其对于的midi。

把这个图放大给大家感受一下。

是不是有似曾相识的感觉。

KTV 的节奏条。

所以毫无疑问,KTV的评分系统极其有可能就是采用了MIDI作为声纹进行相似度匹配,

最后给出评分。

当然关于旋律提取有很多不同的实现,不过,大多数算法都有3个共同的目的,

分别是算法的速度性能(复杂度),最终效果,抗噪抗干扰。

针对这三个方面,各有各的技巧。

如果能兼顾三者,无疑是最佳的。

而关于wav转midi的资料,真的是极其稀少。

大概有:

1. https://github.com/mrk21/wav2midi

https://mrk21.kibe.la/shared/entries/3931bfea-0f31-4aa1-9e72-b7cd6f010697

2.https://github.com/justinsalamon/audio_to_midi_melodia

http://www.justinsalamon.com/melody-extraction.html

仔细学习查阅之后,你会跟我一开始一样,一脸懵逼。

首先,第三方依赖特别多,也就意味着,这个算法并不简单。

就效果对比而言,audio_to_midi_melodia 更佳,当然深度学习大火之后

也有人在尝试通过深度学习的方式,建立wav 到 midi的映射。以寻求新的突破。

当然还在试验阶段,暂时还没看到有特别优秀的模型放出。

不过可以拭目以待。

而这个算法有多复杂,看下算法的流程图:

说难也不难,说简单也不简单。

大部分环节是为了解决语速,音量,噪音所造成的误差问题,使得算法更佳稳定,更鲁棒。

根据这个思路,自行实现算法并不困难。

改进算法思路的首要前提,理解算法的核心思想,

所以至少你要把整个算法思路实现一遍,加深理解,不管能否理解到精髓。

然后站在巨人的肩膀上,继续改进。

这个算法花了我一段时间去实现,原本预计几个星期可以搞定,

但是后来因为其他原因搁置了。

趁国庆假期,捡起来,把一些工作继续推进,复现了该算法。

这个过程挺漫长的,有不少环节还可以进一步改进优化。

不过这是后面的工作了。

算法暂没有开源计划,放出demo 供大家评测。

预处理算法,等响度滤波已经开源:

项目地址:

https://github.com/cpuimage/EqualLoudness

其他相关算法也将陆续开源.

这个方向的算法,

有一个专用名词叫做mir, 全称 为 music/audio information retrieval/signal processing 。

有兴趣的朋友,可以查阅一下相关资料。

基本上都是dsp(数字信号处理)。

学习dsp必须把傅里叶变换好好理解一下。

为了理解傅里叶变换的算法思路,我把市面上能找到的实现,都过了一遍。

用纯c 进行学习复现,也足足花了我1个多月的业余时间,

就差喷一口老血出来。

 

可执行demo下载地址:

https://files.cnblogs.com/files/cpuimage/wav2midi.zip

使用方法:拖放wav文件到可执行文件上即可。

或者采用命令行 wav2midi.exe demo.wav

执行后生成 demo.mid 文件。

目前仅支持wav的1通道和2通道格式,其他的格式暂没做支持。

在学习音频算法的时候,经常会联系到图像方面的算法,进行类比,举一反三。

都有共通的地方,就看你怎么应用了,温故而知新。

用以前说过的一句话来总结就是,

任何算法都有缺点,但是一定要用它最优秀的思路。

就好比说,用人只要用其长处,天下皆是可用之才。

 

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

转载于:https://www.cnblogs.com/cpuimage/p/9747247.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式

Dora.Interception提供了两种拦截器注册方式,一种是利用标注在目标类型、属性和方法上的InterceptorAttribute特性,另一种采用基于目标方法或者属性的调用表达式。通过提供的扩展点,我们可以任何我们希望的拦截器注册方式。目录一、IIntercep…

SCAU 算法课的题

8594 有重复元素的排列问题(优先做) 时间限制:1000MS 内存限制:1000K提交次数:1610 通过次数:656 题型: 编程题 语言: G;GCC;VC Description 设集合R{r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法&am…

react 数组新增_React 新特性 Hooks 讲解及实例(二)

本文是 React 新特性系列的第二篇,第一篇请点击这里:React 新特性讲解及实例什么是 HooksHook 是 React 16.8 的新增特性。它可以让你在不编写 类组件 的情况下使用 state以及其他的 React 特性。类组件的不足状态逻辑复用难缺少复用机制渲染属性和高阶组…

7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据

当探索具有中等数量(不多不少的意思……)维度的数据集时,一个很好的方式是基于不同的子数据集构建不同的实例,并将它们以网格的方式组织在一张图之中。这种技术有时被称为“lattice”或“trellis”(大概是格子图、网格图),这跟“small multip…

面对峰值响应冲击,解决高并发的三大策略

2019独角兽企业重金招聘Python工程师标准>>> 当前在互联网的大潮下,众所周知淘宝、京东这些交易系统每天产生的数据量都是海量的,每天的交易并发也是惊人的,尤其是“双11”、“6.18”这些活动,对系统的峰值响应提出了非…

hibernate mysql 主从_MYSQL主从复制和写分离

基础篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理

本系列前面的五篇文章主要介绍Dora.Interception的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理。目录一、调用链抽象二、基于约定的拦截器定义三、基于调用上下文的依赖注入容器四、拦截器的提供五、调用链的构建六、方法拦截的实现原理七、依赖注…

完成登录与注册页面的前端

完成登录与注册页面的HTMLCSSJS,其中的输入项检查包括: 用户名6-12位 首字母不能是数字 只能包含字母和数字 密码6-12位 注册页两次密码是否一致 JS: function fnLogin() {var uSer document.getElementById("user");var pAss do…

WPF效果第二百零一篇之实现合并单元格

早一段时间又一次出差青海省西宁市;回来又是总结又是各种琐事,也没顾得上去分享点东西;大周末的就在家分享一下,这二天再次基于ListBox实现的合并单元格的效果:1、ListBox嵌套ListBox的前台布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

ASP.NET Core中使用EasyCaching作为缓存抽象层

简介做后端开发&#xff0c;缓存应该是天天在用&#xff0c;很多时候我们的做法是写个帮助类&#xff0c;然后用到的时候调用一下。这种只适合简单层次的应用&#xff1b;一旦涉及到接口实现调整之类的&#xff0c;这种强耦合的做法很不合适。有些其他的功能又要去重复造轮子。…

visual studio开启多核编译方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法进行了VS多线程的启动。 原本以为按以下步骤设置就OK了&#xff0c;但是编译中无意间发些了一个warning&#xff1a;“/Gm”与多处理不兼容&#xff1b;忽略 /MP 开关&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

如果我去深圳,你会见我吗

▲图/ 深圳夜景初次见易小姐&#xff0c;还是21年的春节回老家的时候。想来20年因为疫情没有回家&#xff0c;家母几次三番电话里头表达的思念以及建议一些不靠谱的回家计划&#xff0c;着实有些不忍&#xff0c;确实有似“儿行千里母担忧”之理&#xff0c;索性拿着年假和加班…

开源轻量的 .NET 监控工具 - 看门狗

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介WatchDog 是一个使用 C# 开发的开源的轻量监控工具&#xff0c;它可以记录和查看 ASP.Net Core Web 和 WebApi 的实时消息、事件、…

BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

http://www.lydsy.com/JudgeOnline/problem.php?id3231和斐波那契一个道理在最后加一个求和即可1 #include<cstdio>2 #include<cstring>3 #include<iostream>4 //using namespace std;5 const int maxn10010;6 const double eps1e-8;7 long long modn;8 lon…

马斯克的火箭上天了,SpaceX开源项目也登上了热榜!

python知识手册SpaceX于美国东部时间5月30日下午3&#xff1a;22分将两位美国宇航员送往国际空间站&#xff0c;虽然这只是Demo任务&#xff0c;但SpaceX已经以其卓越工程优势、低廉的发射成本赢得了全球航天产业的信赖。同时也是除美俄中这些航天国家队以外&#xff0c;唯一独…

机器视觉Halcon教程(1.介绍)

前言本期教程主要教大家如何使用Halcon机器视觉&#xff0c;通过使用Halcon, 我们可以实现一些机器视觉的应用开发。例如: OCR识别、视觉定位、缺陷检测等内容。什么是halcon&#xff1f;简单来说, Halcon就是一款应用于机器视觉的软件&#xff0c;它提供了一套开发工具&#x…

网络时间的那些事及 ntpq 详解

2019独角兽企业重金招聘Python工程师标准>>> GMT (Greenwich Mean Time)格林威治时间 UTC (Coordinated Universal Time) 协调世界时 IAT (International Atomic Time),TAI 国际原子时 CST (Chinese Standard Time), 北京时间Gentoo&#xff08;也许其他发行版也是&…

【前端芝士树】Javascript的原型与原型链

【前端芝士树】Javascript的原型、原型链以及继承机制 前端的面试中经常会遇到这个问题&#xff0c;自己也是一直似懂非懂&#xff0c;趁这个机会整理一下0. 为什么会出现原型和原型链的概念 1994年&#xff0c;网景公司&#xff08;Netscape&#xff09;发布了Navigator浏览器…

C# 反射之Activator用法举例

概述程序运行时&#xff0c;通过反射可以得到其它程序集或者自己程序集代码的各种信息&#xff0c;包括类、函数、变量等来实例化它们&#xff0c;执行它们&#xff0c;操作它们&#xff0c;实际上就是获取程序在内存中的映像&#xff0c;然后基于这个映像进行各种操作。Activa…