Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 识别音频的音调_Python_Audio - Fatal编程技术网

Python 识别音频的音调

Python 识别音频的音调,python,audio,Python,Audio,我有一把吉他,我需要我的电脑能够分辨出演奏的音符,识别音调。是否可以用python实现,也可以用pygame实现?能够在pygame中实现这一功能将非常有帮助。您需要使用内置的音频库 分析正在播放的特定音符并不简单,但可以使用这些API来完成 也可能有用:要识别音频信号的频率,可以使用FFT()算法。据我所知,PyGame没有办法录制音频,也不支持FFT变换 首先,您需要从声卡捕获原始采样数据;这种数据称为PCM(脉冲编码调制)。在Python中捕获音频的最简单方法是使用(Python到Port

我有一把吉他,我需要我的电脑能够分辨出演奏的音符,识别音调。是否可以用python实现,也可以用pygame实现?能够在pygame中实现这一功能将非常有帮助。

您需要使用内置的音频库

分析正在播放的特定音符并不简单,但可以使用这些API来完成


也可能有用:

要识别音频信号的频率,可以使用FFT()算法。据我所知,PyGame没有办法录制音频,也不支持FFT变换

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

获得原始PCM音频数据后,可以使用来自的
fftpack
模块通过FFT变换运行采样。这将为您提供分析音频信号的频率分布,即信号在特定频带中的强度。然后,问题是找到信号最强的频率

你可能需要一些额外的过滤来避免我不确定。

这显示了有人在VB.NET中进行过滤,但下面的链接中包含了实现目标所需的基本操作


我曾经写过一个实用程序,它可以分析播放的声音

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

我使用pymedia进行录制,使用scipy进行FFT

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

  • 如果你用麦克风录音,会有很多噪音。您将不得不使用大量的尝试和错误来设置阈值和声音清理方法,以使其正常工作。一个可能的解决方案是使用电吉他,并将其输出插入音频输入。这对我最有效
  • 具体来说,50Hz附近有很多噪音。这并不坏,但它的泛音(见下文)在100赫兹和150赫兹,这接近吉他的G2和D3。。。。正如我所说,我的解决办法是换成电吉他
  • 在检测速度和准确性之间有一个折衷。您采集的样本越多,检测声音所需的时间就越长,但检测准确的音高就越准确。如果你真的想用它来做一个项目,你可能需要使用几个时间尺度
  • 当播放音调时,它具有。有时,几秒钟后,泛音甚至可能比基音更强烈。如果你不处理这个问题,你的程序会认为它听到E2几秒钟,然后是E3。为了克服这个问题,我使用了一个当前播放的声音列表,然后只要这个音符,或者它的一个泛音中有能量,我就假设它是正在播放的同一个音符
  • 当一个人连续播放同一个音符2次(或更多)时,很难检测出来,因为很难将其与音量的随机波动区分开来。您将在我的代码中看到,我必须使用一个常量,该常量必须配置为与所使用的吉他匹配(显然,每个吉他都有自己的功率波动模式)
    非常相似的问题:

    将声音转换成一系列音符并不是一件容易的事情,尤其是同时使用多个音符。通读谷歌的“频率估计”和“注释识别”结果


    我有一些,但这只是从吉他录音中获取音符所需解决的问题的一部分。

    您是将计算机直接插入计算机还是依靠计算机麦克风?
    audioop
    模块只能执行相当原始的分析和压缩技术。这根本不足以满足询问者的目的。wiki链接是一个很长的链接列表,可能会造成比避免的更大的混乱。有没有处理一系列注释的标准方法?我不知道你在问什么,你能详细说明一下吗?如果你对一系列注释进行FFT,你会获得关于主频的信息,但会丢失关于注释时间位置的信息。(或者我错了吗?)我想你可以尝试切碎原始音频,以便将FFT应用于单个音符,但要想知道切碎的位置似乎很难。没错,通常的方法是将输入分解成足够小的块,这样就不会丢失计时上下文。当然,这是定时精度和频率精度之间的折衷。如果你想了解更多关于基音检测的信息,可以使用yin算法。你会再次上传源吗?看起来他们把它取下来了