我想玩很多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
数组,但想要连续播放。
实际上,我尝试使用麦克风录制声音数十微秒,将其转换为某些应用程序(添加正弦波......),并连续播放转换后的数据。
如何摆脱缓冲?
答案 0 :(得分:0)
如果要连续录制和播放,则应使用回调功能。 看一下example in the documentation,我在这里重复一遍:
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
参数,因为如果你在回调中做了太多工作(或者如果块大小太小),这会通知你是否有任何缓冲区超过 - /不足正在发生。