我正试图使用Python来"麦克风监视器",即通过耳机实时播放麦克风信号,以及来自PC的任何其他输出信号。
我可以通过修改我电脑的播放设置来实现这一点,但我想用Python来实现,这样我就可以为PS4编程一个Raspberry Pi来麦克风监控我的廉价耳机。
使用PyAudio或sounddevice,我几乎可以实现这一点,但有一个小但显著的延迟。因此:
- 有没有办法用Python消除这种延迟,例如通过更直接地访问我电脑的输入
- 否则,为什么Python不可能实现呢
- 我可以以与我的电脑相同的方式将Raspberry Pi配置为麦克风监视器吗
音响设备代码如下所示,供参考:
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))
介于两者之间的计算机总是会有延迟。专业音频设备通常是为最小化延迟而定制的(或者只是模拟的(。为了减少延迟,您需要在将较小的块发送到输出之前一次记录它们,这确实会带来更多的处理开销。由于帧间延迟可能跟不上采样率,因此在某个时刻使用较小的块也可能在信号中引入更多抖动。PortAudio可能可以配置为具有更少的延迟,但您可能也会从操作系统和音频驱动程序中获得大量延迟。这里有一个页面,讨论如何优化操作系统和音频驱动程序,使Raspberry Pi的延迟最小化。PortAudio(大多数python音频库背后的驱动程序(也讨论了基于操作系统的音频驱动程序延迟。
查看sd.Stream
的文档,即使您指定了一个较小的blocksize
,由于实现的原因,它也可能会使延迟变得更糟。
然而,有一种选择是指定一个精确的延迟(如果需要一个特定的延迟(或实现尽最大努力";尽可能快";通过指定latency = "low"
这将尝试考虑您正在使用的特定硬件,并尽可能快地进行。