59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
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()
|
|
|