输入溢出

Sam*_*sel 3 python pyaudio

我遇到输入溢出的问题,我不知道如何管理它。所以让我给你我的代码并解释一下:

p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=1, rate=SAMPLERATE, input_device_index=chosen_device_index, input=True, frames_per_buffer=CHUNK)
frames = []

for i in range(0, int(SAMPLERATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    decoded = np.frombuffer(data, 'int16')
    mfcc_feat = mfcc(decoded, samplerate=SAMPLERATE/3, winlen=WINDOW_SIZE, winstep=WINDOW_STEP, nfft=NFFT)    
    if len(frames) < 299:
        frames.append(mfcc_feat)        
    elif len(frames) >= 299:
        predict_test = tf.convert_to_tensor(frames)
        result = model.predict(predict_test)
        frames = []
        frames.append(mfcc_feat)

stream.stop_stream()
stream.close()
p.terminate()
Run Code Online (Sandbox Code Playgroud)

所以基本上我在这里所做的就是使用经过训练的张量流模型来预测实时生成的音频特征。

首先我打开一个流。然后我使用 for 循环读取该流中的音频数据。当我将采样率设置为 48000 并将块大小设置为 192 每秒 250 次时,就会发生这种情况。因此,我每秒读取下一个块 250 次,使用它进行解码numpy.frombuffer,然后计算特征。特征存储在数组中frames。每次,frames数组的长度为299,我将使用该数组通过我的张量流模型进行预测。

还有一个问题:

由于for循环每秒迭代 250 次,因此每次迭代都有0.004几秒钟的时间完成,否则流的输入将溢出 ( data = stream.read(CHUNK))。当我只计算每次迭代中的特征时,完成速度快于 0.004 秒,并且输入不会溢出。由于模型预测时间超过 0.004 秒,因此输入溢出。

我该怎么做才能让模型的预测每 299 次迭代步骤完成一次,而不让下一个 for 循环迭代等待?

小智 5

防止抛出溢出错误的一种方法stream.read(CHUNK)是传递给它exception_on_overflow = False。这样:

data = stream.read(CHUNK,exception_on_overflow = False)

exception_on_overflow = False不会停止 IOError 但允许程序忽略它。mfcc_feat即使您的模型花费太长时间,这也应该允许程序继续保存数据。

来源PyAudio 文档