如何用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
相关产品推荐
相关产品推荐

