前面说起过,音频指纹算法的思路。html
也梳理开源了两个比较经典的算法。git
https://github.com/cpuimage/shazamgithub
https://github.com/cpuimage/AudioFingerprinter算法
后来一段时间,稍微看了下这两个算法,还有很多能够精简优化的空间。app
例如抗噪,特征有效性等优化思路。性能
音频指纹切片后的hash特征信息仍是太多了,学习
不过做为哼唱搜歌的基本应用,是足够的了。优化
不过我以为仍是能够再进一步提取歌曲的旋律特征的,在音频指纹的基础上更进一步。ui
旋律是最重要的音乐要素之一,多应用于音乐内容分析、音乐创做、音乐教育、抄袭检测等方面。命令行
主旋律提取旨在从一段音乐中自动估计对应于主旋律单音音符序列的音高或基频。
流行音乐通常属于复杂的多音音乐,所以主旋律提取面临着许多挑战。
在这里要特别说一下,音频处理领域碰到的问题都是类似的。首当其冲主要是噪声,其次是音量和语速。
特别是在一些场景下的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