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

PulseAudio虚拟麦克风配置后Python脚本无法读取音频问题

虚拟麦克风无法被Python脚本读取的问题排查

核心问题分析

当前配置存在两个关键错误:回环方向完全颠倒,以及Python脚本参数/逻辑不合理,导致无法捕获虚拟麦克风的音频。


一、修正虚拟麦克风的回环配置

module-pipe-source的作用是从指定FIFO文件读取音频数据,作为麦克风输入。你之前的操作是把虚拟麦克风的声音输出到扬声器,完全搞反了数据流方向。正确的做法是把扬声器的输出写入到虚拟麦克风的FIFO文件中。

正确配置步骤

  1. 卸载之前错误加载的模块:
pactl unload-module module-loopback
pactl unload-module module-pipe-source
  1. 创建FIFO文件(确保文件存在):
mkfifo /tmp/virtual_mic
  1. 重新加载虚拟麦克风模块:
pactl load-module module-pipe-source source_name=virtual_mic file=/tmp/virtual_mic format=s16le rate=44100 channels=2
  1. 捕获扬声器输出并写入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。

  1. 设置默认输入为虚拟麦克风:
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模型的输入要求。

三、验证步骤

  1. 运行parec的捕获命令后,用pavucontrol确认virtual_mic的输入电平有波动。
  2. 先用命令行工具测试捕获:
arecord -D pulse -f S16_LE -r 44100 -c 2 test.wav

播放一段声音后停止,用音频播放器打开test.wav,确认有声音。
3. 再运行修改后的Python脚本,即可正常捕获并识别虚拟麦克风的音频。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:44:59