我想播放许多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>