给定音乐文件,是否可以分割出正在播放的每个乐器?也就是说我有一些Song.mp3,那首歌中有人声,吉他,贝司和鼓.我想要获得4个"轨道" - 每个不同的乐器一个.
考虑到乐器可以重叠,我猜这几乎是不可能的,而且很难区分重叠的声音,更不用说乐器了.
然而,有一个库,或算法,或一些这样做的方式,我很想知道如何.
我的本科项目涉及将笔记从WAV文件转录到MIDI文件.我们只处理了一种乐器的简单情况,可能一次只演奏一个以上的音符(例如钢琴).我们在开始之前对这个主题的研究表明,即使这个(即只有一种工具)也被认为是非平凡的.基本上,问题是:
找出在任何给定时间播放的频率.这可以通过一次一个小窗口的DFT/FFT来完成.
使用一些启发式方法来猜测哪些频率是同一音符的和声,哪些频率属于不同的音符.如果您知道正在播放什么乐器,这可能很容易,但在一般情况下这很难,因为每种和声的大小因乐器而异.例如,除了一个乐器,你可能有两个Cs一个八度,或者你可能有一个C但是来自不同的乐器.
在您知道每次播放的音符后,您必须猜测音符何时中断.你可以有一个长音符或一系列短音符.根据您用于初始DFT的窗口大小,您可能会在此处获得不同的结果.
现在,如果你一次有多个乐器,并且没有两个乐器同时演奏相同的音符或和声,你或许可以使用谐波的大小或序列上的一些启发式来区分乐器.他们正在玩的音符.最有可能的是,有两种乐器会播放同一音符.然后你真的没有办法决定是否有(a)一个乐器演奏音符,(b)两个乐器以同一音量播放,(c)一个演奏柔和,另一个演奏大声或(d)任何其组合.
无论如何,这是要解决的问题的简短列表.我不知道在一般情况下解决这个问题的算法.我认为这个问题还没有解决.
编辑: 我的项目演示文稿可在http://www-sipl.technion.ac.il/new/Archive/Special_Events/sipl2004/Projects_PowerPoint/WAV-to-MIDI.pdf中找到.
实际上,我已经碰到了一个非常有趣的算法ICA(Independent Component Analysis).这种算法背后的概念不是来自信号处理世界,而是来自概率理论.我们用它来分离两首混合成单个mp3文件的歌曲.你可以找到在Matlab\C++ \的Python实现库调用的FastICA 这里.试一试,这真的很棒.