我正在使用 PyAudio 并使用 PyAudio 网站上的示例:
import time
import pyaudio
WIDTH = 2
CHANNELS = 1
RATE = 16000
p = pyaudio.PyAudio()
def callback(in_data, frame_count, time_info, status):
return (in_data, pyaudio.paContinue)
stream = p.open(format=p.get_format_from_width(WIDTH),
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=512,
stream_callback=callback
)
stream.start_stream()
while stream.is_active():
time.sleep(5)
stream.stop_stream()
stream.close()
p.terminate()
有谁知道这些山峰从哪里来?
Windows、Linux 或 Mac 等主要操作系统都是非实时的。这意味着操作系统可以优先考虑其他应用程序的 CPU 时间而不是音频采样程序。这会让您的程序等待 CPU 选择其程序,从声卡获取样本。
我考虑过三种方法来解决这个问题。
系统中最大的瓶颈之一是您的云端硬盘活动。这通常是由 Windows 更新、病毒扫描程序/实时防护、Windows 遥测和 Windows 索引服务 (Superfetch) 引起的。将您的 Internet 连接设置为按流量计费,这样 Windows Update 就不会自动更新。确保在防病毒/反恶意软件程序上禁用实时扫描,并在设置中禁用 Windows Defender。 Windows 有一个名为 Windows Telemetry 的“Corprate-Ware”服务,它与 Microsoft 共享您的使用信息,您可以继续在服务中禁用它。现在您并不是真的想禁用 Windows 索引服务,但如果您的计算机比典型的 5200rpm HDD 慢,我建议您在完全相同的服务窗口中禁用它。
有些声卡中有硬件缓冲区,有些则没有,这取决于情况。如果您知道您的系统有硬件缓冲区,它将大大减少所经历的丢失样本的数量。如果您要使用声卡硬件缓冲区,您将必须自己研究它。
最后,只需切换到延迟较低的操作系统,例如Linux。它不像 Windows 那样在后台计算那么多垃圾。尝试使用 python 的 Lubuntu 和 ALSA 音频驱动程序。它应该超出您的需要。
根据以下文档,PyAudio 提供了 PortAudio 的绑定并支持多个操作系统。但是,在 Windows 上,它仅支持 Windows MME API、DirectSound、WASAPI 和 WDM-KS。它不包括对 ASIO 的支持。
https://pypi.org/project/PyAudio/
如果您想要支持低延迟的 ASIO 支持,您需要在启用 ASIO 的情况下编译 PortAudio。具体操作方法如下:https://www.portaudio.com/docs/v19-doxydocs/compile_windows_asio_msvc.html