2011-08-17 9 views
21

Estoy usando PyAudio para grabar la entrada desde el micrófono.PyAudio funciona, pero escupe mensajes de error cada vez

Como el audio me está grabando bien, ¿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 

Respuesta

18

Usted puede tratar de limpiar su configuración de 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 comentar estas líneas, los mensaje de error habrá desaparecido. También es posible que desee comprobar ~/.asoundrc y /etc/asound.conf.

Dicho eso, 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 manera de suprimir el mensaje en Python, aquí es un ejemplo de código:

#!/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 ordenador:

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 se imprimen por alsa-lib , no PyAudio o PortAudio. El código utiliza directamente la función alsa-lib snd_lib_error_set_handler para establecer un controlador de errores py_error_handler, que puede usar para eliminar cualquier mensaje.

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

+0

Esto no elimina los mensajes de JACK, ¿verdad? – Matthias

3

Se parecen a los mensajes de depuración normal, ya que se da cuenta de 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!

+0

¡Gracias por el consejo! Mi problema es que el script muestra el texto necesario para grabar.Tan pronto como llegue a grabar, ese texto básicamente se saldrá del camino por estos mensajes de depuración. – eoinoc

+0

Si su pregunta es cómo suprimirlos, intente redirigir 'stderr' a un archivo. 'stderr = open (archivo de registro, 'wb')' luego 'sys.stderr = stderr'. Déjame saber si funciona. – agf

+0

Eso parece tener sentido, pero no tiene ningún efecto. ¿Es posible que los mensajes vengan a través de otro flujo de salida, por ejemplo? – eoinoc

13

Todo lo anterior es cierto y una buena solución. Sólo vine aquí para sugerir una manera más agradable de reutilizar el código de tratamiento 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 se puede volver a utilizar el gestor de errores mediante el uso de la noalsaerr contexto:

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

Definitivamente es una solución elegante. – mertyildiran

0

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.

Cuestiones relacionadas