2016-06-09 159 views
0

我有這個程序,監聽麥克風,並試圖認識到什麼是說:PyAudio警告poluting輸出

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

問題是我想要一個腳本來執行上面的代碼並閱讀它的輸出(馬鈴薯),但返回的結果與所有這些錯誤混合在一起。我嘗試了我看到的解決方案here,但它只能抑制alsa警告。可能與alsa/pulseaudio配置混淆會解決這個問題,但我不想在每臺運行代碼的機器上都這麼做。

我也嘗試將stdin/stderr重定向到null,但沒有壓制任何東西。

我有一個解決方法,即腳本運行此程序時,只獲取最後一行,但我只希望它只作爲最後一個資源。

+1

只是爲了指出,這個問題是由於'alsa.conf'文件有糟糕的設置,例如'pcm.rear cards.pcm.rear'。從'/ usr/share/alsa/alsa.conf'中刪除這些應該可以解決這個問題。 – jojek

回答

1

警告/狀態消息轉到標準錯誤輸出(stderr),而print()調用的輸出轉到標準輸出(stdout)。 將兩者分開應該是微不足道的。

如果您想要實際抑制警告/狀態消息,您可以查看您提及的SO問題或從那裏鏈接到的the more verbose answermy answer

+0

我知道stderr沒有與stdout混合,但是當我在外部運行代碼時,錯誤與期望的輸出一起出現,正如我在我的答案中所述。所以是的,除非另有解決方案,否則我需要禁止警告,讓代碼沒有解決方法。我會盡快嘗試你提到的模塊。謝謝! – Jesse

+0

你是如何運行你的腳本的,你是如何試圖抓住'stdout'的? – Matthias

+0

我用命令'shell-command-to-string'在emacs中運行它。現在你提到了,也許這就是問題所在。無論如何,我能夠解決這個問題,並使用emacsclient獲得更好的行爲。謝謝您的幫助。乾杯! – Jesse