我正在尝试从音频文件中提取音高特征,我将用于分类问题。我使用python(scipy / numpy)进行分类。
我想我可以使用scipy.fft
获取频率功能,但我不知道如何使用频率来近似音符。我研究了一下,发现我需要获得色度特征,将频率映射到12
个二进制位以获得半音阶的音符。
我认为有一个用于matlab的色度工具箱,但我不认为python有类似的东西。
我该如何继续前进? 任何人都可以建议阅读我应该研究的材料吗?
答案 0 :(得分:4)
您可以将频率映射到音符:
是要计算的midi音符编号,频率和音调音高(现代音乐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实际上没有多大帮助)。一个好的起点可能是实现这两种算法之一:
YAAPT,来自:Stephen A. Zahorian和Hongbing Hu,“用于稳健基频跟踪的频谱 - 时间方法”,J。Acoust。 SOC。上午。 123,4559(2008)。 http://bingweb.binghamton.edu/~hhu1/paper/Zahorian2008spectral.pdf和MATLAB代码:http://ws2.binghamton.edu/zahorian/yaapt.htm
YIN,来自:DeCheveigné,A.,Kawahara,H。“YIN,语音和音乐的基本频率估算器”,J。Acoust。 SOC。上午。 111,1917-1930(2002)。 http://audition.ens.fr/adc/pdf/2002_JASA_YIN.pdf
就现成的解决方案而言,查看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。
的方式