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

如何用Python基于PyAudio录制系统输出音频替代麦克风输入

将PyAudio录制源改为系统输出音频(无需第三方程序)

1. 找到系统音频输出的设备ID

首先需要枚举所有可用的音频输入设备,定位对应系统音频输出的设备(通常名称包含“立体声混音”“内置输出”“Monitor”等)。运行以下代码列出所有设备:

import pyaudio

p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    info = p.get_device_info_by_index(i)
    print(f"设备ID: {i}, 名称: {info['name']}, 输入通道数: {info['maxInputChannels']}")
p.terminate()

记下目标设备的ID,后续代码会用到。

2. 修改原有录制代码

核心改动点:替换输入设备ID为系统音频设备的ID,同时处理系统音频常见的立体声(2通道)转单通道(适配Google Cloud Speech的要求)。以下是修改后的完整代码:

import queue
import pyaudio
import numpy as np

# Audio recording parameters
RATE = 16000
CHUNK = int(RATE / 10)  # 100ms

class SystemAudioStream:
    """Opens a recording stream for system audio output as a generator yielding mono audio chunks."""
    def __init__(self, rate, chunk, device_index):
        self._rate = rate
        self._chunk = chunk
        self._device_index = device_index
        self._buff = queue.Queue()
        self.closed = True

    def __enter__(self):
        self._audio_interface = pyaudio.PyAudio()
        # 系统音频多为立体声,设置channels=2
        self._audio_stream = self._audio_interface.open(
            format=pyaudio.paInt16,
            channels=2,
            rate=self._rate,
            input=True,
            frames_per_buffer=self._chunk,
            stream_callback=self._fill_buffer,
            input_device_index=self._device_index,
        )
        self.closed = False
        return self

    def __exit__(self, type, value, traceback):
        self._audio_stream.stop_stream()
        self._audio_stream.close()
        self.closed = True
        self._buff.put(None)
        self._audio_interface.terminate()

    def _fill_buffer(self, in_data, frame_count, time_info, status_flags):
        """将立体声数据转换为单通道后存入缓冲区"""
        # 将二进制数据转为numpy数组(int16类型,2通道)
        audio_data = np.frombuffer(in_data, dtype=np.int16)
        # 取左右声道平均值转为单通道
        mono_data = (audio_data[::2] + audio_data[1::2]) // 2
        # 转回二进制格式存入队列
        self._buff.put(mono_data.tobytes())
        return None, pyaudio.paContinue

    def generator(self):
        """Generates mono audio chunks from the buffer."""
        while not self.closed:
            chunk = self._buff.get()
            if chunk is None:
                return
            yield chunk

3. 不同系统的额外配置

  • Windows: 右键任务栏音量图标 → 声音设置 → 更多声音设置 → 录制选项卡 → 右键空白处 → 显示禁用的设备 → 启用“立体声混音”
  • macOS: 打开“音频MIDI设置” → 左下角+号创建“多输出设备”(包含内置输出),然后在录制选项中选择该设备;或在系统偏好设置的安全性与隐私中,给Python授予录制权限,直接选择“内置输出”作为输入设备
  • Linux: PulseAudio环境下,系统音频Monitor设备会自动识别,名称类似Monitor of Built-in Audio Analog Stereo,直接使用对应的设备ID即可

使用示例

# 替换为你找到的系统音频设备ID
SYSTEM_AUDIO_DEVICE_ID = 2

with SystemAudioStream(RATE, CHUNK, SYSTEM_AUDIO_DEVICE_ID) as stream:
    audio_generator = stream.generator()
    for chunk in audio_generator:
        # 此处可将chunk发送至Google Cloud Speech进行转录
        print(f"Received chunk of size: {len(chunk)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:21:26