我有一把吉他,我需要我的电脑能够分辨正在播放的音符,识别音调。是否有可能在python中执行它,也可以使用pygame吗?能够在pygame中做到这一点非常有帮助。
答案 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。
除了其他人已经注意到的基础知识外,我可以给你一些提示:
答案 2 :(得分:1)
答案 3 :(得分:1)
非常相似的问题:
将声音转换为一系列音符并不是一件容易的事情,尤其是一次发出多个音符。通读Google搜索结果“频率估算”和“音符识别”。
我有一些Python frequency estimation examples,但这只是您从吉他录音中获取音符所需要解决的部分内容。
答案 4 :(得分:0)
这个link显示了一些人在VB.NET中这样做,但是在下面这些链接中捕获了实现目标需要完成的基础知识。