使用声音设备模块从命令行播放声音样本时,延迟太高

时间:2017-05-23 23:09:49

标签: python audio latency python-sounddevice

我想编写一个程序,允许我用计算机键盘播放样本声音,几乎没有延迟。

我的节目:

import numpy as np
import sounddevice as sd
import soundfile as sf
import msvcrt

sd.default.latency = 'low'

samplesarray = []

def load_samples(num):
    filename='sample'+str(num)+'.wav'
    data, fs = sf.read(filename, dtype='float32')
    sd.default.samplerate = fs
    samplesarray.append(data)
    return

numberofsamples=3

for i in range(numberofsamples):    
    load_samples(i+1)

def play_session():
    while 0==0:
        key = int(msvcrt.getch())
        sd.play(samplesarray[key-1])
    return

play_session()

程序文件夹包含许多名为sample1.wav,sample2.wav等的“一次性”短样本,例如kick-drum或snares。在这个例子中,为简单起见,只加载了三个。 我可以在终端启动我当前的程序,并在我的键上播放'映射'样本,这就是我想要的。 唯一的问题是延迟:虽然不是很大,但它确实很明显。

对于现场播放样本,理想情况下,延迟实际上是不可察觉的(数十毫秒的数量级)。

我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:0)

在其他几个方面,可能的最低延迟取决于您使用的主机API。由于您要导入msvcrt模块,我假设您使用的是Windows,对吧?

在那里,您通常可以在多个主机API之间进行选择。通常可以使用WASAPI,WDM / KS或ASIO达到最低延迟。

如果你使用WASAPI,你可以尝试exclusive mode,这可能会允许更低的延迟,但我不确定。

latency设置为'low'(正如您所做)应该可以解决问题,但您也可以尝试使用blocksize的不同值。但请注意,块尺寸过小会导致缓冲区下溢,从而导致听到咔嗒声。

最后,如果你真的想要从设置中挤出最后一点延迟,你应该摆脱sd.play()(在每次调用时打开一个新的sd.OutputStream)而不是实现你的在你自己的回调函数中回放逻辑。