Python PyAudio正在工作,但每次都会吐出错误消息

Python PyAudio正在工作,但每次都会吐出错误消息,python,alsa,pyaudio,Python,Alsa,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_noupda

我正在使用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

这些看起来像正常的调试消息,因为它知道如何在您的系统上运行。我看不出你有什么理由不压制他们


您可能可以关闭
插孔
服务器、蓝牙设备、环绕声等的检测功能,但这不是必须的,您可能会把事情搞砸。不要弄乱正在工作的东西

您可以尝试清理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库时可能会被覆盖

在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\u lib\u error\u set\u handler
函数来设置错误处理程序
py\u error\u 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)
...

该模块将抑制这些消息,请参阅。

如果默认的音频子系统是Pulseaudio(Fedora、Ubuntu、Debian通用),则最好在不支持Jack和其他子系统的情况下,使用Pulseaudio正确地重新编译PyAudio和底层C库Portaudio。

附加要点:

  • 确保将alsa.conf复制到另一个备份位置
  • 确保在编辑alsa.conf(例如Sudo vi alsa.conf)时使用编辑器,这样就不需要更改alsa.conf的文件权限
  • 在我的情况下,这仍然抛出以下ALSA错误:

    • ALSA lib pcm_路由。c:867:(查找匹配的通道映射)未找到匹配的通道映射
    • ALSA lib pcm_路由。c:867:(查找匹配的通道映射)未找到匹配的通道映射
    • ALSA lib pcm_路由。c:867:(查找匹配的通道映射)未找到匹配的通道映射
    • ALSA lib pcm_路由。c:867:(查找匹配的通道映射)未找到匹配的通道映射

    谢谢你的建议!我的问题是,脚本显示需要录制的文本。一旦您点击记录,这些调试消息基本上会将文本打断。如果您的问题是如何抑制它们,请尝试将
    stderr
    重定向到一个文件
    stderr=open(日志文件'wb')
    然后
    sys.stderr=stderr
    。让我知道它是否有效。这似乎有道理,但没有效果。例如,这些消息是否可能来自另一个输出流?我在这里给出了一个更详细的回答:这并不能消除来自JACK的消息,对吗?我想知道那些要注释掉的行实际上意味着什么,以便了解它们的删除是否会产生其他效果这绝对是一个优雅的解决方案。