
本文介绍如何使用 pyaudio 直接捕获系统播放的音频(如网页视频、本地音乐),无需第三方虚拟线缆工具,核心是识别并选择支持“立体声混音”(stereo mix)的虚拟输入设备。
本文介绍如何使用 pyaudio 直接捕获系统播放的音频(如网页视频、本地音乐),无需第三方虚拟线缆工具,核心是识别并选择支持“立体声混音”(stereo mix)的虚拟输入设备。
在 Windows 系统中,若希望录制电脑正在播放的声音(例如 YouTube 视频、游戏音效或系统通知音),而非麦克风输入,关键在于启用并调用 “立体声混音”(Stereo Mix) —— 这是一种由声卡驱动提供的虚拟录音设备,它将系统音频输出流作为“输入源”暴露给应用程序。
⚠️ 注意:该功能依赖硬件与驱动支持,并非所有设备默认启用。常见于 Realtek、Conexant 或部分 Intel HD Audio 声卡;Linux/macOS 无原生等效机制(需 PulseAudio/ALSA loopback 或 Soundflower 等方案,本文聚焦 Windows 原生 PyAudio 方案)。
✅ 第一步:枚举并确认可用的输入设备
运行以下代码,列出所有被 PyAudio 识别的输入设备,查找包含 "Stereo Mix"、"What U Hear"、"Loopback" 或类似关键词的设备:
import pyaudio
def list_input_devices():
p = pyaudio.PyAudio()
print("=== 支持输入的音频设备列表 ===")
for i in range(p.get_device_count()):
dev = p.get_device_info_by_index(i)
if dev['maxInputChannels'] > 0:
print(f"[{i}] {dev['name']} | 采样率: {int(dev['defaultSampleRate'])}Hz | 通道数: {int(dev['maxInputChannels'])}")
p.terminate()
list_input_devices()
典型输出示例:
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
[2] Stereo Mix (Realtek(R) Audio) | 采样率: 44100Hz | 通道数: 2
? 提示:若未看到 Stereo Mix,请右键任务栏音量图标 →「声音」→「录制」选项卡 → 右键空白处勾选「显示禁用的设备」→ 找到 Stereo Mix → 右键启用 → 再次运行上述脚本验证。
✅ 第二步:修改 MicrophoneStream 使用系统音频设备
将原代码中 input_device_index=1 替换为实际查得的 Stereo Mix 设备索引(如 2),同时注意匹配其原生采样率(通常为 44.1kHz 或 48kHz)。若 Google Cloud Speech API 要求 16kHz,需在后续做重采样(推荐使用 resampy 或 librosa):
# 修改初始化参数(示例:设备索引为 2,原生采样率 44100)
RATE_SYSTEM = 44100 # Stereo Mix 的默认采样率
CHUNK = int(RATE_SYSTEM / 10) # 100ms 帧长
# 在 MicrophoneStream.__enter__ 中指定设备索引
self._audio_stream = self._audio_interface.open(
format=pyaudio.paInt16,
channels=2, # Stereo Mix 通常是双声道
rate=RATE_SYSTEM,
input=True,
frames_per_buffer=CHUNK,
stream_callback=self._fill_buffer,
input_device_index=2, # ← 关键:替换为你的 Stereo Mix 索引
)
✅ 第三步:处理多声道与格式兼容性(重要!)
- Google Cloud Speech 默认接受 单声道 16kHz PCM。Stereo Mix 输出常为双声道 44.1kHz,需转换:
- ✅ 降采样:44.1kHz → 16kHz(避免失真,推荐 resampy.resample(data, 44100, 16000))
- ✅ 降维:双声道 → 单声道(取均值 mono = (left + right) // 2)
- 示例预处理片段(集成到 generator() 或单独 pipeline):
import numpy as np
import resampy
def preprocess_audio_chunk(chunk_bytes, original_rate=44100, target_rate=16000):
# 将字节转为 int16 数组(双声道)
audio_np = np.frombuffer(chunk_bytes, dtype=np.int16).reshape(-1, 2)
# 转单声道(平均左右)
mono = np.mean(audio_np, axis=1).astype(np.int16)
# 重采样
resampled = resampy.resample(mono, original_rate, target_rate)
return resampled.astype(np.int16).tobytes()
⚠️ 注意事项与替代方案
- 权限与隐私:Windows 11/10 可能限制应用访问 Stereo Mix,需在「设置 → 隐私 → 麦克风」中允许应用访问。
- 驱动兼容性:部分新版 Realtek 驱动已移除 Stereo Mix,可尝试安装旧版驱动或启用「听筒」功能(需物理环回)。
- 跨平台限制:macOS/Linux 不提供等效内建设备,Linux 可用 PulseAudio 模块 module-null-sink + monitor 源;macOS 需借助 BlackHole 或 Soundflower(属第三方,不满足“零外部工具”要求)。
- 性能建议:避免在 stream_callback 中做重采样(实时性敏感),建议在 generator() 中异步批处理或使用 sounddevice 库替代 PyAudio(更现代、API 更简洁)。
通过以上步骤,你即可用纯 Python + PyAudio 完成系统音频捕获,无缝对接语音识别、实时分析或音频录制流程。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










