识别音频的音调

时间:2009-11-25 15:19:56

标签: python audio

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

5 个答案:

答案 0 :(得分:19)

要识别音频信号的频率,您可以使用FFT(fast Fourier transform)算法。据我所知,PyGame无法录制音频,也不支持FFT转换。

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

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

可能需要一些额外的过滤以避免harmonic frequencies我不确定。

答案 1 :(得分:19)

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

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

我使用pymedia来记录和解析FFT。

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

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

答案 2 :(得分:1)

您需要使用内置的audioop等音频库。

分析正在播放的特定音符并非易事,但可以使用这些API完成。

也可以使用:http://wiki.python.org/moin/PythonInMusic

答案 3 :(得分:1)

非常相似的问题:

将声音转换为一系列音符并不是一件容易的事情,尤其是一次发出多个音符。通读Google搜索结果“频率估算”和“音符识别”。

我有一些Python frequency estimation examples,但这只是您从吉他录音中获取音符所需要解决的部分内容。

答案 4 :(得分:0)

这个link显示了一些人在VB.NET中这样做,但是在下面这些链接中捕获了实现目标需要完成的基础知识。