我想知道如何为歌曲的声乐和非声乐片段分类执行“光谱变化检测”。我们需要从光谱图中找到光谱变化。关于此的任何详细信息,特别是涉及 MATLAB?
5 回答
正如其他人所指出的,仅使用原始频谱分析来解决这个问题是一个非常困难的问题,而且您不太可能找到一个好的解决方案。充其量,您可能能够从混音中提取一些人声和一些额外的交叉频率。
但是,如果您可以更具体地了解您在此处使用的音频材料的性质,您可能会更进一步。
在最坏的情况下,您的素材将是普通歌曲的普通 mp3——即,一个完整的乐队 + 歌手。我有一种感觉,鉴于您的问题的性质,您可能正在考虑这种情况。
在最好的情况下,您可以访问多轨录音室录音,并且至少拥有完整的混音和乐器音轨,在这种情况下,您可以从混音中提取人声频率。您可以通过从其中一个轨道生成脉冲响应并将其应用到另一个轨道来做到这一点。
在中间情况下,您正在处理简单的音乐,您可以应用某种针对音乐参数调整的算法。例如,如果您正在处理电子音乐,您可以利用轨道的立体声宽度来消除所有单声道元素(即低音线 + 底鼓)以提取人声 + 其他声像乐器,然后应用某种类型的从那里进行过滤和频谱分析。
简而言之,如果您打算制作一个通用算法来从任意源材料生成干净的无伴奏合唱,那么您可能会咬得比您在这里咀嚼的更多。如果您可以明确限制您的源材料,那么您可以根据这些来源的性质使用多种算法。
这很难。如果你能可靠地做到这一点,你将成为一名有成就的计算机科学家。我读到的最有前途的方法是使用歌词生成一个只有语音的轨道以进行比较。再说一次,如果你能做到这一点并写一篇关于它的论文,你就会出名(在计算机科学家中)。另外,您可以通过自动生成卡拉 OK 时间来赚很多钱。
如果您只想确定一段音乐是干净的无伴奏合唱还是具有乐器背景,您可以通过将信号带宽与正常的人类歌手带宽进行比较来做到这一点。此外,您可以检查基本频率,它只能在人声的非常有限的频率范围内。
不过,这可能并不容易。但是,助听器一直都是这样做的,所以显然是可行的。(尽管他们通常会寻找演讲,而不是唱歌)
首先将乐器与原件同步,确保它们具有相同的长度和比特率,并在准确的时间开始和结束,并将它们转换为 .wav
然后做类似的事情
I = wavread(instrumental.wav);
N = wavread(normal.wav);
i = inv(I);
A = (N - i); // it could be A = (N * i) or A = (N + i) you'll have to play around
wavwrite(A, acapella.wav)
应该这样做..一点线性代数有很长的路要走。