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

时间:2013-12-22 13:51:19

标签: python audio scipy feature-extraction

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

我想我可以使用scipy.fft获取频率功能,但我不知道如何使用频率来近似音符。我研究了一下,发现我需要获得色度特征,将频率映射到12个二进制位以获得半音阶的音符。

我认为有一个用于matlab的色度工具箱,但我不认为python有类似的东西。

我该如何继续前进? 任何人都可以建议阅读我应该研究的材料吗?

3 个答案:

答案 0 :(得分:4)

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

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

n是要计算的midi音符编号,f频率和Cp音调音高(现代音乐440.0 Hz是常见的)。

您可能知道单个频率不会产生音乐音调。 “音调”源于谐波声音基础的感觉,即主要由单个频率(=基频)的整数倍组成的声音。

如果您想在Python中使用色度特征,可以使用Bregman Audio-Visual Information Toolbox。请注意,色度功能不会为您提供有关音高的八度音阶的信息,因此您只需获取有关pitch class的信息。

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

从音频中提取音调信息的一般问题称为pitch detection

答案 1 :(得分:2)

你可以尝试阅读关于音高检测的文献,这是非常广泛的。通常,基于自相关的方法看起来效果很好;频域或过零方法不太稳健(因此FFT实际上没有多大帮助)。一个好的起点可能是实现这两种算法之一:

就现成的解决方案而言,查看Aubio,使用python包装器的C代码,可用的几种音调提取算法,包括YIN和多梳。

答案 2 :(得分:2)

如果您愿意使用第三方图书馆(至少作为其他人如何完成此作为参考):

从声音中提取音乐信息,来自PyCon 2012的演示文稿,展示了如何使用AudioNest Python API:

以下是相关的EchoNest文档:

相关摘录:

  

音高内容由“色度”向量给出,对应于   12个音高等级C,C#,D到B,其值为0到1   描述了半音音阶中每个音高的相对优势。   例如,C大调和弦很可能用大数字表示   C,E和G的值(即0,4和7类)。矢量是   通过它们最强的维度归一化为1,因此产生噪音   可能由全部接近1的值表示,而纯值   音调由1(音调)处的一个值和接近0的其他值描述。

EchoNest在他们的服务器上进行分析。它们为非商业用途提供免费的API密钥。

如果EchoNest不是一个选项,我会看一下开源aubio project。它有python绑定,您可以检查源代码以了解they accomplished pitch detection

的方式