python alsa pyaudio

python - PyAudio funciona, pero escupe mensajes de error cada vez



alsa (5)

Estoy usando PyAudio para grabar la entrada desde el micrófono.

Como el audio está grabando bien para mí, ¿debería intentar simplemente suprimir sus mensajes de error? ¿O habría una forma de resolverlos?

ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5) ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5) ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5) ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5) ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave Cannot connect to server socket err = No such file or directory Cannot connect to server socket jack server is not running or cannot be started



Esos parecen mensajes normales de depuración a medida que descubre cómo ejecutar en su sistema. No veo ninguna razón por la que no deberías suprimirlos.

Probablemente pueda desactivar la detección de servidores jack , dispositivos bluetooth, sonido envolvente, etc. de alguna manera, pero no es necesario y puede arruinar las cosas. ¡No te metas con cosas que están funcionando!


Puede intentar limpiar su configuración ALSA, por ejemplo,

ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side

son causados ​​por /usr/share/alsa/alsa.conf :

pcm.rear cards.pcm.rear pcm.center_lfe cards.pcm.center_lfe pcm.side cards.pcm.side

Una vez que comente estas líneas, esos mensajes de error desaparecerán. También es posible que desee comprobar ~/.asoundrc y /etc/asound.conf .

Dicho esto, algunos de esos mensajes dicen que algo está mal en su configuración, aunque no causan ningún problema real. No recomiendo que limpie el alsa.conf , porque originalmente es de ALSA, puede sobrescribirse cuando actualiza alsa-lib.

Hay una forma de suprimir el mensaje en Python, aquí hay un código de muestra:

#!/usr/bin/env python from ctypes import * import pyaudio # From alsa-lib Git 3fd4ab9be0db7c7430ebd258f2717a976381715d # $ grep -rn snd_lib_error_handler_t # include/error.h:59:typedef void (*snd_lib_error_handler_t)(const char *file, int line, const char *function, int err, const char *fmt, ...) /* __attribute__ ((format (printf, 5, 6))) */; # Define our error handler type ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p) def py_error_handler(filename, line, function, err, fmt): print ''messages are yummy'' c_error_handler = ERROR_HANDLER_FUNC(py_error_handler) asound = cdll.LoadLibrary(''libasound.so'') # Set error handler asound.snd_lib_error_set_handler(c_error_handler) # Initialize PyAudio p = pyaudio.PyAudio() p.terminate() print ''-''*40 # Reset to default error handler asound.snd_lib_error_set_handler(None) # Re-initialize p = pyaudio.PyAudio() p.terminate()

Una salida de mi computadora:

messages are yummy messages are yummy messages are yummy messages are yummy messages are yummy messages are yummy ---------------------------------------- ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave

Esos mensajes están impresos por alsa-lib, no por PyAudio o PortAudio. El código utiliza directamente la función alsa-lib snd_lib_error_set_handler para establecer un manejador de errores py_error_handler , que puede usar para eliminar cualquier mensaje.

He comprobado otros enlaces ALSA de Python, pyalsa y PyAlsa Audio, no son compatibles con el controlador de errores de configuración. Sin embargo, hay un problema en PortAudio, todos los mensajes de error ALSA parecían suprimirse antes.


Si su subsistema de audio predeterminado es Pulseaudio (común para Fedora, Ubuntu, Debian), es mejor recompilar correctamente PyAudio y la biblioteca de C subyacente Portaudio con soporte de Pulseaudio solo sin Jack y otros subsistemas.


Todo lo anterior es cierto y una buena solución. Acabo de venir para sugerir una forma más agradable de volver a utilizar el código del controlador de errores:

from ctypes import * from contextlib import contextmanager import pyaudio ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p) def py_error_handler(filename, line, function, err, fmt): pass c_error_handler = ERROR_HANDLER_FUNC(py_error_handler) @contextmanager def noalsaerr(): asound = cdll.LoadLibrary(''libasound.so'') asound.snd_lib_error_set_handler(c_error_handler) yield asound.snd_lib_error_set_handler(None)

Después de hacer esto, puede volver a utilizar el controlador de errores utilizando el contexto noalsaerr :

with noalsaerr(): p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=1) ...