[Bug Report] 腾讯会议麦克风无声 PipeWire音量bug修复经验和建议
Tofloor
poster avatar
dynamohuang
deepin
7 hours ago
Author

腾讯会议麦克风无声 PipeWire音量bug修复

📌 问题环境

项目
电脑 小米 RedmiBook 14 2025
系统 Deepin V23 (内核 6.18.34-amd64-desktop-rolling)
声卡 Intel Raptor Lake-P/U/H cAVS + SOF HDA DSP
编解码器 Realtek ALC256
腾讯会议 3.26.10.401 (com.qq.wemeet)
音频栈 PipeWire 1.6.4 + PulseAudio 兼容层

🔍 问题描述

腾讯会议设置中麦克风列表能正常检测到设备(Digital Microphone / Stereo Microphone),但点击"测试麦克风"后完全无声,无法正常收音。其他应用(如系统录音机)也存在同样的问题。

🔎 排查过程

第一步:确认硬件正常

直接绕过 PipeWire,通过 ALSA 设备录音测试:

arecord -D hw:sofhdadsp,6 -f S16_LE -r 48000 -c 2 -d 3 test.wav
# 结果:-25.5 dB,音量正常 ✅

结论:声卡硬件和驱动层没有问题。

第二步:发现 PipeWire 音量异常(核心问题)

通过 pw-dump 检查 PipeWire 节点属性,发现关键线索:

pw-dump | python3 -c "
import sys,json
data=json.load(sys.stdin)
for n in data:
    p=n.get('info',{}).get('props',{})
    if 'Mic1' in p.get('node.name',''):
        for pp in n.get('info',{}).get('params',{}).get('Props',[]):
            cv=pp.get('channelVolumes')
            if cv: print(f'channelVolumes: {cv}')
"
# 输出:channelVolumes: [0.287175, 0.287175]  ← 异常!只有 28.7%

PipeWire 节点内部的 channelVolumes 被设为 28.7%(约 -10.8 dB),而 PulseAudio 层显示的音量是 100%。 这意味着 PipeWire 和 PulseAudio 之间存在音量映射不一致的 bug。

直接对比音量差异:

ALSA 直接录音:  -25.5 dB(正常)
PipeWire 路径:  -56 dB(几乎静音)
差距:约 30 dB  ← 主要由 channelVolumes 异常导致

第三步:发现腾讯会议设备选择问题

监控腾讯会议的录音流:

pactl list source-outputs | grep -A20 "Wemeet VoiceEngine" | grep target
# 输出: target.object = "...HiFi__Mic2__source"

腾讯会议的 VoiceEngine 选择了 Mic2(Stereo Microphone / 模拟麦克风),这是 3.5mm 外接麦克风口,没有插入外接麦克风时信号极弱。实际工作的内置麦克风是 Mic1(Digital Microphone / DMIC)

腾讯会议通过 PulseAudio 的 module-stream-restore 记住了错误的设备偏好,每次重启都继续使用错误的设备。

第四步:发现 ALSA 默认增益过低

amixer -c 0 sget "Mic Boost"
# Mic Boost Volume: 0/3 (0.00 dB) ← 默认没有增益

SOF 驱动的默认 ALSA 混音器设置对麦克风增益过于保守。

✅ 解决方案

修复 1:调整 ALSA 增益

amixer -c 0 sset 'Mic Boost' 2          # 0dB → 20dB
amixer -c 0 sset 'Dmic0' 70              # 增益拉满
amixer -c 0 sset 'Capture' 63            # 增益拉满
amixer -c 0 sset 'PGA2.0 2 Master' 80   # 前端增益拉满

修复 2:修正 PipeWire channelVolumes

# 找到 Mic 节点 ID
pw-top -b | grep Mic
# 输出类似: R   60   ...  alsa_input...Mic1__source

# 设为 100%
pw-cli set-param 60 Props '{ "channelVolumes": [ 1.0, 1.0 ] }'
pactl set-source-volume @DEFAULT_SOURCE@ 100%

修复 3:腾讯会议手动选择正确麦克风

设置 → 音频 → 麦克风 → 选择 "Raptor Lake-P/U/H cAVS Stereo Microphone"

修复 4:持久化为开机自启服务

ALSA 增益恢复(system 级):

sudo tee /etc/systemd/system/fix-mic-levels.service << 'EOF'
[Unit]
Description=Fix Microphone Capture Levels
After=sound.target
[Service]
Type=oneshot
ExecStart=/usr/bin/amixer -c 0 sset 'Mic Boost' 2
ExecStart=/usr/bin/amixer -c 0 sset 'Dmic0' 70
ExecStart=/usr/bin/amixer -c 0 sset 'Capture' 63
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable fix-mic-levels.service

PipeWire 音量恢复(user 级):

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/fix-pipewire-volume.service << 'EOF'
[Unit]
Description=Fix PipeWire Mic channelVolumes
After=pipewire.service pipewire-pulse.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'sleep 5 && for id in $(pw-top -b 2>/dev/null | grep "Mic" | awk "{print \$2}"); do pw-cli set-param $id Props "{ \"channelVolumes\": [ 1.0, 1.0 ] }" 2>/dev/null; done && pactl set-source-volume @DEFAULT_SOURCE@ 100% 2>/dev/null'
[Install]
WantedBy=pipewire.service
EOF
systemctl --user enable fix-pipewire-volume.service

💡 对 Deepin 团队的建议

1. PipeWire/PulseAudio 音量映射 Bug(优先级:高)

PipeWire 的 channelVolumes 与 PulseAudio 的 source volume 存在不一致。PulseAudio 层显示 100% 时,PipeWire 层实际只有 28.7%,导致麦克风信号被大幅衰减。

建议:

  • 排查 PipeWire-PulseAudio 兼容层(libpulse via PipeWire)中 source volume → channelVolumes 的映射逻辑
  • 特别关注 Intel SOF 声卡在 skl_hda_dsp_generic 驱动下的音量同步问题
  • 可参考上游 PipeWire issue tracker 中关于 channelVolumes 重置的报告

2. SOF 驱动默认增益过低(优先级:中)

SOF HDA DSP 驱动的默认 ALSA 混音器配置对麦克风增益非常保守(Mic Boost=0dB),新安装的系统麦克风灵敏度极低。

建议:

  • 为常见笔记本机型(特别是小米、联想等)定制 UCM 配置文件,适当提高默认增益
  • 或在 WirePlumber 中添加默认的麦克风增益策略

3. SOF 拓扑文件符号链接问题(优先级:中)

ls -la /lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg.zst
# → sof-hda-generic-1ch.tplg.zst

2 声道拓扑被符号链接到 1 声道拓扑,可能导致部分机型的 DMIC 配置不正确。

建议:

  • 检查此符号链接是否对 2 声道 DMIC 机型有影响
  • 如有影响,应提供独立的 2 声道拓扑文件

4. PipeWire channelVolumes 持久化(优先级:低)

PipeWire 节点的 channelVolumes 没有用户可配置的持久化机制,每次重启或 PipeWire 服务重启后都会重置。

建议:

  • 在 PipeWire 配置中增加 channelVolumes 的默认值配置项
  • 或在 WirePlumber 中提供节点属性持久化的能力

5. 腾讯会议兼容性(优先级:低)

腾讯会议 Linux 版的 libaudio_module.so 内部音频模块在 PipeWire 环境下存在设备选择和音频捕获的兼容性问题。

建议:

  • 与腾讯会议团队沟通 Linux 版的 PipeWire 适配
  • 或在 Deepin 应用商店中标注已知的音频兼容性问题及解决方案

📎 相关命令速查

# 查看 ALSA 设备
arecord -l

# 查看 PulseAudio 源
pactl list sources short | grep -i mic

# 查看谁在用麦克风
pactl list source-outputs | grep -A5 "Wemeet"

# 查看 PipeWire 节点音量(关键排查步骤)
pw-dump | python3 -c "
import sys,json
data=json.load(sys.stdin)
for n in data:
    p=n.get('info',{}).get('props',{})
    if 'Mic' in p.get('node.name',''):
        for pp in n.get('info',{}).get('params',{}).get('Props',[]):
            cv=pp.get('channelVolumes')
            if cv: print(f'{p[\"node.name\"]}: channelVolumes={cv}')
"

# 修正 PipeWire 音量
pw-cli set-param <节点ID> Props '{ "channelVolumes": [ 1.0, 1.0 ] }'

# 实时监控 PipeWire 音频路由
pw-top

本文档基于 2026-06-11 在小米 RedmiBook 14 2025 + Deepin V23 上的实测经验整理。
如有类似问题,欢迎回帖讨论。

Reply Favorite View the author
All Replies
avatar
dynamohuang
deepin
7 hours ago
#1

实测成功,用同样问题的朋友可以参考解决。解决过程是claude帮忙执行的

Reply View the author