PulseAudio虚拟麦克风配置后Python脚本无法读取音频问题
虚拟麦克风无法被Python脚本读取的问题排查
核心问题分析
当前配置存在两个关键错误:回环方向完全颠倒,以及Python脚本参数/逻辑不合理,导致无法捕获虚拟麦克风的音频。
一、修正虚拟麦克风的回环配置
module-pipe-source的作用是从指定FIFO文件读取音频数据,作为麦克风输入。你之前的操作是把虚拟麦克风的声音输出到扬声器,完全搞反了数据流方向。正确的做法是把扬声器的输出写入到虚拟麦克风的FIFO文件中。
正确配置步骤
- 卸载之前错误加载的模块:
pactl unload-module module-loopback pactl unload-module module-pipe-source
- 创建FIFO文件(确保文件存在):
mkfifo /tmp/virtual_mic
- 重新加载虚拟麦克风模块:
pactl load-module module-pipe-source source_name=virtual_mic file=/tmp/virtual_mic format=s16le rate=44100 channels=2
- 捕获扬声器输出并写入FIFO:
先找到扬声器的monitor源(用于捕获自身输出):
pactl list sources | grep -A20 "alsa_output.*monitor"
输出中会有类似alsa_output.pci-0000_02_02.0.analog-stereo.monitor的名称,用这个名称执行捕获命令:
parec -d alsa_output.pci-0000_02_02.0.analog-stereo.monitor --format=s16le --rate=44100 --channels=2 > /tmp/virtual_mic
保持这个命令运行,它会持续把扬声器的声音写入虚拟麦克风的FIFO。
- 设置默认输入为虚拟麦克风:
pactl set-default-source virtual_mic
二、修正Python脚本的问题
你的脚本存在参数不匹配、重复初始化模型的问题,导致无法正常处理音频:
修改后的脚本
import sounddevice as sd import numpy as np from transformers import pipeline # 提前初始化ASR模型,避免在回调中重复创建(严重影响性能) recognizer = pipeline("automatic-speech-recognition", model="openai/whisper-medium") def record_audio_callback(indata, frames, time, status): if status: print(status) else: print("inside record") try: # 将双通道音频转为单通道(Whisper默认处理单通道) audio_data = np.mean(indata, axis=1) result = recognizer(audio_data) print("Full result:", result) if result and isinstance(result, dict) and result.get('text'): transcription = result['text'] print("Transcription:", transcription) else: print("No valid Transcription found in result") except Exception as e: print("Error during transcription: ", e) # 匹配虚拟麦克风的参数(2通道,44100采样率) channels = 2 sample_rate = 44100 # 选择pulse设备(对应你列出的index=1),此时pulse默认输入是virtual_mic input_device = 1 with sd.InputStream(callback=record_audio_callback, channels=channels, samplerate=sample_rate, device=input_device): print("Inside Live Audio Listen") try: sd.sleep(20000) except KeyboardInterrupt: print("Keyboard Stopped Recording")
关键修改点
- 参数匹配:虚拟麦克风是2通道,脚本中
channels从1改为2,避免数据格式不兼容。 - 模型初始化:将
pipeline初始化移到回调函数外,避免每次回调都重新加载模型,导致性能崩溃。 - 音频格式转换:把双通道音频转为单通道,适配Whisper模型的输入要求。
三、验证步骤
- 运行
parec的捕获命令后,用pavucontrol确认virtual_mic的输入电平有波动。 - 先用命令行工具测试捕获:
arecord -D pulse -f S16_LE -r 44100 -c 2 test.wav
播放一段声音后停止,用音频播放器打开test.wav,确认有声音。
3. 再运行修改后的Python脚本,即可正常捕获并识别虚拟麦克风的音频。
内容的提问来源于stack exchange,提问作者Bigbear
相关产品推荐
相关产品推荐

