web-dev-qa-db-fra.com

PyAudio fonctionne, mais crache des messages d'erreur à chaque fois

J'utilise PyAudio pour enregistrer les entrées du microphone.

Étant donné que l'enregistrement audio est correct pour moi, devrais-je simplement essayer de supprimer ses messages d'erreur? Ou y aurait-il un moyen de les résoudre?

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
27
eoinoc

Vous pouvez essayer de nettoyer votre configuration ALSA, par exemple,

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

sont causés par /usr/share/alsa/alsa.conf:

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

Une fois que vous commentez ces lignes, ces messages d'erreur disparaîtront. Vous pouvez aussi vouloir vérifier ~/.asoundrc et /etc/asound.conf.

Cela dit, certains messages indiquent que quelque chose ne va pas dans votre configuration, bien qu’ils ne posent aucun problème réel. Je ne vous recommande pas de nettoyer le alsa.conf, car il provient d'ALSA à l'origine, il risque d'être écrasé lorsque vous mettez à jour alsa-lib.

Il existe un moyen de supprimer le message en Python, voici un exemple de code:

#!/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()

Une sortie de mon ordinateur:

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

Ces messages sont imprimés par alsa-lib, et non par PyAudio ou PortAudio. Le code utilise directement la fonction alsa-lib snd_lib_error_set_handler pour définir un gestionnaire d’erreur py_error_handler, que vous pouvez utiliser pour supprimer tout message.

J'ai vérifié d'autres liaisons Python ALSA, pyalsa et PyAlsaAudio, elles ne prennent pas en charge le gestionnaire d'erreurs de paramétrage. Cependant, il y a un problème sur PortAudio, tous les messages d'erreur ALSA semblaient avoir été supprimés auparavant.

22
livibetter

Tout ce qui précède est vrai et constitue une bonne solution. Je suis juste venu ici pour suggérer un moyen plus agréable de réutiliser le code du gestionnaire d'erreurs:

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)

Cela fait, vous pouvez réutiliser le gestionnaire d’erreurs en utilisant le contexte noalsaerr:

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

Ceux-ci ressemblent à des messages de débogage normaux car ils expliquent comment s'exécuter sur votre système. Je ne vois aucune raison pour laquelle vous ne devriez pas les supprimer. 

Vous pouvez probablement désactiver la détection des serveurs jack, des périphériques Bluetooth, du son surround, etc. d'une manière ou d'une autre, mais ce n'est pas nécessaire et vous risquez de tout gâcher. Ne plaisante pas avec les choses qui fonctionnent!

3
agf
0
Matthias

Si votre sous-système audio par défaut est Pulseaudio (commun pour Fedora, Ubuntu, Debian), il est préférable de recompiler correctement PyAudio et la bibliothèque C sous-jacente Portaudio avec le support Pulseaudio uniquement sans Jack et les autres sous-systèmes.

0
Nikolay Shmyrev