usted podría intentar algo como esto:
basado en this question/answer
# 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
Es probable que quiere jugar con su tamaño y los valores de umbral trozo hasta obtener el comportamiento deseado.
Editar:
Usted puede utilizar el incorporado en audioop paquete para encontrar la raíz cuadrada media (RMS) de una muestra, que generalmente es la forma en que se obtiene 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