it-swarm.com.de

PyAudio funktioniert, spuckt jedoch jedes Mal Fehlermeldungen aus

Ich verwende PyAudio, um Eingaben vom Mikrofon aufzunehmen.

Kann ich die Fehlermeldungen einfach unterdrücken, da das Audio für mich gut aufgenommen wird? Oder würde es einen Weg geben, sie zu lösen?

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

Sie können versuchen, Ihre ALSA-Konfiguration zu bereinigen, z. B.

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

werden durch /usr/share/alsa/alsa.conf verursacht:

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

Wenn Sie diese Zeilen auskommentieren, wird diese Fehlermeldung nicht mehr angezeigt. Sie können auch ~/.asoundrc und /etc/asound.conf überprüfen.

Das heißt, einige dieser Meldungen sagen, dass in Ihrer Konfiguration etwas nicht stimmt, obwohl sie kein wirkliches Problem verursachen. Ich empfehle Ihnen nicht, den alsa.conf zu bereinigen, da er ursprünglich von ALSA stammt. Er kann beim Update von alsa-lib überschrieben werden.

Es gibt eine Möglichkeit, die Nachricht in Python zu unterdrücken. Hier ein Beispielcode:

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

Eine Ausgabe von meinem Computer:

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

Diese Nachrichten werden von alsa-lib und nicht von PyAudio oder PortAudio ausgedruckt. Der Code verwendet die Funktion alsa-lib snd_lib_error_set_handler direkt zum Festlegen eines Fehlerbehandlers py_error_handler, mit dem Sie eine beliebige Nachricht löschen können.

Ich habe andere Python-ALSA-Bindungen, Pyalsa und PyAlsaAudio überprüft. Sie unterstützen das Festlegen von Fehlerbehandlungsroutinen nicht. Es gibt jedoch ein Problem in PortAudio, alle ALSA-Fehlermeldungen schienen zuvor unterdrückt worden zu sein.

22
livibetter

All dies ist wahr und eine gute Lösung. Ich bin gerade hergekommen, um eine schönere Methode zur Wiederverwendung des Fehlerbehandlungscodes vorzuschlagen:

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)

Danach können Sie den Fehlerhandler mit dem Kontext noalsaerr wiederverwenden:

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

Diese sehen wie normale Debugmeldungen aus, da sie herausfinden, wie sie auf Ihrem System ausgeführt werden. Ich sehe keinen Grund, warum Sie sie nicht unterdrücken sollten. 

Sie können wahrscheinlich die Erkennung von jack Servern, Bluetooth-Geräten, Surround-Sound usw. ausschalten, aber es ist nicht notwendig und Sie könnten Probleme damit haben. Leg dich nicht mit Dingen an, die funktionieren!

3
agf

Kleine zusätzliche Punkte:

  1. Stellen Sie sicher, dass Sie alsa.conf an einen anderen Speicherort kopieren.
  2. Stellen Sie sicher, dass Sie den Editor während der Bearbeitung von alsa.conf auf Sudo stellen (z. B. Sudo vi alsa.conf), damit Sie die Dateiberechtigungen von alsa.conf nicht ändern müssen

In meinem Fall hat dies immer noch die folgenden ALSA-Fehler verursacht:

  • ALSA lib pcm_route.c: 867: (find_matching_chmap) Es wurde keine passende Kanalkarte gefunden
  • ALSA lib pcm_route.c: 867: (find_matching_chmap) Es wurde keine passende Kanalkarte gefunden
  • ALSA lib pcm_route.c: 867: (find_matching_chmap) Es wurde keine passende Kanalkarte gefunden
  • ALSA lib pcm_route.c: 867: (find_matching_chmap) Es wurde keine passende Kanalkarte gefunden
0
Milind Thombre

Das Modul sounddevice unterdrückt diese Meldungen, siehe https://github.com/spatialaudio/python-sounddevice/issues/11 .

0
Matthias

Wenn Ihr Standard-Audio-Subsystem Pulseaudio ist (üblich für Fedora, Ubuntu, Debian), ist es besser, PyAudio und die zugrunde liegende C-Bibliothek Portaudio mit Pulseaudio-Unterstützung nur ohne Jack und andere Subsysteme richtig zu kompilieren.

0
Nikolay Shmyrev