如何在不缓冲的情况下播放许多Numpy阵列



我想播放许多numpy数组,但是有一些缓冲。例如,

import numpy as np
import sounddevice as sd
fs=44100
data = 0.5*np.random.uniform(-1,1,fs)
for i in range(5):
    sd.play(data, 44100)

在这种情况下,我只使用了一个numpy数组,但想连续播放。

实际上,我尝试使用麦克风录制数十秒钟的声音,使用某些应用(添加正弦波...)进行转换,然后连续播放转换的数据。

我如何摆脱缓冲?

如果要连续录制并播放,则应使用回调函数。看看文档中的示例,我在这里重复:

import sounddevice as sd
duration = 5.5  # seconds
def callback(indata, outdata, frames, time, status):
    if status:
        print(status)
    outdata[:] = indata
with sd.Stream(channels=2, callback=callback):
    sd.sleep(int(duration * 1000))

此示例只需将输入缓冲区复制到输出缓冲区,但是您当然可以任意操纵信号,然后再将其分配给输出。

如果您的任何处理都依赖于固定的块大小,则应在sd.Stream()构造函数中明确设置一个块大小,例如blocksize=1024

并且不要忘记始终检查status参数,因为如果您在回调中执行太多工作(或者块大小太小),请告知您是否发生过任何缓冲区/底层。/p>

最新更新