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

Posted

技术标签:

【中文标题】从音频文件中提取音高特征【英文标题】:extracting pitch features from audio file 【发布时间】:2013-12-22 13:51:18 【问题描述】:

我正在尝试,用于分类问题。我正在使用 python(scipy/numpy) 进行分类。

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

我认为 matlab 有一个色度工具箱,但我认为 python 没有任何类似的东西。

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

【问题讨论】:

【参考方案1】:

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

是要计算的 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。

【讨论】:

非常感谢...您能否推荐阅读有关音高检测或将 dsp 应用于一般音乐的材料或书籍? 作为对广泛的计算机音乐问题的一般介绍 C. Roads 计算机音乐教程(1994 年,剑桥:麻省理工学院出版社)是一本非常易于理解和全面的 (> 1000 页)参考书。对我来说,M. Müllers Information Retrieval for Music and Motion(2007 年,柏林,海德堡:施普林格)的第一部分非常棒(不太全面,更新,技术性更强)。如果您对特定主题感兴趣,procceedings of ISMIR 是一个丰富的信息。其他人可能会给你其他(更好的?)参考。我也会感兴趣的。 谢谢..我会调查他们 Pitch 是基频。泛音包括音色(发音为 tamber)。例如,长笛和小提琴可以演奏相同的音高(基频),但它们的音色是使它们听起来不同的谐波频率特性。 我认为,音高和音色不是“物理声学”事实,而是心理声学效应。这就是为什么我想要强调,“音高”来自对基本面的感觉,而不是基本面本身。你同意吗?【参考方案2】:

您可以尝试阅读有关音高检测的文献,该文献非常广泛。一般来说,基于自相关的方法似乎工作得很好。频域或过零方法的鲁棒性较差(因此 FFT 并没有太大帮助)。一个好的起点可能是实现以下两种算法之一:

YAAPT,来自:Stephen A. Zahorian 和 Hongbing Hu,“稳健基频跟踪的频谱时间方法”,J. Acoust。社会是。 123, 4559 (2008)。 http://bingweb.binghamton.edu/~hhu1/paper/Zahorian2008spectral.pdf 和这里的 MATLAB 代码:http://ws2.binghamton.edu/zahorian/yaapt.htm

YIN,来自:De Cheveigné, A., Kawahara, H. “YIN,语音和音乐的基频估计器”,J. Acoust。社会是。 111, 1917-1930 (2002)。 http://audition.ens.fr/adc/pdf/2002_JASA_YIN.pdf

至于现成的解决方案,请查看 Aubio、带有 python 包装器的 C 代码、几种可用的音高提取算法,包括 YIN 和多梳。

【讨论】:

非常感谢 :) 关于 aubio,我发现在此页面上实现示例 aubio.org/doc/latest/examples.html 有点困难。我在库中找不到他们在示例中使用的方法,也没有足够的文档。【参考方案3】:

如果您愿意使用 3rd 方库(至少作为其他人如何完成此操作的参考):

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

Demo of pitch detection in action Some background explanation

这里是相关的 EchoNest 文档:

Track API Methods 详细Analyze Documentation

相关摘录:

音高内容由“色度”向量给出,对应于 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 的效果。

【讨论】:

谢谢。有趣的视频:)

以上是关于从音频文件中提取音高特征的主要内容,如果未能解决你的问题,请参考以下文章

使用 tarosdsp 提取多个音频特征

音频处理Melodyne 音高调整 ( 打开音频文件 | 选择音高编辑工具 | 样本音高信息 | 音高自动调整 )

使用受限玻尔兹曼机提取音频特征

在不改变音高的情况下减慢音频文件的播放速度?

从浏览器中的麦克风获取音频输入并提取特征

使用以下 java 中的代码修改文件中特定位置的音频文件的音高