算法:确定音频是否为音乐

16

我不确定这是否是正确的堆栈交换子网站来发布这个问题,但是...

我正在寻找一种算法,可以用它来确定给定的音频片段是否为音乐。只需要一个布尔结果就可以了,我不需要知道键、BPM或任何其他东西,我只需要能够确定它是否似乎是音乐(而不是语音)。编程语言无关,但我最终会将其转换为Python。


20
甚至人类也会对某个声音是否是音乐存在争议 :-/ - Mat
2
这是一个非常困难的问题。 - Oliver Charlesworth
2
我建议你去http://cstheory.stackexchange.com/ 上问一下,如果幸运的话,你可能会找到一些正在研究能够做到这一点的研究生。我知道你觉得你要求的很简单,但实际上你要求了很多东西。有些人可以通过提供你刚刚所要求的内容获得他们的博士学位。 - Dave
2
如果您解决了这个问题,我想在我的大学“21世纪音乐中心”上运行它,看看会发生什么。 - Thom Smith
1
我要直接称呼Jerry Coffin为心胸狭窄,因为显然这是被允许的。 - korona
显示剩余9条评论
4个回答

13
在一个短语中,傅里叶分析。观察不同频率随时间的变化。这是语音,这是小提琴演奏。前者显示每个音节的巨大变化;“流动”非常不连贯,可以通过将不同频带的导数作为时间函数的算法来捕捉。在典范音乐中,转换要平滑得多,音调更纯净(图表中的“模糊”较少)。另请参见“声谱图”维基百科页面

是的,这被称为频谱通量。它可以用于确定声音被感知为多么“动态”。然而,仅凭频谱通量无法可靠地进行语音/音乐区分;您还需要其他特征。 - johnwbyrd

3
由于某种原因,这个问题吸引了大量非常糟糕的答案。
使用 pyAudioAnalysis。此外,谷歌“音频特征分析”。
表面上看,这似乎是一个难题,但过去20年里分类器方面有了巨大的突破,因此存在许多文档良好的解决方案。现今的大多数分类器通常只需几个百分点的误差率即可解决这个问题。一些分类器甚至可以确定音乐的流派
目前大多数进行此操作的算法都会对输入音频进行一系列统计学特征检测(特征),然后根据以前的训练数据做出一组自动分类判断。 pyAudioAnalysis是一个库,用于提取这些特征,然后基于检测到的特征训练kNN或其他混合模型。还有许多类似的库,比如C++的Essentia。Essentia还具有Python绑定。 音频内容分析简介:信号处理和音乐信息学应用是一本很好的入门书。

1
pyAudioAnalysis文档/维护非常糟糕。 - ahjmorton

2
您可以设置几个Karplus Strong共振环,通过它们传递音频,并监测每个环中的能量水平。如果是西方音乐,则基本上都调整为12-TET,即以音乐会A4@440Hz为基础的对数12音阶。因此,只需选择三到四个在八度内等距分布的音符,例如C5(省略C# D D#),E5(省略F F# G),G#5(省略A A# B)。至少其中一个环将定期闪烁 - 无论音乐所在的键是哪一个,它可能会经常击中这些音符之一。理想情况下,应该为一堆音符做到这一点,但如果需要实时操作,则同时将音频馈送到50个环中可能会有点困难。或者,您甚至可以使用音高检测器并编目记录的音高,查看对数(noteAfreq):log(noteBfreq)的比率,看它们是否将自己排列成低阶分数,例如3:4+=0.5%。但我认为没有人建造出一个像样的多声部音高检测器 - 这几乎是不可能的。Melodyne可能已经解决了这个问题。如果只是人声信号,您可以给我发电子邮件。

什么是“共振环”?Karplus-Strong算法与检测频率的存在有何关系? - johnwbyrd

0

在音乐音调范围内寻找一系列FFT的小“第一微分”(即:对于每个1024个样本的块运行FFT,然后绘制chunk1-chunk0、chunk2-chunk1等)。作为第一次近似,这应该足以检测简单的事情。

这是一种可以通过特定类型的方式进行调整的算法。音乐本身通常也是周期性的,因此需要想出一种方法来在FFT上运行FFT。而且寻找一致的两个十二次根数的频率分布听起来非常可信。

我敢打赌你希望找到一个免费的Python库,让你只需将文件拖放进去就可以了。 :-)


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