Create NoiseDetector
This commit is contained in:
@@ -5,6 +5,7 @@ import random
|
|||||||
import Synth
|
import Synth
|
||||||
import time
|
import time
|
||||||
from Error import RuntimeException
|
from Error import RuntimeException
|
||||||
|
from NoiseDetector import waitForSound
|
||||||
|
|
||||||
types = {
|
types = {
|
||||||
int: 'integer',
|
int: 'integer',
|
||||||
@@ -160,6 +161,7 @@ def createEnvironment():
|
|||||||
'transposeTo': transposeTo,
|
'transposeTo': transposeTo,
|
||||||
'sleep': sleep,
|
'sleep': sleep,
|
||||||
'random': rand,
|
'random': rand,
|
||||||
|
'wait': waitForSound,
|
||||||
'exit': exit
|
'exit': exit
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
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