--- a/snd.py +++ b/snd.py @@ -14,9 +14,9 @@ FORMAT = pyaudio.paInt16 RATE = 44100 if sys.platform.startswith('darwin'): - CHANNELS = 2 + CHANNELS = 2 elif sys.platform.startswith('win32'): - CHANNELS = 1 + CHANNELS = 1 MAX_SILENT = 80 @@ -26,24 +26,27 @@ "print max(L) < THRESHOLD" return max(L) < THRESHOLD + def normalize(L): "Average the volume out" MAXIMUM = 16384 - times = float(MAXIMUM)/max(abs(i) for i in L) + times = float(MAXIMUM) / max(abs(i) for i in L) LRtn = array('h') for i in L: - LRtn.append(int(i*times)) + LRtn.append(int(i * times)) return LRtn + def trim(L): "Trim the blank spots at the start and end" + def _trim(L): snd_started = False LRtn = array('h') for i in L: - if not snd_started and abs(i)>THRESHOLD: + if not snd_started and abs(i) > THRESHOLD: snd_started = True LRtn.append(i) @@ -60,12 +63,14 @@ L.reverse() return L + def add_silence(L, seconds): "Add silence to the start and end of `L` of length `seconds` (float)" - LRtn = array('h', [0 for i in xrange(int(seconds*RATE))]) + LRtn = array('h', [0 for i in xrange(int(seconds * RATE))]) LRtn.extend(L) - LRtn.extend([0 for i in xrange(int(seconds*RATE))]) + LRtn.extend([0 for i in xrange(int(seconds * RATE))]) return LRtn + def record(): """ @@ -79,8 +84,8 @@ """ p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, - input=True, - frames_per_buffer=CHUNK_SIZE) + input=True, + frames_per_buffer=CHUNK_SIZE) num_silent = 0 snd_started = False @@ -88,13 +93,13 @@ LRtn = array('h') while 1: - try: - data = stream.read(CHUNK_SIZE) - except IOError as ex: - if ex[1] != pyaudio.paInputOverflowed: - raise - data = '\x00' * CHUNK_SIZE - L = unpack('<' + ('h'*(len(data)/2)), data) # little endian, signed short + try: + data = stream.read(CHUNK_SIZE) + except IOError as ex: + if ex[1] != pyaudio.paInputOverflowed: + raise + data = '\x00' * CHUNK_SIZE + L = unpack('<' + ('h' * (len(data) / 2)), data) # little endian, signed short L = array('h', L) silent = is_silent(L) @@ -104,11 +109,11 @@ num_silent += 1 #print num_silent elif not silent and not snd_started: - dispatcher.send( signal='SND_STARTED') + dispatcher.send(signal='SND_STARTED') snd_started = True print snd_started if snd_started and not silent: - num_silent = 0 + num_silent = 0 if snd_started: LRtn.extend(L) if snd_started and num_silent > MAX_SILENT: @@ -124,10 +129,11 @@ LRtn = add_silence(LRtn, 0.5) return sample_width, LRtn + def record_to_file(path): "Records from the microphone and outputs the resulting data to `path`" sample_width, data = record() - data = pack('<' + ('h'*len(data)), *data) + data = pack('<' + ('h' * len(data)), *data) wf = wave.open(path, 'wb') wf.setnchannels(CHANNELS) @@ -135,14 +141,12 @@ wf.setframerate(RATE) wf.writeframes(data) wf.close() - print("done - result written to "+path) + print("done - result written to " + path) del data +if __name__ == '__main__': + filename = 'demo.wav' + record_to_file(filename) + print("done - result written to " + filename) - -if __name__ == '__main__': - filename = 'demo.wav' - record_to_file(filename) - print("done - result written to "+filename) -