在 TrueNAS 上安装 Shairport Sync
笔者有一台小爱音箱,可惜它并不支持 AirPlay 协议。如果要将 Mac 上的音乐串流到这台音箱上播放,就需要通过蓝牙配对,体验并不理想。幸运的是,这个型号的音箱配备了 USB 接口,并且可以通过 USB 声卡的方式被电脑识别为音频输出设备。这就意味着,可以通过 Shairport Sync 等软件进行 AirPlay 协议配对,然后通过 USB 将音频流发送到这台音箱上播放。
这台音箱摆放位置旁边就是 NAS 服务器,运行着 TrueNAS Scale 25.04 系统。直接在 NAS 服务器上安装 Shairport Sync 并连接音箱是一个不错的选择。这个版本的 TrueNAS 支持运行 Docker 容器,因此软件安装上非常方便,不过在调试过程中还是踩了很多坑。本文记录一下安装过程,供参考。
检查 Alsa 配置
首先,通过 SSH 登陆到 TrueNAS 服务器上,执行cat /proc/asound/cards检查声卡是否正确识别:1
2
3
4
5admin@truenas[~]$ cat /proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0x6005220000 irq 199
1 [Pro7990 ]: USB-Audio - 智能音箱 Pro-7990
Xiaomi Corporation 智能音箱 Pro-7990 at usb-0000:00:14.0-5, high speed
可以看到,智能音箱声卡已经被正确识别为Pro7990。接下来,我们需要检查 Alsa 的配置(特别是 Mixer)。虽然 TrueNAS 系统基于 Debian,但它本身并不包含 Alsa 工具,因此我们需要先创建一个 Ubuntu 容器,并将声卡设备映射进去。可以通过 TrueNAS 的 Web 界面创建一个 Docker 容器,选择「通过 YAML 进行安装」,并添加如下配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15services:
alsa-check:
command:
- bash
- '-c'
- sleep infinity
container_name: alsa_mixer_check
devices:
- /dev/snd:/dev/snd
environment:
- DEBIAN_FRONTEND=noninteractive
image: ubuntu:24.04
privileged: True
stdin_open: True
tty: True
Ubuntu 的 Docker 容器启动成功后,进入容器内部的命令行,安装 Alsa 工具:1
2apt update
apt install -y alsa-utils
然后,执行aplay -l:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Pro7990 [智能音箱 Pro-7990], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
可以看到,智能音箱声卡被识别为卡 1,设备 0。因此,我们接下来执行amixer -c 1检查 Mixer 配置:1
2
3
4
5
6
7
8
9
10
11# amixer -c 1
Simple mixer control 'Playback Volume',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 100
Mono: Playback 70 [70%] [-30.00dB] [on]
Simple mixer control 'Capture Volume',0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 - 100
Mono: Capture 100 [100%] [0.00dB] [on]
可以看到,它包含Playback Volume控制项,说明可以通过 Alsa 调整音量。这个字段名称我们之后需要在 Shairport Sync 的配置文件中使用。
安装 Shairport Sync
接下来,我们可以通过 TrueNAS 的 Web 界面创建另一个 Docker 容器来安装 Shairport Sync。配置如下:1
2
3
4
5
6
7
8
9
10
11services:
shairport-sync:
devices:
- /dev/snd:/dev/snd
image: mikebrady/shairport-sync:latest
network_mode: host
privileged: True
restart: unless-stopped
volumes:
- >-
/mnt/SSD/App/shairport-sync/shairport-sync.conf:/etc/shairport-sync.conf:ro
这里指定的配置文件路径为/mnt/SSD/App/shairport-sync/shairport-sync.conf,它会被映射到容器内的/etc/shairport-sync.conf。这个配置文件在 TrueNAS 上的路径可以根据情况修改,内容可以这样写:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19general =
{
name = "Xiaomi Smart Speaker Pro";
interpolation = "soxr";
};
output_backend = "alsa";
resample_backend = "soxr";
alsa =
{
output_device = "plughw:Pro7990";
mixer_control_name = "Playback Volume";
mixer_device = "hw:Pro7990";
};
diagnostics = {
log_verbosity = 1;
};
这里的mixer_control_name字段需要和之前amixer -c 1命令中看到的名称一致,否则音量无法调节。output_device和mixer_device字段也需要根据实际情况进行调整。此外,配置中开启了soxr重采样,这是因为 AirPlay 协议传输的音频采样率可能和音箱不一致(44100 和 48000),如果不开启重采样,Shairport Sync 可能会报错退出或播放异常。
如果一切顺利的话,重启 Shairport Sync 容器后,就可以在 Mac 的音频输出设备中看到「Xiaomi Smart Speaker Pro」选项了,选择它即可通过 AirPlay 协议将音频流发送到智能音箱上播放。