Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的实时音频处理_Python_Audio_Signal Processing_Pyaudio - Fatal编程技术网

Python中的实时音频处理

Python中的实时音频处理,python,audio,signal-processing,pyaudio,Python,Audio,Signal Processing,Pyaudio,我正在写一个程序来检查电脑记录的音频信号是否有故障。在检测到音频后,我想检查前5秒的数据中是否有小故障(对应于采样率为44.1kHz的220500个样本),接着检查下5秒的数据中是否有小故障,然后检查下5秒等。我有一个while循环,在检测到音频后开始,它开始将音频样本从流中读取到阵列中,直到阵列中有220500个样本,然后进入if语句,开始检查220500个样本中的故障(并随后删除阵列中的所有元素)。我的问题是,当这种情况发生时,计算机仍在录制音频,但它没有从流中读取到阵列中,并且在我退出if

我正在写一个程序来检查电脑记录的音频信号是否有故障。在检测到音频后,我想检查前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...

我想知道,在执行if语句中的故障检测时,是否有任何方法可以让我继续从音频流读取到阵列中?或者如果没有,我还有别的办法吗?

你的答案是多线程不是多处理,通过使用python线程包及其出色的信号功能,你可以实现你想要的

您是否尝试过使用多个流程?您可以生成一个进程来读取音频流,另一个进程来处理它以进行“故障检测”。看一看这个:谢谢,我会看一看的。“计算机仍在录制音频,但没有从流读取到阵列中”为什么不?流缓冲区太小了吗?为了避免创建自己的线程,您应该考虑使用“回调”函数(而不是<代码>流>读()/代码>。在这个回调函数中(一旦流启动,它将在一个单独的线程上运行),您可以将传入的音频数据写入一个队列(例如),这样您就可以轻松地读取程序的主线程。为了避免手动类型转换,您可以使用直接支持NumPy的库,例如模块(完全公开,我是它的作者)。指向文档的链接将非常有用。这个奇妙而神秘的“信号”特征是什么?你的意思是什么?另一件可能有用的事情是。
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)