Я хотел создать приложение kivy, которое записывает аудио-звук до тех пор, пока кнопка записи не будет нажата в пользовательском интерфейсе kivy. Для этого использовались следующие функции. Функция start record вызывается, когда кнопка нажата, а stop_record - вызывается при отпускании кнопки. В функции начала записи повторное преобразование выполняется до тех пор, пока общая переменная st == 1 не прерывается, когда st становится равным 0. Запись идет с предупреждением в первый раз, когда я нажимаю кнопку. Но после второго нажатия я получаю пустые файлы с ошибками ниже в терминале. Я использую ubuntu 18.
import multiprocessing
import csv
import wave
import pyaudio
st=multiprocessing.Value('i',1)
frames=[]
def start_record(self,st):
"""Records the audio until self.st variable is True and saves to file."""
frames = []
stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels=2, rate=44100, input=True, frames_per_buffer=3024)
while st.value == 1:
data = stream.read(3024)
frames.append(data)
print("* recording")
stream.close()
filename=''.join(random.choice(string.ascii_lowercase) for i in range(12))
filename=filename+'.wav'
loc='./Data/wavs/'+filename
wf = wave.open(loc,'wb')
wf.setnchannels(2)
wf.setsampwidth(pyaudio.PyAudio().get_sample_size(pyaudio.paInt16))
wf.setframerate(44100)
wf.writeframes(b''.join(frames))
wf.close()
with open('./Data/transcripts.csv','a+') as csvfile:
csvwriter=csv.writer(csvfile,delimiter=' ')
csvwriter.writerow([f'{filename}|'+self.ids.txtread.text])
def stop_record(self,st):
with st.get_lock():
st.value=0
def ssrecord(self):
global st
if __name__ == '__main__':
multiprocessing.Process(target=self.start_record,args=[st]).start()
def strecord(self):
global st
if __name__ == '__main__':
multiprocessing.Process(target=self.stop_record,args=[st]).start()