Python中的时间音频处理

我正在编写一个程序来分析我的电脑记录的音频块。 我希望能够将音频分成大约5秒钟的大块(220500个样本左右),如果没有5秒钟的样本可用,只需要留下任何东西(例如,如果录制32秒,我想将流分成6段,长5秒,最后一段2秒)。 我正在使用Pyaudio录制音频

stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True,
          input_device_index=1, output_device_index=6,frames_per_buffer=1500, stream_callback = callback)

每1500个样本调用一次回调函数。 回调函数检查音频是否存在,如果是,则将1500个样本写入队列。

q = Queue.Queue()
def callback(in_data, frame_count, time_info, status):
    in_data = array('h', in_data)
    if is_silent(in_data) == False:
        in_data = trim(in_data)
        in_data = np.fromstring(in_data, dtype=np.int16)
        q.put(in_data)
    return (in_data, pyaudio.paContinue)

检测到音频后,我的程序进入以下循环:

r = array('h')
while 1:
    if q.empty() == False:
        snd_data = q.get()
        r.extend(snd_data)

    if len(r) > 220500 or q.empty() == True:
        print len(r)
        r = []
        r = array('h')

我希望while循环运行,直到队列为空,并且如果大约5秒的音频数据已被记录并存在于r中,则检查if语句。 如果队列是空的,我想在分析循环结束之前分析r中剩下的内容(在这种情况下,只是打印剩下的任何内容),但是我很难做出一个循环,可以在不结束的情况下做到这一点或无限期地运行。 有没有人有任何想法如何改变代码来实现我的目标?

链接地址: http://www.djcxy.com/p/33829.html

上一篇: Time audio processing in Python

下一篇: How can I perform a realtime FFT on SDL2 audio stream data