в общем, написал решение, кому пригодится.
def start(self):
print('------- Recording... -------')
while self.recordFlag:
data = self.stream.read(self.CHUNK)
self.frames.append(data)
self.frame = np.array([data])
print('------- Finished recording. -------')
def stop_and_save(self):
print('Do you want to stop recording? (y/n)', end=' ')
ans = input()
if ans == 'y':
self.recordFlag = False
self.stream.stop_stream()
self.stream.close()
self.p.terminate()
wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(self.CHANNELS)
wf.setsampwidth(self.p.get_sample_size(self.FORMAT))
wf.setframerate(self.RATE)
wf.writeframes(b''.join(self.frames))
wf.close()
audioStartThread = threading.Thread(target=ac.start)
audioStopThread = threading.Thread(target=ac.stop_and_save)
audioStartThread.start()
audioStopThread.start()
Вообще, по уму, можно было бы реализовать это не через потоки, а через ассинхронность.