我正在编写一个程序来检查计算机录制的音频信号中的毛刺。在检测到音频后,我想检查数据的前5秒内的毛刺(对应于采样率为44.1kHz的220500个样本),继续下一个5秒的数据并检查其中的毛刺,然后接下来的5秒等我有一个while循环,它在检测到音频后开始,它开始从一个流中读取音频样本到一个数组,直到它在数组中有220500个样本,之后它进入if语句开始检查220500样本中的毛刺(并在之后删除阵列中的所有元素)。我的问题是,虽然这种情况正在发生,但计算机仍在录制音频,但是没有从流中读入数据,当我退出if语句并重新启动while循环时,我错过了几秒钟音频数据。
while 1:
# little endian, signed short
snd_data = array('h', stream.read(1500))
if byteorder == 'big':
snd_data.byteswap()
r.extend(snd_data)
if len(r) == 220500 or silent:
r = trim(r)
data = pack('<' + ('h'*len(r)), *r)
data = np.fromstring(data,dtype=np.int16)
glitch detection carried out here...
我正在使用PyAudio录制音频
p=pyaudio.PyAudio() # start the PyAudio class
stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True,input_device_index = 1, output_device_index = 6,frames_per_buffer=1500)
我想知道在if语句中执行毛刺检测时,有什么办法让我继续从音频流读入阵列?或者如果没有,还有其他方法可以解决这个问题吗?
答案 0 :(得分:0)
您的答案多线程 非多处理,使用python 线程包及其出色的信号功能,你可以实现你想要的。