You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python在搭载M2芯片的macOS上捕获扬声器输出制作实时音频可视化?

实现M2 Mac上的扬声器音频实时可视化(Python方案)

完全可以用Python实现这个需求,针对M2芯片的MacOS系统,需要先解决扬声器音频捕获的核心问题,再结合FFT和可视化工具完成实时效果,以下是具体方案:

一、解决MacOS扬声器音频捕获问题

MacOS默认不支持直接捕获扬声器输出,需要借助虚拟音频驱动:

  • 安装开源虚拟音频驱动(比如BlackHole),安装后在系统「声音」设置中:
    1. 创建「多输出设备」,将内置扬声器和虚拟驱动设备同时添加进去,设置为系统默认输出设备
    2. 将虚拟驱动设备设置为默认输入设备,这样就能捕获到原本要输出到扬声器的音频流

二、推荐的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兼容性:

  1. 手动编译适配M系列的PortAudio,再安装PyAudio
  2. 在代码中指定虚拟驱动设备作为输入设备(通过pyaudio.PyAudio().get_device_info_by_index()找到设备ID)

不过整体来看,用sounddevice的方案更简洁,无需复杂的编译操作。

内容的提问来源于stack exchange,提问作者Nikita Re

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:57:13