python - sounddevice - pyaudio
¿Cómo obtener entrada de sonido del micrófono en python y procesarlo sobre la marcha? (2)
... y cuando obtuve uno cómo procesarlo (¿necesito usar la Transformada de Fourier como se indicó en la publicación anterior)?
Si quieres un "toque", creo que estás interesado en la amplitud más que en la frecuencia. Entonces las transformaciones de Fourier probablemente no sean útiles para su objetivo particular. Es probable que desee realizar una medición en funcionamiento de la amplitud a corto plazo (digamos 10 ms) de la entrada, y detectar cuándo aumenta repentinamente un cierto delta. Debería ajustar los parámetros de:
- ¿cuál es la medida de amplitud "a corto plazo"
- ¿Cuál es el aumento delta que buscas?
- qué tan rápido debe ocurrir el cambio delta
Aunque le dije que no le interesaba la frecuencia, es posible que desee realizar primero algunos filtros para filtrar componentes especialmente de baja y alta frecuencia. Eso podría ayudarlo a evitar algunos "falsos positivos". Podrías hacer eso con un filtro digital FIR o IIR; Fourier no es necesario.
Saludos,
Intento escribir un programa en Python que imprima una cadena cada vez que toca el micrófono. Cuando digo ''tocar'', me refiero a un ruido repentino fuerte o algo similar.
Busqué en SO y encontré esta publicación: Reconociendo el tono del audio
Creo que la biblioteca de PyAudio satisfaría mis necesidades, pero no estoy muy seguro de cómo hacer que mi programa espere una señal de audio (monitoreo de micrófono en tiempo real) y cuándo obtuve uno para procesarlo (¿necesito usar Fourier Transform como fue instruido en la publicación anterior)?
Gracias de antemano por cualquier ayuda que pueda darme.
Si está utilizando LINUX, puede usar pyALSAAUDIO . Para Windows, tenemos PyAudio y también hay una biblioteca llamada SoundAnalyse .
Encontré un ejemplo para Linux here :
#!/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)