Tener dificultades para detectar cuándo se reproduce un audio específico desde la salida del escritorio.
Actualmente estoy escribiendo un software para detectar si se reprodujo cierto sonido en una computadora. Si es Verdadero, cambiaría una configuración en un determinado software. Hasta ahora tengo esto:
wf = wave.open("RUTA\AL\ARCHIVO", "rb")
cantidadFrames = 100
sframes = wf.readframes(cantidadFrames)
currentSoundFrame = 0
chunk = 1024
sample_format = pyaudio.paInt16
channels = 2
fs = 44100
seconds = 3
self.p = pyaudio.PyAudio()
stream = self.p.open(format=sample_format,
channels=channels,
rate=fs,
frames_per_buffer=chunk,
input=True,input_device_index=0)
while True:
# Almacenar datos en trozos durante 3 segundos
for i in range(0, int(fs / chunk * seconds)):
data = stream.read(chunk)
if data == sframes[currentSoundFrame]:
currentSoundFrame += 1
if currentSoundFrame == len(sframes):
print("¡Se reprodujo el sonido!")
break
else:
print('No se reprodujo el sonido')
sframes.append(data)
stream.stop_stream()
stream.close()
self.p.terminate()
Cuando ejecuto el código, obtengo dos errores separados:
- Desde
data = stream.read(chunk)
, obtengoOSError: [Errno -9988] Stream cerrado
- Desde
sframes.append(data)
, obtengoAttributeError: El objeto 'bytes' no tiene el atributo 'append'
Con estos errores no he podido probar si realmente detecta o no. Me encantaría contar con tu experiencia en esto.
davy.ai
A partir del primer mensaje de error, parece que el problema se debe a que el flujo se cierra antes de que se haya completado la ejecución del bucle. Para solucionarlo, puedes mover la parada y terminación del flujo fuera del bucle.
En cuanto al segundo mensaje de error, se debe a que
sframes
es un objeto de bytes y el métodoappend()
no es compatible con bytes. En lugar de usarappend()
, puedes usarsframes += data
para concatenar los valores de bytes.Aquí tienes el código modificado con estas correcciones:
Con estas modificaciones, el código ahora debería poder detectar si se reprodujo el sonido especificado en la computadora.