我有一把吉他,我需要我的电脑能够辨别正在演奏的音符并识别音调。是否可以用 python 来实现,也可以用 pygame 来实现吗?能够在 pygame 中做到这一点将会非常有帮助。
要识别音频信号的频率,您可以使用 FFT(快速傅立叶变换)算法。据我所知,PyGame 无法录制音频,也不支持 FFT 变换。
首先需要从声卡中捕获原始采样数据;这种数据称为PCM(脉冲编码调制)。在 Python 中捕获音频的最简单方法是使用 PyAudio 库(Python 绑定到 PortAudio)。 GStreamer 也可以做到这一点,这对于您的目的来说可能有点过分了。以 48000 Hz 的速率捕获 16 位样本是非常典型的,并且可能是普通声卡所能提供的最好的结果。
获得原始 PCM 音频数据后,您可以使用
scipy 库中的
fftpack
模块通过 FFT 变换运行样本。这将为您提供所分析的音频信号的“频率分布”,即某些频段的信号有多强。然后,就是找到信号最强的频率。
您可能
您可以查看代码
这里(或者您可以下载整个项目。它与Frets On Fire(一个吉他英雄开源克隆)集成,以创建一个真正的吉他英雄)。它是使用吉他、口琴和口哨进行测试的:)代码很丑陋,但它有效:) 我使用pymedia进行记录,并使用scipy进行FFT。
除了其他人已经注意到的基础知识外,我可以给你一些提示:
如果用麦克风录音,会有很多噪音。您必须进行大量的反复试验来设置阈值和合理的清理方法才能使其正常工作。一种可能的解决方案是使用电吉他,并将其输出插入音频输入。这对我来说效果最好。