我正在编写一个程序来检查计算机录制的音频信号中是否存在故障。检测到音频后,我想检查前 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 语句中执行毛刺检测的同时,有什么方法可以让我继续从音频流读取到数组中吗?或者,如果没有,我还有其他方法可以解决这个问题吗?
最佳答案
你的答案是多线程 不是多处理,通过使用python threading package及其出色的signal特性,你可以实现你想要的。
关于python - Python中的实时音频处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585705/