WSL默认无音频转发配置,导致ekho、ffmpeg等程序"运行无声音"。本次WSL2(WSLg方案)与WSL1(PulseAudio方案)完整配置流程,步骤直接可执行。
一、确认WSL版本
WSL1与WSL2配置不同,需先明确版本。打开Windows PowerShell(Win+R输入powershell),执行:
Plain
wsl -l -v # 查看版本及发行版状态
输出示例(重点看VERSION列):
Plain
NAME STATE VERSION
* Ubuntu-22.04 Running 2 # WSL2
CentOS-7 Stopped 1 # WSL1
WSL2需版本≥1.0.0以支持WSLg,低于此版本需先升级(见下文)。
二、WSL2配置:WSLg原生转发
WSLg是WSL2官方音频组件(版本≥1.0.0默认集成),无需Windows端额外软件。
1. 升级WSL2版本:版本<1.0.0时,PowerShell中执行:
WSL2版本<1.0.0时,在PowerShell中执行升级命令:
Plain
wsl --update # 升级核心组件
wsl --shutdown # 重启WSL使生效
验证版本:wsl --version,输出"WSL版本:2.0.9.0"及以上合格。
Plain
wsl --version
输出"WSL版本:2.0.9.0"及以上即为合格。
2. 安装WSL音频依赖 :WSL端需PulseAudio和alsa-utils,必须用普通用户操作(PulseAudio禁止root):
WSL端需PulseAudio(音频服务)和alsa-utils(设备管理)对接WSLg,必须使用 普通用户操作(PulseAudio禁止root运行)。
Plain
su - zimo # root切换至普通用户(示例用户zimo)
sudo apt update # 更新软件源
sudo apt install -y pulseaudio alsa-utils # 安装依赖
3. 配置PulseAudio连接WSLg:WSLg服务路径固定,执行:
WSLg音频服务节点路径固定,配置PulseAudio指向该路径即可:
Plain
mkdir -p ~/.config/pulse # 新建配置目录
# 写入WSLg服务地址
echo "default-server = unix:/mnt/wslg/PulseServer" > ~/.config/pulse/client.conf
echo "enable-shm = no" >> ~/.config/pulse/client.conf # 禁用共享内存减卡顿
4. 验证音频转发:用sox工具测试,出声即成功:
通过sox工具"录制+播放"验证链路连通性:
Plain
sudo apt install -y sox # 安装测试工具
rec test.wav # 录制音频(Ctrl+C结束)
play test.wav # 播放音频
ekho测试:./ekho -v zh "WSL2音频转发成功"
Plain
./ekho -v zh "WSL2音频转发成功"
5. PulseAudio自启配置:普通用户bash中设置,避免手动启动:
配置普通用户bash自启,避免每次手动启动PulseAudio:
Plain
nano ~/.bashrc # 编辑bash配置
# 末尾添加:服务未启动则自动启动
if ! pulseaudio --check; then
pulseaudio --start --exit-idle-time=-1
fi
source ~/.bashrc # 生效配置(Ctrl+O保存,Ctrl+X退出)
三、WSL1/旧版WSL2配置:PulseAudio手动转发
适用于WSL1或WSL2版本<1.0.0,通过"Windows服务器+WSL客户端"实现转发。
1. Windows端部署PulseAudio服务器
下载:访问PulseAudio Windows Support,获取最新压缩包(如pulseaudio-1.2.10-windows.zip)。
解压配置:解压至C:\PulseAudio(路径无中文),编辑C:\PulseAudio\etc\pulse\default.pa,修改内容:
Plain
# 注释本地socket配置
# load-module module-native-protocol-unix
# 开放TCP访问(允许WSL连接)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;172.0.0.0/8 auth-anonymous=1
# 绑定Windows音频设备
load-module module-waveout sink_name=output source_name=input
set-default-sink output
set-default-source input
启动:双击C:\PulseAudio\bin\pulseaudio.exe,防火墙弹窗选"允许访问",任务栏喇叭图标代表运行中。
2. WSL端配置PulseAudio客户端
3. 验证转发效果
Plain
speaker-test -t wav -c 2 # 系统音频测试(出声即成功)
./ekho -v zh "WSL1音频转发成功" # ekho测试
四、常见问题处理
Connection refused(连接被拒) :WSL2+WSLg执行wsl --shutdown重启;PulseAudio方案确认Windows端服务器启动、防火墙放行,WSL端用echo $PULSE_SERVER验证IP;全程用普通用户操作,禁止root。
无报错但无声音 :检查Windows主机音频设备(音箱连接、音量未静音);WSL2+WSLg执行rm -rf ~/.config/pulse后重新配置;PulseAudio方案确认Windows端配置含set-default-sink output。
权限不足(Permission denied) :将普通用户加入audio组,sudo usermod -aG audio $USER,重启终端生效。
Plain
sudo usermod -aG audio $USER # 加入audio组
# 重启终端生效
Plain
sudo usermod -aG audio $USER
# 重启终端生效
五、版本适配说明
Plain
WSL版本 配置方案 特点
WSL2(≥1.0.0) WSLg原生转发 零额外软件,简单稳定
WSL2(<1.0.0) 升级后用WSLg 一劳永逸
WSL1 PulseAudio手动转发 唯一适配,兼容性强
核心原则:普通用户运行音频程序+确保音频服务连接正常。配置完成后,ekho、ffmpeg等程序均可正常输出声音。
Plain
sudo apt update # 更新源
sudo apt install -y pulseaudio # 安装客户端
# 配置关联Windows服务器(DNS地址即Windows IP)
nano ~/.bashrc
echo 'export PULSE_SERVER=tcp:$(grep -oP "(?<=nameserver\ ).*" /etc/resolv.conf)' >> ~/.bashrc
source ~/.bashrc # 生效配置
验证:执行echo $PULSE_SERVER,输出"tcp:172.xx.xx.xx"即为成功。