Grabar salida de altavoces con PyAudio

Estoy intentando grabar la salida de los altavoces de mi computadora con PyAudio. Intenté modificar el ejemplo de código que figura en la documentación de PyAudio, pero no funciona. Aquí está mi código:

import pyaudio import wave CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 RECORD_SECONDS = 5 WAVE_OUTPUT_FILENAME = "output.wav" p = pyaudio.PyAudio() SPEAKERS = p.get_default_output_device_info()["hostApi"] #The part I have modified stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK, input_host_api_specific_stream_info=SPEAKERS) #The part I have modified print("* recording") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("* done recording") stream.stop_stream() stream.close() p.terminate() wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() 

¿Podría alguien ayudarme por favor?

En caso de que alguien todavía esté tropezando con esto como yo, encontré una bifurcación de PyAudio para grabar la salida en Windows. https://github.com/intxcc/pyaudio_portaudio

Explicación:

La comstackción oficial de PyAudio no puede grabar la salida. PERO con Windows Vista y superior, se introdujo una nueva API, WASAPI, que incluye la capacidad de abrir un flujo a un dispositivo de salida en modo loopback. En este modo, el flujo se comportará como un flujo de entrada, con la capacidad de grabar el flujo de audio saliente.

Para configurar el modo, uno tiene que establecer un indicador especial (AUDCLNT_STREAMFLAGS_LOOPBACK, https://msdn.microsoft.com/de-de/library/windows/desktop/dd316551(v=vs.85).aspx ). Dado que este indicador no es compatible con la comstackción oficial, uno necesita editar PortAudio así como PyAudio, para agregar soporte de loopback.

Nueva opción: “as_loopback” 🙁 true | false)

No puede grabar desde un flujo de salida como si fuera una entrada. Para grabar, necesita conectar PyAudio a un dispositivo de entrada , como un micrófono. Al menos esa es la forma normal de hacer las cosas.

Intenta conectarte primero a un micrófono y ver si obtienes algo. Si esto funciona, intente hacer algo inusual.

Como una pequeña aceleración en sus iteraciones, en lugar de grabar y mirar el archivo, a menudo es más fácil simplemente imprimir el máximo de algunos fragmentos para asegurarse de que está trayendo datos. Por lo general, solo con ver los números desplazarse y compararlos con el sonido se obtiene una estimación rápida de si las cosas están conectadas correctamente.

 import audioop mx = audioop.max(data, 2) print mx 

El altavoz es un flujo de salida incluso si lo abre como una entrada. El valor de hostApi del altavoz es probablemente 0. Puede verificar ‘maxInputChannels’ y ‘maxOutputChannels’ de todos los dispositivos conectados y el maxInputChannels para el altavoz será 0. No puede escribir en un flujo de entrada y no puede leer de un flujo de salida.

Puedes detectar los dispositivos disponibles con el siguiente código:

 import pyaudio # detect devices: p = pyaudio.PyAudio() host_info = p.get_host_api_info_by_index(0) device_count = host_info.get('deviceCount') devices = [] # iterate between devices: for i in range(0, device_count): device = p.get_device_info_by_host_api_device_index(0, i) devices.append(device['name']) print devices 

Una vez que haya conectado todos los dispositivos conectados, puede verificar el ‘hostApi’ de cada dispositivo. Por ejemplo, si el índice del hablante es 5 que:

 p.get_device_info_by_host_api_device_index(0, 5)['hostApi']