如何从Python中的麦克风获得声音input,并在飞行中处理它?

问候,

我正在尝试用Python编写一个程序,每次在麦克风中敲击时都会打印一个string。 当我说'点击'时,我的意思是一个巨大的突然噪音或类似的东西。

我在SOsearch,发现这个职位: 认识audio的音调

我认为PyAudio库会适合我的需求,但我不太清楚如何让我的程序等待audio信号(实时麦克风监控),当我得到一个如何处理它(我是否需要使用傅立叶变换像在上面的post中有教导)?

提前感谢您的帮助,您可以给我。

如果您正在使用LINUX,则可以使用pyALSAAUDIO 。 对于Windows,我们有PyAudio ,还有一个名为SoundAnalyse的库。

我在这里find了一个Linux的例子:

#!/usr/bin/python ## This is an example of a simple sound capture script. ## ## The script opens an ALSA pcm for sound capture. Set ## various attributes of the capture, and reads in a loop, ## Then prints the volume. ## ## To test it out, run it and shout at your microphone: import alsaaudio, time, audioop # Open the device in nonblocking capture mode. The last argument could # just as well have been zero for blocking mode. Then we could have # left out the sleep call in the bottom of the loop inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK) # Set attributes: Mono, 8000 Hz, 16 bit little endian samples inp.setchannels(1) inp.setrate(8000) inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) # The period size controls the internal number of frames per period. # The significance of this parameter is documented in the ALSA api. # For our purposes, it is suficcient to know that reads from the device # will return this many frames. Each frame being 2 bytes long. # This means that the reads below will return either 320 bytes of data # or 0 bytes of data. The latter is possible because we are in nonblocking # mode. inp.setperiodsize(160) while True: # Read data from device l,data = inp.read() if l: # Return the maximum of the absolute value of all samples in a fragment. print audioop.max(data, 2) time.sleep(.001) 

…当我得到一个如何处理它(我需要使用傅里叶变换就像它在上面的指示)?

如果你想要一个“点击”,那么我认为你对幅度的兴趣超过频率。 所以傅立叶变换可能对你的特定目标没有用处。 您可能想要对input的短期(例如10毫秒)幅度进行运行测量,并检测它何时突然增加一定的增量。 您需要调整以下参数:

  • 什么是“短期”幅度测量
  • 你寻找的增量是多less?
  • 增量变化必须发生的速度有多快

虽然我说你对频率不感兴趣,但你可能需要先进行一些滤波,滤除特别低频和高频成分。 这可能会帮助你避免一些“误报”。 你可以用FIR或IIR数字滤波器来做到这一点。 傅立叶是没有必要的。