识别音频音调

问题描述 投票:0回答:5

我有一把吉他,我需要我的电脑能够辨别正在演奏的音符并识别音调。是否可以用 python 来实现,也可以用 pygame 来实现吗?能够在 pygame 中做到这一点将会非常有帮助。

python audio
5个回答
21
投票

要识别音频信号的频率,您可以使用 FFT(快速傅立叶变换)算法。据我所知,PyGame 无法录制音频,也不支持 FFT 变换。

首先需要从声卡中捕获原始采样数据;这种数据称为PCM(脉冲编码调制)。在 Python 中捕获音频的最简单方法是使用 PyAudio 库(Python 绑定到 PortAudio)。 GStreamer 也可以做到这一点,这对于您的目的来说可能有点过分了。以 48000 Hz 的速率捕获 16 位样本是非常典型的,并且可能是普通声卡所能提供的最好的结果。

获得原始 PCM 音频数据后,您可以使用

scipy 库
中的 fftpack 模块通过 FFT 变换运行样本。这将为您提供所分析的音频信号的“频率分布”,即某些频段的信号有多强。然后,就是找到信号最强的频率。

可能

需要一些额外的滤波来避免谐波频率我不确定。


19
投票

您可以查看代码

这里

(或者您可以下载整个项目。它与Frets On Fire(一个吉他英雄开源克隆)集成,以创建一个真正的吉他英雄)。它是使用吉他、口琴和口哨进行测试的:)代码很丑陋,但它有效:) 我使用pymedia进行记录,并使用scipy进行FFT。

除了其他人已经注意到的基础知识外,我可以给你一些提示:

如果用麦克风录音,会有很多噪音。您必须进行大量的反复试验来设置阈值和合理的清理方法才能使其正常工作。一种可能的解决方案是使用电吉他,并将其输出插入音频输入。这对我来说效果最好。
  1. 具体来说,50Hz附近有很多噪音。这还不错,但它的泛音(见下文)为 100 Hz 和 150 Hz,接近吉他的 G2 和 D3...正如我所说,我的解决方案是改用电吉他。
  2. 检测速度和准确性之间需要权衡。采集的样本越多,检测声音所需的时间就越长,但检测准确的音高会更准确。如果你真的想以此为基础制作一个项目,你可能需要使用多个时间尺度。
  3. 当播放音调时,它有
  4. 泛音
  5. 。有时,几秒钟后,泛音甚至可能比基音更强大。如果您不处理这个问题,您的程序会认为它听到了 E2 几秒钟,然后是 E3。为了克服这个问题,我使用了当前播放的声音列表,然后只要这个音符或其泛音之一具有能量,我就假设它正在播放相同的音符...... 当有人连续演奏同一个音符两次(或多次)时,特别难以检测,因为很难区分它和声级的随机波动。您将在我的代码中看到,我必须使用一个常量,该常量必须配置为与所使用的吉他相匹配(显然每把吉他都有自己的功率波动模式)。

1
投票

audioop 分析正在演奏的特定音符并不简单,但可以使用这些 API 来完成。

也可以使用:

http://wiki.python.org/moin/PythonInMusic


1
投票

    音频处理-音调识别
  • 实时音高检测
  • 使用 FFT 进行实时音调检测
  • 将声音转换为一系列音符并不是一件容易的事情,尤其是同时处理多个音符。通读 Google 结果“频率估计”和“音符识别”。

我有一些

Python 频率估计示例

,但这只是从吉他录音中获取音符所需解决的一部分。


0
投票
链接

显示了有人在 VB.NET 中执行此操作,但实现目标所需要做的基础知识在以下主题中捕获:

    STFT
  • 科利·图基
  • FFT
© www.soinside.com 2019 - 2024. All rights reserved.