【问题标题】:extracting pitch features from audio file从音频文件中提取音高特征
【发布时间】:2026-01-10 20:10:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python audio scipy feature-extraction


    【解决方案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 并没有太大帮助)。一个好的起点可能是实现以下两种算法之一:

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

    【讨论】:

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

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

    从声音中提取音乐信息,来自 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 的效果。

    【讨论】:

    • 谢谢。有趣的视频:)
    最近更新 更多