[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を実行し、周波数がLOWERBOUND
とUPPERBOUND
の間にあるかどうかを確認します。頻度がこれらの2つの境界の間にある場合、そのことがいつ起こるかを示すファイルが作成されます。このコードは、SEARCHTIME
に到達するまで続きます。およびビープ音が少なくとも1つ見つかりました。少しのオーバーラップがあるので、すべての処理はスレッドで行われます。
これは偽陽性を生成する可能性があることに注意してください。なぜなら、最初の発見後に終了しない理由です。加えて、それが決して見つからなければ、それは走り続けるでしょう。永遠に。
1つの最後の注意:私が以前に言ったように、私はそれをテストすることができなかったので、あなたの拳を実行することはできません。私は事前にお詫びしますが、少なくともこれはあなたにかなり良いスタートを与えるはずです。何が壊れているのか教えてあげてください!
参考文献:
- 録音音:PyAudioページから "レコード" の例
- はFFTと発見頻度:This post
幸運
お使いのコンピュータには、スレーブしようとする可能性のあるマイクがありますか? – wnnmaw
私たちはすべて解決策を夢見ることが大好きな、非常に涼しい奇妙なもののように聞こえますが、それを実行するにはより良い方法が必要です。終了コードやプロセスを監視することはできませんか?おそらくスクリーングラブする方が簡単でしょう。 – NibblyPig
@wnnmaw私はあなたがマイクを奴隷にしていることを理解しているとは思わない。私は必要に応じてマイクを見つけることができた。 –