python - 使用 sounddevice 模块从命令行播放声音样本时延迟太高

标签 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 等的“one shot”短样本,例如底鼓或军鼓。在此示例中,为简单起见,仅加载了三个。
我可以在终端中启动我当前的程序,并在我的按键上播放“映射”的样本,这正是我想要的。
唯一的问题是延迟:虽然不是很大,但绝对很明显。

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

我怎么能做到这一点?

最佳答案

除其他事项外,可能的最低延迟取决于您使用的主机 API。由于您正在导入 msvcrt模块,我假设您使用的是 Windows,对吗?

您通常可以在其中选择多个主机 API。使用 WASAPI、WDM/KS 或 ASIO 通常可以达到最低延迟。

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

设置latency'low' (正如您所做的那样)应该可以解决问题,但您也可以尝试对 blocksize 使用不同的值.但请注意,太小的 block 大小会导致缓冲区下溢,这可能会导致听到咔嗒声。

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

关于python - 使用 sounddevice 模块从命令行播放声音样本时延迟太高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146445/

相关文章:

c# - C#-如何删除两个计时器之间的间隔

iphone - 声音操作反向/在iPhone上向后播放录制的声音

actionscript-3 - 使用 as3wavsound 播放声音时的延迟

core-audio - Core Audio 中的亚毫秒级延迟

c - 为什么程序在给定展开因子 k>C*L 的情况下达到吞吐量界限?

multithreading - 具有定期唤醒功能的事件监听器的高效 C++11 设计?

python - 如何比较 Pandas 中的列并使用是或否创建新列

python - 如何提取包含文本的 pandas 系列的每一行中的特定数字

不同线程和 GIL 上的 Python 回调

python - 重新排列 Python 列表