【发布时间】:2018-01-17 01:11:43
【问题描述】:
我正在编写一个程序来检查计算机记录的音频信号中的故障。检测到音频后,我想检查前 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 语句中执行故障检测时,有什么方法可以让我继续从音频流读取到数组中?或者如果没有,我还有其他方法可以解决这个问题吗?
【问题讨论】:
-
您是否尝试过使用多个进程?您可以生成一个进程来读取您的音频流,并生成另一个进程来处理它以进行“故障检测”。看看这个:docs.python.org/2/library/multiprocessing.html
-
谢谢,我去看看。
-
"音频仍在由计算机录制,但没有从流中读取到阵列中" 为什么不呢?流缓冲区是否太小?
-
为避免创建自己的线程,您应该考虑使用“回调”函数(而不是
stream.read())。在这个回调函数中(一旦流启动,它将在单独的线程上运行)您可以将传入的音频数据写入队列(例如queue.Queue),然后您可以在程序的主线程中轻松地从中读取。为了避免手动类型转换,您可以使用直接支持 NumPy 的库,例如sounddevice 模块(完全公开,我是它的作者)。
标签: python audio signal-processing pyaudio