如何在没有缓冲的情况下播放许多numpy数组

时间:2017-11-21 10:09:43

标签: python python-3.x audio playback

我想玩很多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数组,但想要连续播放。

实际上,我尝试使用麦克风录制声音数十微秒,将其转换为某些应用程序(添加正弦波......),并连续播放转换后的数据。

如何摆脱缓冲?

1 个答案:

答案 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参数,因为如果你在回调中做了太多工作(或者如果块大小太小),这会通知你是否有任何缓冲区超过 - /不足正在发生。