识别音频的音调

Gab*_*lli 19 python audio

我有一把吉他,我需要我的电脑能够分辨正在播放的音符,识别音调.是否有可能在python中执行它,也可以使用pygame吗?能够在pygame中执行它将非常有帮助.

int*_*tgr 19

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

首先,您需要从声卡中捕获原始采样数据; 这种数据称为PCM(脉冲编码调制).在Python中捕获音频的最简单方法是使用PyAudio库(Python绑定到PortAudio).GStreamer也可以做到这一点,它可能是一个矫枉过正的目的.以48000 Hz的速率捕获16位采样非常典型,可能是普通声卡给你的最好的.

获得原始PCM音频数据后,您可以使用scipy库中fftpack模块通过FFT变换运行样本.这将为您提供分析的音频信号的频率分布,即某些频段的信号强度.然后,这是找到具有最强信号的频率的问题.

可能需要一些额外的过滤来避免我不确定的谐波频率.


Ofr*_*viv 19

我曾经写过一个实用程序就是这样 - 它分析了正在播放的声音.

您可以在这里查看代码(或者您可以下载整个项目.它与Frets On Fire集成,一个吉他英雄开源克隆,以创建一个真正的吉他英雄).它是用吉他,口琴和口哨测试的:)代码很难看,但它有效:)

我使用pymedia来记录和scipy用于FFT.

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

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

  • 你会再次上传源代码吗?看起来他们把它拿下来了 (7认同)