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
5 ответов
вы можете попытаться очистить конфигурацию 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)
...
они выглядят как обычные отладочные сообщения, поскольку он выясняет, как работать в вашей системе. Я не вижу причин, почему бы вам не подавить их.
вы, вероятно, можете отключить обнаружение jack
серверы, устройства Bluetooth, объемный звук и т. д. как-то, но это не обязательно и вы можете все испортить. Не связывайтесь с вещами, которые работают!
на sounddevice модуль подавит эти сообщения, см. https://github.com/spatialaudio/python-sounddevice/issues/11.
Если ваша аудиосистема по умолчанию-Pulseaudio (обычная для Fedora, Ubuntu, Debian), лучше правильно перекомпилировать PyAudio и базовую библиотеку C Portaudio с поддержкой Pulseaudio только без Jack и других подсистем.