【问题标题】:Real time audio processing in PythonPython中的实时音频处理
【发布时间】: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


【解决方案1】:

你的答案是多线程 不是多处理,通过使用python 线程包及其美妙的信号功能,你可以达到你想要的。

【讨论】:

  • 文档链接会有所帮助。这个奇妙而神秘的“信号”特征是什么?你的意思是threading.Event吗?另一件可能有帮助的事情是queue.Queue
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2015-12-09
  • 2015-07-18
  • 2017-08-02
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多