Create NoiseDetector

This commit is contained in:
Bartłomiej Pluta
2019-06-30 22:43:15 +02:00
parent d0b3a8b3da
commit 13e977ceea
2 changed files with 60 additions and 0 deletions

58
NoiseDetector.py Normal file
View 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()