WAV转MIDI转换

10
我是这个领域的新手 - 但我需要在Java中执行WAV-to-MIDI转换。 是否有一种方法可以知道WAV-to-MIDI转换所涉及的具体步骤? 我有一个非常粗略的想法,因为您需要; 对wav文件进行采样,过滤它,使用FFT进行谱分析,提取特征,然后将提取的特征写入MIDI。 但是我找不到如何完成所有这些的可靠来源或论文? 有人可以给我一些线索,告诉我从哪里开始以及如何做吗? 是否有任何开放源代码的API可用于此WAV-to-MIDI转换过程? 预先感谢

也请查看 https://dev59.com/VHI-5IYBdhLWcg3w48xP#1628241 - Stefano Borini
可能是将wav转换为midi的重复问题。 - finnw
5个回答

28

这是一个比你想象中更为复杂的过程。

这个研究问题通常被称为音乐转录:将音乐的低级表示(例如波形)转换为更高级别的表示,如MIDI甚至乐谱。

你的解决方案的复杂性取决于输入数据的复杂性。许多研究论文仅就单声道钢琴或鼓进行音乐转录……因为它们很容易转录。(相对来说)小提琴更难。人声更难。小提琴加上人声和钢琴要更困难。交响乐几乎不可能。你明白了吧。

音乐转录的基本元素包括以下任意重叠区域:

  1. (多)音高估计
  2. 乐器识别、音色建模
  3. 节奏检测
  4. 音符起始/终止检测
  5. 形式/结构建模

在Google学术或ISMIR会议记录中搜索“音乐转录”的论文:http://www.ismir.net。如果你更感兴趣其中的某个子主题,我可以为你指引更多资源。祝好运。

编辑:话虽如此,我们可以在网上找到现有的解决方案。请随意尝试它们。但是,在这个过程中,请以批判的眼光和耳朵来评估它们。什么类型的音频信号会导致转录失败?

编辑2:啊,你只需要钢琴。好的,这是可行的。音乐转录已经发展到可以很好地转录单声道钢琴的程度了。但是拉赫玛尼诺夫协奏曲仍然会带来问题。

我们的建议取决于你的最终目标。你说“需要在Java中执行……”。所以看起来你只是想让它能够工作,而不考虑它如何实现。在这种情况下,我完全同意其他人的建议:使用现有的解决方案。

这其实是一个有趣的问题;我所知道的所有MIR库通常都是C/C++/Python/Matlab编写的,没有Java。虽然EchoNest有Java API,但我认为它不支持音符级别的转录。http://developer.echonest.com。(编辑:它确实支持音符级别的转录。返回的数据包括音高、音色、节拍、tatum等等。但多声部仍然是一个问题。)

哦,Marsyas是基于Java的。很酷。我以为它只是C++。 http://marsyas.info/ 我推荐使用这个工具。它由MIR教授George Tzanetakis开发,可以进行信号级别的分析,应该是一个不错的选择。

如果这是为了有趣的学习体验,我认为您可以使用Java中的声音操作工具来对WAV信号进行实验,看看会发生什么。

编辑:这个页面更好地描述了MIR软件:我们使用的工具

对于Matlab,您可能会对MIR工具箱感兴趣。

这里是一个常见数据集的好网页:MIR数据集


Steve,非常感谢你的回答。我想学习更多并探索这个领域。你提到了“我知道的所有MIR库...”。我没有受限于任何特定的语言。你能推荐一个库(最好是开源的,但不一定)- 任何语言都可以吗?我特别感兴趣的是单个乐器的转录。此外,当前技术水平是否允许“实时”转录?也就是说,一台普通PC可以在音乐演奏时转录音乐吗? - Uri London
不客气。平均PC上的实时转录相当糟糕,我想。我和许多其他人都不会费心去做它,因为我们已经很难完美地进行离线转录了!获得比如说80%(笔记)以上的转录率是很罕见的。请参见编辑以获取更多工具。 - Steve Tjoa

4
这对于新手来说是一项非常艰巨的任务,除非您熟悉信号分析和特征检测,并且想更具体地研究自动转录。
没有WAV到MIDI转换的API。Vamp是一个特征提取插件框架,但要进行自动转录,您需要使用所有现有插件的功能,以及实现其中尚不存在的功能。
浏览vamp下载页面上插件的描述,任何您不理解的描述都是您应该开始研究的主题,如果您想要做到这一点。

谢谢你的建议,史密斯。至少现在我知道寻找能够做到这一点的API是没有意义的。你能否使用插件来编写Java代码?特征提取-我必须使用算法吗?仅仅因为我知道一个算法,我怎么能将其转化为代码?我是否需要使用Matlab并与某种语言(比如Java)集成?你能给我一个画面吗?再次感谢你,史密斯。 - Dolphin
1
Vamp使用C、C++。难道没有Java插件和类似的资源吗?那将是非常有用的。如何在Java代码中使用插件?提前感谢。 - Dolphin
1
Java在信号处理/分析中并不经常出现,因为它相对于CPU来说比较密集,并且直到最近硬件速度还不够快以在Java中以可接受的速度执行此类操作。不过看起来Steve找到了一个好的线索。对于更高级的方法,还可以使用像csound http://csounds.com/这样的环境,它提供了大量用于合成和分析声音的工具,而不必像使用C语言那样担心显式内存分配和释放。 - Justin Smith
关于如何在Java中使用插件,插件是一个动态加载的库,你可以使用JNI在Java程序中加载和访问它:http://en.wikipedia.org/wiki/Java_Native_Interface - Justin Smith

3
如果您不需要自动化此任务(例如,用于上传MP3并获得MIDI文件的网站),则应考虑使用像Melodyne这样的工具,它已经非常擅长处理此类问题。正如Steve所指出的那样,这是一项非常困难的任务,即使目前存在最好的算法和解决方案也不是100%可靠的。

因此,如果您只是在录音室工作并需要进行几个转换,使用已经为此任务设计的工具可能会节省您一些时间(并避免很多麻烦)。


2

这是一个仍在高度开发中的领域,但是已经有一些(实验性)的算法可用。

您可以安装Sonic Annotator并使用几个Vamp插件。

例如:

./sonic-annotator file.wav -d vamp:qm-vamp-plugins:qm-transcription:transcription -w midi

./sonic-annotator file.wav -d vamp:silvet:silvet:notes -w midi

./sonic-annotator file.wav -d vamp:ua-vamp-plugins:mf0ua:mf0ua -w midi

1

Dolphin,抱歉直言不讳,但你完全低估了这个问题。你想实现的——涉及到演奏时使用的所有参数的完整钢琴音乐转录——需要大量研究,并与在该领域工作多年的人合作。即使是一组信号处理的博士也必须投入大量的工作才能接近你所说的东西。音乐转录甚至需要几十年的工作才能实现一半的可靠性。我建议你选择一个你能够比这个更好地管理的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接