Create NoiseDetector
This commit is contained in:
58
NoiseDetector.py
Normal file
58
NoiseDetector.py
Normal file
@@ -0,0 +1,58 @@
|
||||
import numpy as np
|
||||
import sounddevice as sd
|
||||
import os
|
||||
from collections import deque
|
||||
from statistics import mean
|
||||
|
||||
class NoiseDetector:
|
||||
def __init__(self, noiseTreshold=300, silenceTreshold=10, bufferSize=20):
|
||||
self.reachedNoise = False
|
||||
self.reachedSilence = False
|
||||
self.noiseTreshold = noiseTreshold
|
||||
self.silenceTreshold = silenceTreshold
|
||||
self.buffer = deque([])
|
||||
self.bufferSize = bufferSize
|
||||
self.mean = 0
|
||||
|
||||
def callback(self, indata, outdata, frames, time):
|
||||
volumeNorm = int(np.linalg.norm(indata)*10)
|
||||
|
||||
if len(self.buffer) < self.bufferSize:
|
||||
self.buffer.append(volumeNorm)
|
||||
|
||||
if len(self.buffer) == self.bufferSize:
|
||||
self.buffer.rotate(1)
|
||||
self.buffer.popleft()
|
||||
self.buffer.appendleft(volumeNorm)
|
||||
self.mean = mean(self.buffer)
|
||||
|
||||
if self.mean > self.noiseTreshold:
|
||||
self.reachedNoise = True
|
||||
if self.reachedNoise and self.mean < self.silenceTreshold:
|
||||
self.reachedSilence = True
|
||||
|
||||
def waitForComplete(self):
|
||||
with sd.InputStream(callback=self.callback):
|
||||
while not self.reachedSilence:
|
||||
sd.sleep(10)
|
||||
|
||||
def test(self):
|
||||
with sd.InputStream(callback=self.callback):
|
||||
while True:
|
||||
print(f"Mic level: {self.mean}", end="\r")
|
||||
sd.sleep(200)
|
||||
|
||||
|
||||
def waitForSound(args, env):
|
||||
noiseTreshold = 300
|
||||
silenceTreshold = 10
|
||||
if len(args) == 2 and all(isinstance(arg, int) for arg in args):
|
||||
noiseTreshold = args[0]
|
||||
silenceTreshold = args[1]
|
||||
elif len(args) == 1 and isinstance(args[0], int):
|
||||
noiseTreshold = args[0]
|
||||
elif len(args) > 2:
|
||||
return # not valid signature
|
||||
detector = NoiseDetector(noiseTreshold, silenceTreshold, 20)
|
||||
detector.waitForComplete()
|
||||
|
||||
Reference in New Issue
Block a user