输入溢出

3

我有一个输入溢出的问题,但我不知道如何处理它。下面是我的代码和解释:

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

基本上,我的操作是使用已训练的tensorflow模型对实时生成的音频特征进行预测。
首先我打开一个流。然后我使用for循环在该流中读取音频数据。当采样率为48000且块大小为192时,每秒恰好250次发生此情况。 因此,每秒钟我会读入下一个块,使用numpy.frombuffer解码它,然后计算特征。特征存储在数组frames中。每次frames数组的长度都为299,我将使用此数组进行预测。
这里的问题是:
由于for循环每秒迭代250次,每次迭代有0.004秒的时间来完成,否则,流的输入将溢出(data = stream.read(CHUNK))。当我只在每个迭代中计算特征时,这比0.004秒更快,并且输入不会溢出。由于模型预测需要超过0.004秒,因此输入会溢出。
我该怎么做才能使我的模型预测在每299个迭代步骤中完成,而不让下一个for循环迭代等待呢?
1个回答

5
避免stream.read(CHUNK)引发溢出错误的一种方法是向其传递exception_on_overflow = False,如下所示:
data = stream.read(CHUNK,exception_on_overflow = False
exception_on_overflow = False不能阻止IOError但允许程序忽略它。这应该允许程序继续工作,并将数据保存到mfcc_feat中,即使您的模型花费时间过长。
来源 PyAudio文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接