如何使用Python在搭载M2芯片的macOS上捕获扬声器输出制作实时音频可视化?
实现M2 Mac上的扬声器音频实时可视化(Python方案)
完全可以用Python实现这个需求,针对M2芯片的MacOS系统,需要先解决扬声器音频捕获的核心问题,再结合FFT和可视化工具完成实时效果,以下是具体方案:
一、解决MacOS扬声器音频捕获问题
MacOS默认不支持直接捕获扬声器输出,需要借助虚拟音频驱动:
- 安装开源虚拟音频驱动(比如BlackHole),安装后在系统「声音」设置中:
- 创建「多输出设备」,将内置扬声器和虚拟驱动设备同时添加进去,设置为系统默认输出设备
- 将虚拟驱动设备设置为默认输入设备,这样就能捕获到原本要输出到扬声器的音频流
二、推荐的Python库组合
你之前用的Realtime_PyAudio_FFT依赖PyAudio,而PyAudio在M系列Mac上常存在兼容性问题(比如编译PortAudio失败、设备识别异常),更推荐以下组合:
sounddevice:替代PyAudio,基于PortAudio,对M系列Mac支持更好,用于音频流捕获numpy:处理音频数据和FFT计算matplotlib:实现实时频谱可视化
安装命令:
pip install sounddevice numpy matplotlib
三、核心代码示例
以下是一个极简的实时音频可视化实现:
import numpy as np import sounddevice as sd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 音频参数 SAMPLERATE = 44100 BLOCKSIZE = 1024 # 初始化绘图 fig, ax = plt.subplots() x = np.linspace(0, SAMPLERATE//2, BLOCKSIZE//2) line, = ax.plot(x, np.zeros(BLOCKSIZE//2)) ax.set_ylim(0, 1) ax.set_xlabel("频率 (Hz)") ax.set_ylabel("振幅") ax.set_title("实时扬声器频谱") def audio_callback(indata, frames, time, status): # 对音频数据做FFT fft_data = np.abs(np.fft.fft(indata[:, 0]))[:BLOCKSIZE//2] # 归一化处理 normalized_data = fft_data / np.max(fft_data) if np.max(fft_data) !=0 else fft_data line.set_ydata(normalized_data) # 启动音频流 stream = sd.InputStream(samplerate=SAMPLERATE, blocksize=BLOCKSIZE, channels=1, callback=audio_callback) # 启动动画更新 ani = FuncAnimation(fig, lambda frame: None, interval=50) with stream: plt.show()
四、针对你尝试过的Realtime_PyAudio_FFT的问题排查
如果想继续用这个项目,需要解决M2 Mac上的PyAudio兼容性:
- 手动编译适配M系列的PortAudio,再安装PyAudio
- 在代码中指定虚拟驱动设备作为输入设备(通过
pyaudio.PyAudio().get_device_info_by_index()找到设备ID)
不过整体来看,用sounddevice的方案更简洁,无需复杂的编译操作。
内容的提问来源于stack exchange,提问作者Nikita Re
相关产品推荐
相关产品推荐

