PyAudio警告污染输出

3

我有一个程序,它监听麦克风并尝试识别所说的话:

#!/usr/bin/env python3

import speech_recognition

recognizer = speech_recognition.Recognizer()

class Recognition:

    def __init__(self):
        self.recognizer = speech_recognition.Recognizer()

    def listen(self):
        with speech_recognition.Microphone() as source:
            self.recognizer.adjust_for_ambient_noise(source)
            self.audio = self.recognizer.listen(source)

    def recognize_sphinx(self):
        decoder = self.recognizer.recognize_sphinx(self.audio, show_all=True)
        for best, i in zip(decoder.nbest(), range(10)):
            return best.hypstr


r = Recognition()
r.listen()
print(r.recognize_sphinx())

虽然代码可以运行,但是它会在输出结果中显示以下警告信息:

ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for 4294967295, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for 4294967295, skipping unlock
potato

问题是我想要一个脚本来执行上面的代码并读取它的输出(potato),但返回的结果混杂着所有这些错误。我尝试了我在这里看到的解决方案,但它只抑制alsa警告。可能会通过操作alsa/pulseaudio配置文件来解决此问题,但我不想在每台运行该代码的机器上都这样做。
我还尝试将stdin/stderr重定向到null,但没有抑制任何内容。
我想到了一个解决方法,即当脚本运行此程序时,只获取最后一行,但我希望这只是最后的手段。

1
只是想指出,这个问题是由于alsa.conf文件中有糟糕的设置,比如pcm.rear cards.pcm.rear。从/usr/share/alsa/alsa.conf中删除这些设置应该可以解决问题。 - undefined
1个回答

2
警告/状态消息会发送到标准错误输出 (stderr),而您的 print() 调用的输出会发送到标准输出 (stdout)。将两者分开应该很简单。
如果您想要实际禁止警告/状态消息,您可以查看我在 SO 问题中提到的 答案,或者我从那里链接到的 更详细的答案

我知道stderr和stdout是分开的,但是当我在外部运行代码时,错误信息会和期望的输出一起出现,就像我在答案中所说的那样。所以,是的,除非有其他解决方案,否则我需要抑制警告,以便代码没有变通方法。我会尽快尝试你提到的模块。谢谢! - undefined
你是如何运行你的脚本的,又是如何尝试获取stdout的? - undefined
我在emacs中使用命令shell-command-to-string来运行它。现在你提到了,也许那就是问题所在。不管怎样,我能够通过使用emacsclient来解决这个问题并获得更好的效果。感谢你的帮助。干杯! - undefined
如果pyaudio使用日志记录消息,那将会很好。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接