2014-01-17 11 views
10

私たちは非常に古いプログラムを使用して、いくつかの機器テストを実施しています。これらのテストは数日間実行することができ、テストが完了したときを知りたいと思います。テストが完了すると、オペレータの介入まで毎秒〜1回のビープ音でマザーボードのスピーカから連続してビープ音が鳴ります。内部マザーボードのスピーカーでサウンドを "聴く"にはどうすればいいですか

このビープ音を「聴いて」、ビープ音が鳴り始めると通知を送信する方法はありますか?私はこれを示すために使用するかもしれないsysまたはosライブラリがあることを願っています。

私たちはWindows XP x86で動作しています。私はまだPythonをマシンにインストールしていません。

擬似コード:2ピン・ヘッダをマザーボードに接続されたスピーカが

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

ですか?

もしそうなら、それを傍受して信号を監視するのは簡単です。オシロスコープで信号を確認してから、何らかの種類のUSBデジタルI/Oモニタを接続してください。パルスをカウントして周波数を決定できるはずです。 (市販されていないソリューションや、単純なArduinoプログラムが機能する)があります。

実際に低レベルのプログラミングに入りたい場合は、"Programmable Interval Timer"チップにdrives the speakersというクエリを照会してください。具体的には、Read Back Status Byteの "出力ピンの状態"を参照してください。

おそらく、PythonにCの拡張モジュールを書いて、そのポートにアクセスする必要があります。チップにアクセスするためのCコードの例は、hereを参照してください。

2

[OK]をここで私の試みは、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の間にあるかどうかを確認します。頻度がこれらの2つの境界の間にある場合、そのことがいつ起こるかを示すファイルが作成されます。このコードは、SEARCHTIMEに到達するまで続きます。およびビープ音が少なくとも1つ見つかりました。少しのオーバーラップがあるので、すべての処理はスレッドで行われます。

これは偽陽性を生成する可能性があることに注意してください。なぜなら、最初の発見後に終了しない理由です。加えて、それが決して見つからなければ、それは走り続けるでしょう。永遠に。

1つの最後の注意:私が以前に言ったように、私はそれをテストすることができなかったので、あなたの拳を実行することはできません。私は事前にお詫びしますが、少なくともこれはあなたにかなり良いスタートを与えるはずです。何が壊れているのか教えてあげてください!

参考文献:

  • 録音音:PyAudioページから "レコード" の例
  • はFFTと発見頻度:This post

幸運

0

私は慣れていないんですよWindows上でのプログラミングでは、この答えにはたくさんの推測があります。

おそらく、いくつかのDLLによって提供される可能性があるスピーカーを鳴らすために、プログラムはWindows API関数を呼び出します。 POSIXプラットフォームでは、LD_PRELOADを使用して、自分自身のバージョンでそのAPI関数を上書きする共有ライブラリをロードすると、私に通知することができます。 Windows上にはおそらく同様のテクニックがあります。多分DLL injectionが役に立ちます。