问题描述
问候,
我正在尝试用Python编写一个程序,该程序每次在麦克风中被点击时都会打印一个字符串.当我说轻按"时,是指突然的大声喧similar或类似的声音.
I'm trying to write a program in Python which would print a string every time it gets a tap in the microphone. When I say 'tap', I mean a loud sudden noise or something similar.
我在SO中进行搜索,发现了以下信息:识别音频的音调
I searched in SO and found this post: Recognising tone of the audio
我认为PyAudio库可以满足我的需求,但是我不太确定如何使我的程序等待音频信号(实时麦克风监视),以及当我得到一个如何处理它时(我是否需要使用像上面帖子中指示的那样进行傅立叶变换?)
I think PyAudio library would fit my needs, but I'm not quite sure how to make my program wait for an audio signal (realtime microphone monitoring), and when I got one how to process it (do I need to use Fourier Transform like it was instructed in the above post)?
在此先感谢您能给我的帮助.
Thank you in advance for any help you could give me.
推荐答案
如果使用的是LINUX,则可以使用 pyALSAAUDIO .对于Windows,我们有 PyAudio ,还有一个名为 SoundAnalyse .
If you are using LINUX, you can use pyALSAAUDIO.For windows, we have PyAudio and there is also a library called SoundAnalyse.
我在此处找到了一个示例
#!/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)
这篇关于如何从Python中的麦克风获取声音输入,并即时进行处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!