2014-01-17 36 views
10

我們正在使用一個非常老的程序來驅動一些設備測試。這些測試可以運行幾天,我想知道測試何時完成。測試完成後,可執行文件會以每秒1次蜂鳴聲的速度持續發出蜂鳴聲,直到操作員干預。如何在內部主板揚聲器上「聽」聲音

有沒有一種方法可以「聆聽」此嗶聲,並在MB開始發出嗶聲時發出通知?我希望有一個sysos庫,我可能會用它來表明這一點。

我們在Windows XP x86上運行。我還沒有在機器上安裝Python。

僞代碼:

already_beeping = True 

while True: 
    speaker_beeping = check_speaker() # returns True or False 
    if speaker_beeping == True: 
    if already_beeping == False: 
     send_notification() 
     already_beeping = True 
    else: 
     pass 
    else: 
    already_beeping = False 
    time.sleep(10) 
+0

你的電腦有麥克風,你可以試圖奴隸? – wnnmaw

+0

聽起來像是一件非常酷酷的事情,我們都樂於夢想解決問題的方法,但必須有更好的方法來做到這一點。沒有退出代碼或您可以監控的進程?即使屏幕抓取也可能更容易。 – NibblyPig

+0

@wnnmaw我不認爲我明白你的意思是用麥克風。如果需要,我可以找到麥克風。 –

回答

2

是連接到母板用2排針揚聲器?

如果是這樣,攔截它並監視信號應該是微不足道的。從示波器開始驗證信號,然後連接某種USB數字I/O監視器 - 您應該能夠計數脈衝並確定頻率。 (有現成的解決方案,或簡單的Arduino程序可以工作)。或者,如果您想進入真正的低級編程,請查看芯片drives the speakers。請特別注意Read Back Status Byte中的「輸出引腳狀態」。

您可能必須編寫一個C擴展名才能訪問這些端口:請參閱here以獲取一些示例C代碼來訪問該芯片。

2

好的,這裏是我使用PyAudio的解決方案,讓我知道你的想法。不幸的是,我目前沒有測試手段。

這是根據PyAudio頁面上的「記錄」示例進行調整的。

import threading 
import PyAudio 
import wave 
import struct 
import numpy as np 
import os 
import datetime 

CHUNK = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 2 
RATE = 44100 
RECORD_SECONDS = 5 

SEARCHTIME = 5 
LOWERBOUND = 0.9 
UPPERBOUND = 1.1 

class RecorderThread(threading.Thread): 
    def __init__(self, name): 
     threading.Thread.__init__(self) 
     self.name = name 
     self.stream = p.open(format=FORMAT, 
          channels=CHANNELS, 
          rate=RATE, 
          input=True, 
          frames_per_buffer=CHUNK) 
     self.start() 

    def run(self): 
     p = pyaudio.PyAudio() 
     print("* recording") 

     frames = [] 

     for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
      data = self.stream.read(CHUNK) 
      frames.append(data) 

     print("* done recording") 

     self.stream.stop_stream() 
     self.stream.close() 
     p.terminate() 

     wf = wave.open(self.name, 'wb') 
     wf.setnchannels(CHANNELS) 
     wf.setsampwidth(p.get_sample_size(FORMAT)) 
     wf.setframerate(RATE) 
     wf.writeframes(b''.join(frames)) 
     wf.close() 

     frate = RATE 
     wav_file = wave.open(self.name,'r') 
     data = wav_file.readframes(wav_file.getnframes()) 
     wav_file.close() 
     os.remove(self.file) 
     data =s truct.unpack('{n}h'.format(n=data_size), data) 
     data = np.array(data) 

     w = np.fft.fft(data) 
     freqs = np.fft.fftfreq(len(w)) 

     idx=np.argmax(np.abs(w)**2) 
     freq=freqs[idx] 
     freq_in_hertz=abs(freq*frate) 

     if freq_in_herts > LOWERBOUND and freq_in_herts < UPPERBOUND: 
      curName = "found0.txt" 

      while os.path.exists(curName): 
       num = int(curName.split('.')[0][6:]) 
       curName = "found{}.txt".format(str(num+1)) 

      f = open(curName, 'r') 
      f.write("Found it at {}".format(datetime.datetime.now())) 
      f.close() 

def main(): 
    recordingThreads = [] 

    totalTime = 0 

    while totalTime < SEARCHTIME*(24*3600) and not os.path.exists("found.txt"): 
     start = datetime.datetime(year=2012, month=2, day=25, hour=9) 

     curName = "record0.wav" 

     while os.path.exists(curName): 
      num = int(curName.split('.')[0][6:]) 
      curName = "record{}.wav".format(str(num+1)) 

     recorder = RecorderThread(curName) 
     time.sleep(4.5) 
     end = datetime.datetime(year=2012, month=2, day=25, hour=18) 
     totalTime += end - start 

if __name__ == "__main__": main() 

好吧,這樣的結果比我預期的要大一點。這將運行由SEARCHTIME指定的天數。每4.5秒鐘,它會記錄5秒(以確保我們不會錯過任何內容)。此錄音將以動態名稱保存(以防止覆蓋)。然後我們對.wav文件執行FFT並查看頻率是否在LOWERBOUNDUPPERBOUND之間。如果頻率在這兩個界限之間,則會創建一個文件,說明何時發生。該代碼繼續進行,直至到達SEARCHTIME至少發現一聲嘟嘟聲。由於有一些重疊,所有的處理都是在線程中完成的。

請注意,這可能會產生誤報,這就是爲什麼它不會在第一次發現後終止。另外,如果它從未發現任何東西,它會繼續運行。永遠。

最後一點:正如我剛纔所說,我還沒有測試過它,所以它可能不會在你的拳頭上運行。我提前道歉,但至少應該給你一個很好的開局。請讓我知道什麼是休息時間,以便我可以在這裏修復它!

參考:

  • 錄製的聲音:從PyAudio頁 「記錄」 例如
  • FFT和查找頻率:This post

好運

0

我不太熟悉在Windows上編程,所以在這個答案中有很多猜測。

推測程序會調用某些Windows API函數來發出揚聲器,這可能是由某個DLL提供的。在POSIX平臺上,我將使用LD_PRELOAD加載一個共享庫,該庫將通過我自己的版本覆蓋該API函數,然後該函數將能夠通知我。在Windows上可能有類似的技術;也許DLL injection幫助。

相關問題