es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

  1. Desde data = stream.read(chunk), obtengo OSError: [Errno -9988] Stream cerrado
  2. Desde sframes.append(data), obtengo AttributeError: 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.

Tags:  ,

Answer

  1. Avatar for 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étodo append() no es compatible con bytes. En lugar de usar append(), puedes usar sframes += data para concatenar los valores de bytes.

    Aquí tienes el código modificado con estas correcciones:

    wf = wave.open("RUTA\\AL\\ARCHIVO", "rb")
    amountFrames = 100 
    sframes = wf.readframes(amountFrames)
    
    currentSoundFrame = 0
    
    chunk = 1024  
    sample_format = pyaudio.paInt16
    channels = 2
    fs = 44100 
    seconds = 3
    
    p = pyaudio.PyAudio()  
    
    
    stream = p.open(format=sample_format,
                    channels=channels,
                    rate=fs,
                    frames_per_buffer=chunk,
                    input=True,input_device_index=0)
    
    # Almacena los datos en bloques 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("¡El sonido se reprodujo!")
                break
        else:
            print('Sonido no reproducido')
        sframes += data
    
    stream.stop_stream()
    stream.close()
    p.terminate()
    

    Con estas modificaciones, el código ahora debería poder detectar si se reprodujo el sonido especificado en la computadora.

Comments are closed.