web-dev-qa-db-ja.com

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

たとえば、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

これらのメッセージは、PyAudioやPortAudioではなく、alsa-libによって出力されます。このコードは、alsa-lib snd_lib_error_set_handler関数を直接使用してエラーハンドラーpy_error_handlerを設定します。これを使用してメッセージをドロップできます。

他のPython= ALSAバインディング、pyalsaおよびPyAlsaAudioをチェックしましたが、エラーハンドラーの設定はサポートしていません。しかし、PortAudioには 問題 があり、すべてのALSAエラーメッセージが前に抑制されます。

25
livibetter

上記はすべて真実であり、良い解決策です。エラーハンドラコードを再利用するより良い方法を提案するためにここに来ました。

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)
...
13
Nils Werner

システムで実行する方法がわかるため、これらは通常のデバッグメッセージのように見えます。私はあなたがそれらを抑制するべきではない理由が表示されません。

おそらくjackサーバー、Bluetoothデバイス、サラウンドサウンドなどの検出を無効にすることができますが、それは必要ではなく、問題を引き起こす可能性があります。動作しているものを混乱させないでください!

3
agf

小さな追加ポイント:

  1. Alsa.confを別のバックアップ場所にコピーしてください。
  2. Alsa.confのファイル権限を変更する必要がないように、alsa.confの編集中にエディターをSudoすることを確認してください(例:Sudo vi 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)一致するチャネルマップが見つかりません
0
Milind Thombre

sounddevice モジュールはこれらのメッセージを抑制します。 https://github.com/spatialaudio/python-sounddevice/issues/11 を参照してください。

0
Matthias

デフォルトのオーディオサブシステムがPulseaudio(Fedora、Ubuntu、Debianに共通)である場合、PyAudioおよび基盤となるCライブラリPortaudioを、ジャックおよび他のサブシステムなしでのみPulseaudioをサポートして適切に再コンパイルすることをお勧めします。

0
Nikolay Shmyrev