从音频文件中提取音高特征

11

我正在尝试从音频文件中提取音高特征,以用于分类问题。我使用 Python(scipy/numpy)进行分类。

我认为可以使用 scipy.fft 获取频率特征,但我不知道如何通过频率近似音符。我做了一些研究,发现需要获取色度特征,将频率映射到半音阶的12个音符中的一个。

我认为 Matlab 有一个色度工具箱,但我不认为 Python 中有类似的东西。

我该怎么办?还有人能推荐一些我应该查阅的阅读材料吗?

3个回答

4
您可以将频率映射到音符:

n=12*log_2(f/Cp)+69

在编程中,n表示待计算的midi音符编号,f表示频率,Cp表示室内音高(现代音乐中,440.0 Hz 是常见的音高)。

你可能知道,单一频率并不构成一个乐音。 "音高" 来自基音或谐波声的感觉,即主要由一个单一频率(即基音)的整数倍构成的声音。

如果你想在 Python 中使用色度特征,可以使用Bregman 音视频信息工具箱。请注意,色度特征无法提供有关音高八度的信息,因此您只能获得有关音高类别的信息。

from bregman.suite import Chromagram
audio_file = "mono_file.wav"
F = Chromagram(audio_file, nfft=16384, wfft=8192, nhop=2205)
F.X # all chroma features
F.X[:,0] # one feature

从音频中提取音高信息的一般问题被称为音高检测

1
非常感谢...您能否推荐一些关于音高检测或将DSP应用于音乐的阅读材料或书籍? - Ada Xu
2
作为计算机音乐问题广泛介绍的入门读物,《计算机音乐教程》(1994年,剑桥:麻省理工学院出版社)是一本非常易懂且全面的参考书(超过1000页)。对我而言,M. Müllers的《音乐和动作信息检索》(2007年,柏林,海德堡:斯普林格出版社)的第一部分非常棒(不太全面,更加实时,技术含量更高)。如果您对特定主题感兴趣,ISMIR会议论文集是一个信息丰富的宝库。其他人可能会给您其他(或更好的)参考资料。我也很感兴趣。 - Frank Zalkow
谢谢..我会研究一下它们 - Ada Xu
音高是基本频率。泛音构成了音色(发音为tamber)。例如,长笛和小提琴可以演奏相同的音高(基本频率),但它们的音色是使它们听起来不同的谐波频率特征。 - Wyrmwood
我认为音高和音色不是“物理声学”事实,而是心理声学效应。这就是为什么我想强调,“音高”产生于对基频的感觉,而不是基频本身。你同意吗? - Frank Zalkow
我必须在这里同意Frank Zalkow的看法。 即使是调制的噪声爆发,非谐振/非周期性的声音也可能具有被感知的音高,因此基频显然并不是一切。 - Alex I

3
您可以阅读关于音高检测的文献,这方面的资料非常丰富。一般来说,基于自相关的方法效果不错;而基于频域或零交叉的方法较为脆弱(因此FFT并没有太大帮助)。你可以考虑实现以下两种算法之一作为起点:

至于现成的解决方案,可以查看Aubio,这是一个带有Python包装器的C语言库,提供了多种音高提取算法,包括YIN和multiple-comb。


1
非常感谢 :) 关于aubio,我发现在这个页面http://aubio.org/doc/latest/examples.html上实现示例有点困难。我找不到他们在库中使用的方法,并且文档不足。 - Ada Xu

2
如果你愿意使用第三方库(至少作为其他人如何完成此操作的参考):
从声音中提取音乐信息,PyCon 2012 的演示展示了如何使用 AudioNest Python API: 这里是相关的 EchoNest 文档: 相关摘录:
“音高内容”由“色度”向量给出,对应于C、C#、D到B的12个音高级别,其值范围从0到1,描述了色调音阶中每个音高的相对支配力。例如,C大调和弦可能由C、E和G的大值(即类0、4和7)表示。向量通过其最强的维度归一化为1,因此嘈杂的声音可能由所有接近1的值表示,而纯音则由一个值为1(音高)和其他接近0的值描述。
EchoNest在其服务器上进行分析。他们提供非商业用途的免费API密钥。
如果EchoNest不是一个选择,我会看看开源aubio项目。它有python绑定,您可以查看源代码以了解他们如何完成音高检测。

谢谢。有趣的视频 :) - Ada Xu

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