def values_bytes(self, data, dtype): minim=9999 maxim=-9999 try: aaa = numpy.fromstring(data, dtype='<i2') except (ValueError): return "ValueError" i=0 for a in aaa: square_a = float(a) * float(a) self.average = math.sqrt(( (self.average * self.average * (self.average_devider - 1.0)) + square_a)/self.average_devider) self.short_average = math.sqrt(( (self.short_average * self.short_average * (self.short_average_devider - 1.0)) + square_a)/self.short_average_devider) if Ear.log and time.time() > self.debug_time + 60.0: #if Hearing.Hearing.log: #if time.time() > self.debug_time + 6.0: print "Ear " + self.name + " time.time() " + time.ctime(time.time()) + ' self.debug_time ' + time.ctime(self.debug_time) print "Ear " + self.name + " average " + str(self.average) + ' short_average ' + str(self.short_average) self.debug_time = time.time() if a > maxim: maxim = a if a < minim: minim = a if self.voice: if self.short_average <= self.sensitivity * self.average: #duration=self.n/self.rate #self.stop_time = self.start_time + duration self.sound.set_duration(self.n/self.rate) self.sound.set_volume_level(math.sqrt(self.square_sum/self.n)/self.average) self.sound.set_state(Sound.STOP) self.queue.put(self.sound) #print self.name + " voice stopped at " + time.ctime() + ' ' + str(self.sum/self.n/self.average) + ' ' + str(self.short_average) + ' ' + str(self.average) self.voice = False else: self.sum += self.short_average self.square_sum += square_a self.n+=1.0 else: if self.short_average > self.sensitivity * self.average: self.start_time = time.time() - (float(len(aaa)-i)/self.rate) # sound's start time is when we got sound data minus slots that are not in the sound self.sound = Sound(id=self.id, state=Sound.START, start_time=self.start_time) self.queue.put(self.sound) #print self.name + " voice started at " + time.ctime() + ' ' + str(self.start_time) + ' ' + str(self.short_average) + ' ' + str(self.average) self.voice = True self.sum=self.short_average self.n=1.0 self.square_sum = square_a i += 1 if self.voice: #duration=self.n/self.rate # self.stop_time = self.start_time + duration self.sound.set_duration(self.n/self.rate) self.sound.set_volume_level(math.sqrt(self.square_sum/self.n)/self.average) self.sound.set_state(Sound.CONTINUE) self.queue.put(self.sound)
class Ear(Thread): log = True def __init__(self, id, name, queue, card='default', channels=1, rate=44100, format=alsaaudio.PCM_FORMAT_S16_LE, average=0.0, sensitivity=2.0): Thread.__init__(self) self.id=id self.name=name self.card=card self.sensitivity=sensitivity self.rate = float(rate) #print 'str(alsaaudio.cards())' + str(alsaaudio.cards()) self.inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card) print name + ' card ' + self.inp.cardname() #self.inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK) # Set attributes: Mono, 44100 Hz, 16 bit little endian samples self.inp.setchannels(channels) self.inp.setrate(rate) self.inp.setformat(format) self.inp.setperiodsize(32) #160 self.queue=queue self.average=average; self.average_devider = float(rate) * 10.0 self.short_average=average; self.short_average_devider = 2000.0 self.voice = False self.start_time=0.0 #self.stop_time=0.0 self.running=False self.on=False self.debug_time=time.time() def stop(self): self.running=False def setOn(self, on): self.on = on def values_bytes(self, data, dtype): minim=9999 maxim=-9999 try: aaa = numpy.fromstring(data, dtype='<i2') except (ValueError): return "ValueError" i=0 for a in aaa: square_a = float(a) * float(a) self.average = math.sqrt(( (self.average * self.average * (self.average_devider - 1.0)) + square_a)/self.average_devider) self.short_average = math.sqrt(( (self.short_average * self.short_average * (self.short_average_devider - 1.0)) + square_a)/self.short_average_devider) if Ear.log and time.time() > self.debug_time + 60.0: #if Hearing.Hearing.log: #if time.time() > self.debug_time + 6.0: print "Ear " + self.name + " time.time() " + time.ctime(time.time()) + ' self.debug_time ' + time.ctime(self.debug_time) print "Ear " + self.name + " average " + str(self.average) + ' short_average ' + str(self.short_average) self.debug_time = time.time() if a > maxim: maxim = a if a < minim: minim = a if self.voice: if self.short_average <= self.sensitivity * self.average: #duration=self.n/self.rate #self.stop_time = self.start_time + duration self.sound.set_duration(self.n/self.rate) self.sound.set_volume_level(math.sqrt(self.square_sum/self.n)/self.average) self.sound.set_state(Sound.STOP) self.queue.put(self.sound) #print self.name + " voice stopped at " + time.ctime() + ' ' + str(self.sum/self.n/self.average) + ' ' + str(self.short_average) + ' ' + str(self.average) self.voice = False else: self.sum += self.short_average self.square_sum += square_a self.n+=1.0 else: if self.short_average > self.sensitivity * self.average: self.start_time = time.time() - (float(len(aaa)-i)/self.rate) # sound's start time is when we got sound data minus slots that are not in the sound self.sound = Sound(id=self.id, state=Sound.START, start_time=self.start_time) self.queue.put(self.sound) #print self.name + " voice started at " + time.ctime() + ' ' + str(self.start_time) + ' ' + str(self.short_average) + ' ' + str(self.average) self.voice = True self.sum=self.short_average self.n=1.0 self.square_sum = square_a i += 1 if self.voice: #duration=self.n/self.rate # self.stop_time = self.start_time + duration self.sound.set_duration(self.n/self.rate) self.sound.set_volume_level(math.sqrt(self.square_sum/self.n)/self.average) self.sound.set_state(Sound.CONTINUE) self.queue.put(self.sound) def run(self): if not self.running: self.running = True self.on=True print "Starting " + self.name len=0 while self.running: # blocking read data from device #print "reading " + self.name l, data = self.inp.read() #print "read " + self.name + " " + str(l) if self.on and self.running and l > 0: len += l self.values_bytes(data, '<i2') print "Exiting " + self.name