【发布时间】:2010-12-20 08:05:26
【问题描述】:
我有一把吉他,我需要我的电脑能够分辨出正在播放的音符,识别音调。是否可以在 python 中做到这一点,pygame 也可以吗?能够在 pygame 中做到这一点会非常有帮助。
【问题讨论】:
-
你是将电脑直接插入电脑还是依靠电脑麦克风?
我有一把吉他,我需要我的电脑能够分辨出正在播放的音符,识别音调。是否可以在 python 中做到这一点,pygame 也可以吗?能够在 pygame 中做到这一点会非常有帮助。
【问题讨论】:
要识别音频信号的频率,您可以使用 FFT (fast Fourier transform) 算法。据我所知,PyGame 无法录制音频,也不支持 FFT 变换。
首先,您需要从声卡中采集原始采样数据;这种数据称为 PCM(脉冲编码调制)。在 Python 中捕获音频的最简单方法是使用 PyAudio library(Python 绑定到 PortAudio)。 GStreamer 也可以,这对你的目的来说可能是矫枉过正。以 48000 Hz 的速率捕获 16 位样本是非常典型的,这可能是普通声卡所能提供的最好的。
获得原始 PCM 音频数据后,您可以使用 scipy library 中的 fftpack 模块通过 FFT 变换运行样本。这将为您提供分析的音频信号的频率分布,即特定频带中的信号强度。然后,就是找到信号最强的频率。
你可能需要一些额外的过滤来避免harmonic frequencies我不确定。
【讨论】:
我曾经写过一个实用程序来做这件事——它分析正在播放的声音。
您可以查看代码here(或者您可以下载整个项目。它集成了吉他英雄开源克隆 Frets On Fire,以创建真正的吉他英雄)。它使用吉他、口琴和口哨进行了测试 :) 代码很难看,但它可以工作 :)
我使用 pymedia 进行记录,并使用 scipy 进行 FFT。
除了其他人已经注意到的基础知识,我可以给你一些提示:
【讨论】:
您需要使用音频库,例如内置的audioop。
分析正在播放的特定音符并非易事,但可以使用这些 API 完成。
【讨论】:
audioop 模块只能做相当原始的分析和压缩技术。这根本不足以满足提问者的目的。 wiki 链接是一个很长的链接列表,可能会导致比它避免的更多的混乱。
非常相似的问题:
将声音变成一系列音符并不是一件容易的事,尤其是同时处理多个音符。通读“频率估计”和“音符识别”的 Google 结果。
我有一些Python frequency estimation examples,但这只是从吉他录音中获取音符所需解决的一部分。
【讨论】:
这个link 展示了一些人在 VB.NET 中执行此操作,但在下面的这些链接中捕获了实现目标所需完成的基本操作。
【讨论】: