PyAudio работает, но выдает сообщения об ошибках каждый раз

Я использую PyAudio для записи ввода с микрофона.

Поскольку звук у меня нормально записывается, стоит ли мне просто подавлять сообщения об ошибках? Или был бы способ решить их?

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

8 ответов

Решение

Вы можете попытаться очистить конфигурацию ALSA, например,

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

вызваны /usr/share/alsa/alsa.conf:

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

Как только вы закомментируете эти строки, эти сообщения об ошибках исчезнут. Вы также можете проверить ~/.asoundrc а также /etc/asound.conf,

Тем не менее, некоторые из этих сообщений говорят о том, что что-то не так в вашей конфигурации, хотя они не вызывают никаких реальных проблем. Я не рекомендую вам убирать alsa.confПоскольку изначально он был от ALSA, он может быть перезаписан при обновлении alsa-lib.

Есть способ подавить сообщение в Python, вот пример кода:

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

Выход с моего компьютера:

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

Эти сообщения распечатываются alsa-lib, а не PyAudio или PortAudio. Код напрямую использует alsa-lib snd_lib_error_set_handler функция для установки обработчика ошибок py_error_handler, который вы можете использовать для удаления любого сообщения.

Я проверил другие привязки Python ALSA, pyalsa и PyAlsaAudio, они не поддерживают установку обработчика ошибок. Однако есть проблема с PortAudio, все сообщения об ошибках ALSA, казалось, были подавлены прежде.

Все вышеперечисленное является верным и хорошим решением. Я просто пришел сюда, чтобы предложить лучший способ повторно использовать код обработчика ошибок:

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)

После этого вы можете повторно использовать обработчик ошибок, используя noalsaerr контекст:

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

Я столкнулся с той же проблемой.

Просто добавление 2>/dev/nullв конце команда решила проблему для меня. Я просто хотел подавить сообщения об ошибках, и это помогло.

например: python marvin.py 2>/dev/null

Модуль sounddevice будет подавлять эти сообщения, см. https://github.com/spatialaudio/python-sounddevice/issues/11.

Они выглядят как обычные отладочные сообщения, поскольку они выясняют, как их запустить в вашей системе. Я не вижу причин, по которым вы не должны их подавлять.

Возможно, вы можете отключить обнаружение jack серверы, устройства Bluetooth, объемный звук и т. д. как-то, но это не обязательно, и вы можете все испортить. Не связывайтесь с вещами, которые работают!

это подавит сообщения об ошибках при создании объекта pyaudio

это из потрясающего поста Маттеиса

      import time, os, sys, contextlib

@contextlib.contextmanager
def ignoreStderr():
    devnull = os.open(os.devnull, os.O_WRONLY)
    old_stderr = os.dup(2)
    sys.stderr.flush()
    os.dup2(devnull, 2)
    os.close(devnull)
    try:
        yield
    finally:
        os.dup2(old_stderr, 2)
        os.close(old_stderr)

 ...
 ...
 with ignoreStderr():
     self._audio_interface = pyaudio.PyAudio()

Если вашей аудиоподсистемой по умолчанию является Pulseaudio (общая для Fedora, Ubuntu, Debian), то лучше правильно перекомпилировать PyAudio и лежащую в его основе библиотеку C Portaudio с поддержкой Pulseaudio только без Jack и других подсистем.

Небольшие дополнительные моменты:

  1. Убедитесь, что вы скопировали alsa.conf в другое хранилище резервных копий.
  2. Убедитесь, что вы используете Sudo редактор при редактировании alsa.conf (например, sudo vi alsa.conf), чтобы вам не нужно было изменять права доступа к файлу alsa.conf

В моем случае это по-прежнему вызывало следующие ошибки ALSA:

  • ALSA lib pcm_route.c:867:(find_matching_chmap) Не найдено подходящей карты каналов
  • ALSA lib pcm_route.c:867:(find_matching_chmap) Не найдено подходящей карты каналов
  • ALSA lib pcm_route.c:867:(find_matching_chmap) Не найдено подходящей карты каналов
  • ALSA lib pcm_route.c:867:(find_matching_chmap) Не найдено подходящей карты каналов
Другие вопросы по тегам