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
El módulo de sounddevice suprimirá esos mensajes, consulte https://github.com/spatialaudio/python-sounddevice/issues/11 .
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)
...