输入溢出

Input overflowed

我有输入溢出的问题,我不知道如何处理它。 那么让我给你我的代码并解释一下:

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()

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

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

问题来了:

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

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

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

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

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

来源PyAudio Documentation