Detecta y graba un sonido con python.

Estoy usando este progtwig para grabar un sonido en python:

Detectar y grabar audio en Python

Quiero cambiar el progtwig para iniciar la grabación cuando la entrada de la tarjeta de sonido detecta el sonido. Probablemente debería comparar el nivel de sonido de entrada en trozo, pero ¿cómo hacer esto?

Podrías probar algo como esto:

basado en esta pregunta / respuesta

# this is the threshold that determines whether or not sound is detected THRESHOLD = 0 #open your audio stream # wait until the sound data breaks some level threshold while True: data = stream.read(chunk) # check level against threshold, you'll have to write getLevel() if getLevel(data) > THRESHOLD: break # record for however long you want # close the stream 

Probablemente querrá jugar con el tamaño de sus trozos y los valores de umbral hasta que obtenga el comportamiento deseado.

Editar:

Puede usar el paquete de audioop incorporado para encontrar la raíz cuadrada media (rms) de una muestra, que generalmente es la forma en que obtendría el nivel.

 import audioop import pyaudio chunk = 1024 p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=chunk) data = stream.read(chunk) rms = audioop.rms(data, 2) #width=2 for format=paInt16 

La detección de cuándo no hay silencio se hace generalmente usando el cuadrado medio de la raíz (RMS) de un fragmento del sonido y comparándolo con el valor de umbral establecido (el valor dependerá de la sensibilidad de su micrófono y otras cosas). tendrás que ajustarlo). Además, dependiendo de la rapidez con la que desee que el micrófono detecte el sonido, es posible que desee reducir el tamaño del fragmento o calcular el RMS para la superposición de fragmentos de datos.

Como hacerlo se indica en el enlace que le das:

 print "* recording" for i in range(0, 44100 / chunk * RECORD_SECONDS): data = stream.read(chunk) # check for silence here by comparing the level with 0 (or some threshold) for # the contents of data. # then write data or not to a file 

Debe establecer la variable de umbral y comparar con el valor promedio (la amplitud) u otro parámetro relacionado en los datos cada vez que se lea en el bucle.

Podría tener dos bucles nesteds, el primero para activar la grabación y el otro para guardar continuamente los datos de sonido después de eso.