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

如何修改PyAudio立体声可视化代码实现系统输出声音可视化

系统输出音频立体声可视化实现方案

你的现有代码默认读取麦克风输入,要捕获系统正在播放的音频做可视化,核心是选中系统的音频回环捕获设备作为输入源,同时修正原代码的参数错误。

原代码存在的问题

  • 通道参数配置错误:设置channels=1单声道,却按立体声规则拆分左右声道数据
  • 未指定正确的输入设备:仅配置了输出设备索引,输入源默认走麦克风,无法捕获系统播放的声音
  • 使用了numpy已弃用的np.fromstring接口,新版本运行会触发警告

第一步:查找系统回环音频设备

系统播放的音频无法直接从普通麦克风接口读取,需要先找到系统提供的回环录音设备(Windows下一般叫「立体声混音/Stereo Mix」,部分声卡叫「What U Hear」;macOS需提前安装BlackHole等虚拟音频驱动创建回环通道;Linux下为对应输出设备的monitor源)。
运行以下代码枚举所有音频设备,记录回环设备对应的索引:

import pyaudio

p = pyaudio.PyAudio()
for idx in range(p.get_device_count()):
    dev = p.get_device_info_by_index(idx)
    print(f"索引 {idx}: 设备名 {dev['name']} | 最大输入通道数 {dev['maxInputChannels']}")
p.terminate()

注意:如果Windows下找不到立体声混音,打开系统声音设置的「录制」面板,右键空白区域勾选「显示禁用的设备」,启用立体声混音后再重新枚举即可。

第二步:修正后的可视化代码

把代码里的LOOPBACK_DEVICE_INDEX替换为你刚才查到的回环设备索引,直接运行即可捕获系统输出的立体声音频做峰值可视化:

import pyaudio
import numpy as np

maxValue = 2**16
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
# 替换为你查到的回环设备索引
LOOPBACK_DEVICE_INDEX = 你的回环设备索引

p = pyaudio.PyAudio()
stream = p.open(
    format=FORMAT,
    channels=CHANNELS,
    rate=RATE,
    input=True,
    frames_per_buffer=CHUNK,
    input_device_index=LOOPBACK_DEVICE_INDEX
)

while True:
    # 加exception_on_overflow=False避免偶发的缓冲区溢出报错
    data = np.frombuffer(stream.read(CHUNK, exception_on_overflow=False), dtype=np.int16)
    dataL = data[0::2]
    dataR = data[1::2]
    peakL = np.abs(np.max(dataL) - np.min(dataL)) / maxValue
    peakR = np.abs(np.max(dataR) - np.min(dataR)) / maxValue

    print(f"左声道: {round(peakL, 2)}")
    print(f"右声道: {round(peakR, 2)}")

常见问题处理

  • 读取数值全为0:确认回环设备未被静音,且对应你当前正在使用的音频输出设备
  • 报通道数不匹配错误:查询回环设备支持的通道数,修改代码里CHANNELS参数为对应值即可
  • 延迟过高:可以适当调小CHUNK参数,最低可设为128

内容的提问来源于stack exchange,提问作者PawełeK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:48:19