🎵 用Python脚本打造智能家庭音乐闹钟(LMS 多房间播放系统)

你是否想过,每天被自己喜欢的音乐温柔唤醒,或者晚上在舒缓的音乐中入眠?本教程将手把手教你,如何通过一个 Python 脚本,远程控制家中的 Logitech Media Server (LMS),实现智能闹钟和音乐播报功能,并让多个房间的播放器同步响起。
🌟 系统能为你做什么?
智能时间播报:早上、下午、晚上自动播放自定义语音报时,包含日期、星期、节日、节气、天气、日出日落等信息。
多房间同步播放:一个脚本,控制家中所有 Squeezelite 播放器同时播放相同内容,声音充满整个空间。
情景化音乐播放:早上播报后自动播放5首随机音乐提神,晚上则只播1首助眠,音量还会根据时间自动调整。
智能判断工作日:自动识别工作日、周末、法定节假日甚至寒暑假,只在需要时执行闹钟。
高度可定制:所有时间、音量、播放规则、生日祝福都可直接在脚本中配置。
📦 准备工作
在开始之前,请确保你已拥有并设置好以下组件:
控制端:一台可长期运行脚本的电脑。本教程以 Windows 为例,这主要是因为 Windows 的桌面环境友好,且像 VS Code 这样优秀的代码编辑器在 Windows 上体验极佳,能极大提升脚本编写和调试的效率。当然,脚本本身是跨平台的,在 Linux 或 macOS 上同样可以完美运行。
音乐服务器:一台 群晖(Synology)NAS 或其他支持 Docker 的设备,用于通过 Docker Compose 安装 Logitech Media Server (LMS)。LMS 现已更名为 Lyrion Music Server,但功能和兼容性完全一致。
播放终端:至少一个 LMS 兼容的播放器。本教程推荐使用 Squeezelite(一个轻量级、高性能的软件播放器)。我们将以斐讯 N1 刷 Armbian 系统为例,展示如何安装 Squeezelite。实际上,任何支持 DLNA/UPnP 并被 LMS 正确识别的设备也可作为播放终端。
网络:所有设备(控制端电脑、LMS 服务器、播放器)在同一个局域网内,能互相访问。
🚀 完整搭建教程
第一步:在群晖上通过 Docker Compose 安装 LMS (Lyrion Music Server)
这是搭建音乐服务器的核心步骤。我们将使用 Docker Compose 方式安装,这是目前最推荐的方法,便于管理和维护。
准备 Docker Compose 文件:
在群晖的任意目录下(例如
/docker/logitechmediaserver)创建一个docker-compose.yml文件。将以下内容复制到该文件中,并根据你的实际情况修改:
version: '3'
services:
lms:
image: lmscommunity/logitechmediaserver:latest
container_name: lms
restart: unless-stopped
network_mode: "host" # 关键设置:使用主机网络模式,有助于LMS主动发现局域网内的播放器
environment:
- HTTP_PORT=9000
- EXTRA_ARGS=--advertiseaddr=192.168.1.100 # 替换为你的群晖IP地址
volumes:
- ./config:/config # 配置文件目录
- /volume1/music:/music:ro # 音乐目录,只读权限保护原文件
- ./playlist:/playlist # 播放列表目录
重要参数说明:
network_mode: "host":这是关键设置。使用主机网络模式意味着容器与宿主机(群晖)共享网络命名空间。这能极大地提高 LMS 服务器在局域网内主动发现 Squeezelite 播放器的成功率和稳定性,因为容器可以直接使用宿主机的网络接口进行广播和组播通信。EXTRA_ARGS:将其中的192.168.1.100替换为你群晖 NAS 的实际局域网 IP 地址,这为播放器发现提供了明确的服务器地址。/volume1/music:/music:ro:将左侧路径/volume1/music替换为你群晖上实际存储音乐文件的目录路径,右侧的/music是容器内的路径,:ro表示只读权限。
启动容器:
通过 SSH 连接到你的群晖 NAS,或者使用群晖自带的“终端机”功能。
切换到存放
docker-compose.yml文件的目录,执行以下命令:docker-compose up -d这会自动下载镜像并启动容器。使用
docker-compose logs -f可以查看实时日志。
验证安装:
在浏览器中访问
http://[你的群晖IP]:9000。如果看到 LMS 的欢迎界面,说明安装成功。首次访问时,可以点击右下角的“Settings”,将语言切换为“简体中文”并应用。
第二步:在斐讯 N1(Armbian)上安装 Squeezelite 播放器
斐讯 N1 是一款高性价比的 ARM 设备,刷入 Armbian 后可以完美运行 Squeezelite。
前提条件:
你的斐讯 N1 已经刷好 Armbian 系统,并能通过 SSH 连接。
系统已更新到最新:
sudo apt update && sudo apt upgrade -y
安装 Squeezelite:
通过 SSH 连接到你的 N1,执行以下命令安装 Squeezelite:
sudo apt install squeezelite
配置 Squeezelite:
编辑配置文件:
sudo nano /etc/default/squeezelite修改或添加以下关键参数(根据你的实际情况调整):
# 播放器名称,在LMS界面中显示 SL_NAME="Living_Room_N1" # 音频输出设备,如果不确定,可以留空或使用默认值 # 可以使用 `aplay -l` 命令查看可用设备 # SL_SOUNDCARD="default" # 其他可选参数 # SB_EXTRA_ARGS="-o hw:0,0" # 指定具体的音频设备按
Ctrl+X,然后按Y保存并退出。
关键设置:解决 Armbian 默认音量过低的问题
Armbian 系统的一个常见问题是默认音频输出音量非常低。即使将播放器音量调到最大,声音也可能很小。这需要通过系统级的音频工具调整。
在 N1 上执行以下命令:
alsamixer这会打开一个终端图形界面。使用方向键选中你想要调节的音量控制项(通常是
Master和PCM),然后按↑键将它们调到最高(显示为00而不是MM,MM表示静音)。调整完毕后,按
Esc键退出。重要:为了让这个设置永久生效,必须保存它:
sudo alsactl store这个命令会将当前音频设置保存到
/etc/asound.state,这样每次系统启动时都会自动加载这个高音量配置。
启动并设置开机自启:
sudo systemctl restart squeezelite sudo systemctl enable squeezelite验证连接:
打开浏览器,访问你的 LMS 管理界面(
http://[群晖IP]:9000)。在 LMS 界面的右下角,点击选择播放器的下拉菜单。你应该能看到
Living_Room_N1出现在列表中。选择它,并尝试播放音乐。现在声音应该足够响亮。如果声音仍然很小,请返回检查
alsamixer设置,并确认已执行alsactl store。
部署第二个播放器:
在另一台 N1 上重复上述步骤,注意将
SL_NAME改为不同的名称,如Bedroom_N1。同样记得为每个播放器单独执行
alsamixer和alsactl store来设置和保存音量。这样你就有了两个独立的播放终端。
关键机制:LMS 如何控制多个 Squeezelite 同步播放
LMS 内置了强大的 “同步(Sync)” 功能。你可以将多个播放器组成一个同步组,组内任意一个播放器(称为“主播放器”)开始播放、暂停、跳曲或调整音量时,其他播放器(“从播放器”)会自动跟随,实现完美的多房间音频同步。
我们的 Python 脚本正是利用了这一机制。脚本运行时会自动扫描所有在线的播放器,将第一个找到的设为主播放器,然后将其余所有播放器同步到它。之后,脚本只需控制主播放器,所有从播放器便会自动同步播放。
你也可以在 LMS 网页界面手动管理同步组:在播放器列表的下拉菜单中,选择“同步至...”,然后选择另一个播放器即可。
第三步:在控制端部署 Python 环境与脚本
安装 Python 和 VS Code:
访问 python.org,下载并安装 Python 3.8 或以上版本。
务必在安装向导中勾选
Add Python to PATH,这样可以在命令行直接使用。(推荐)安装 Visual Studio Code,这是一个功能强大且免费的代码编辑器,对 Python 支持非常好,能极大提升编写和调试脚本的效率。
获取并修改核心脚本:
在电脑上选择一个合适的目录(例如
D:HomeAutomation),创建项目文件夹。将提供的
lms_alarm_clock.py脚本文件放入该文件夹。使用 VS Code 打开项目文件夹,然后打开
lms_alarm_clock.py文件。直接修改脚本中的配置部分:找到文件开头的配置区域(通常是一个大的字典或变量定义部分)。你需要将以下配置信息替换为你自己的设置。以下是一个需要你修改的配置示例框架,请根据注释修改:
# =============== 用户配置区域 ===============
# 请根据你的实际情况修改下面的配置
# LMS 服务器设置
LMS_HOST = "192.168.1.100" # 你的群晖/LMS服务器IP地址,请修改
LMS_WEB_PORT = 9000 # LMS的网页管理端口,默认9000
# 语音文件路径设置
# Windows上存放语音文件的网络路径(SMB共享)
WIN_ANNOUNCE_DIR = r"192.168.1.100musicannouncements" # 请修改为你的实际共享路径
# LMS服务器(容器内)能访问到的对应路径
LINUX_ANNOUNCE_DIR = "/music/announcements"
# 音乐数据库
DB_NAME = "music_library.db" # 音乐数据库文件名
# 假期设置(寒暑假,在这些日期内不执行闹钟)
VACATION_SUMMER_START = [7, 1] # 暑假开始 [月, 日]
VACATION_SUMMER_END = [8, 31] # 暑假结束 [月, 日]
VACATION_WINTER_START = [1, 15] # 寒假开始 [月, 日]
VACATION_WINTER_END = [2, 15] # 寒假结束 [月, 日]
# 地理位置(用于计算日出日落时间)
LOCATION_LATITUDE = 31.2304 # 你所在城市的纬度,例如上海
LOCATION_LONGITUDE = 121.4737 # 你所在城市的经度
# 生日设置(支持阳历和农历)
BIRTHDAYS = {
"小明": {
"solar": [1, 1], # 阳历生日 [月, 日]
"lunar": [12, 1] # 农历生日 [月, 日]
},
"小红": {
"solar": [5, 10],
"lunar": [4, 8]
}
}
# 播报设置
ANNOUNCEMENT_REPEAT = 3 # 播报重复次数
ANNOUNCEMENT_INTERVAL = 3 # 播报间隔(秒)
# 音乐播放设置
MUSIC_COUNT_MORNING = 5 # 早上播放歌曲数量
MUSIC_COUNT_AFTERNOON = 1 # 下午播放歌曲数量
MUSIC_COUNT_EVENING = 1 # 晚上播放歌曲数量
MUSIC_NEXT_VOLUME = 80 # 播报后播放音乐的音量百分比
MUSIC_WAIT_STOP_TIMEOUT = 60 # 等待音乐停止的超时时间(秒)
# 音量计划(线性或固定音量)
VOLUME_SCHEDULE = [
{
"type": "linear", # 线性变化
"start": [6, 0], # 开始时间 [时, 分]
"end": [8, 0], # 结束时间 [时, 分]
"start_vol": 40, # 起始音量
"end_vol": 70 # 结束音量
},
{
"type": "fixed", # 固定音量
"start": [8, 0],
"end": [20, 0],
"volume": 70 # 固定音量值
},
{
"type": "linear",
"start": [20, 0],
"end": [22, 0],
"start_vol": 70,
"end_vol": 30
}
]
VOLUME_DEFAULT = 50 # 默认音量(当不在任何计划时间段时使用)
# 日志设置
LOG_LEVEL = "INFO" # 日志级别:DEBUG, INFO, WARNING, ERROR, CRITICAL
LOG_JSON = True # 是否以JSON格式记录日志
# =============== 配置结束 ===============
重要提示:
将
LMS_HOST和WIN_ANNOUNCE_DIR中的192.168.1.100替换为你群晖 NAS 的实际局域网 IP 地址。WIN_ANNOUNCE_DIR是 Windows 访问群晖共享文件夹的 SMB 路径格式。请确保你的 Windows 电脑可以访问此路径并有写入权限。LINUX_ANNOUNCE_DIR是 Docker 容器内的路径,需要与你在docker-compose.yml中映射的路径对应。如果按上述 compose 文件配置,语音文件在容器内的路径为/music/announcements。生日信息已替换为通用示例,请根据你的实际情况修改。
第四步:在控制端安装依赖库与初始化音乐库
打开 VS Code 终端:在 VS Code 中,按
Ctrl+`打开集成终端,或者直接在项目文件夹中打开命令行。安装 Python 依赖包:在终端中依次执行以下命令:
pip install requests chinese-calendar holidays zhdate ephem pytz还需要安装 TTS 引擎来生成语音:
pip install edge-tts初始化音乐数据库:
脚本需要从一个 SQLite 数据库随机选择音乐。你需要另一个配套的扫描脚本(如
scan_flac_db.py,通常与主脚本一同提供)来扫描 LMS 音乐库并生成这个数据库。在控制端运行该扫描脚本(确保能访问到 LMS 的音乐库路径),生成的数据库文件(如
music_library.db)需放置于项目目录/Data/下,并与脚本中DB_NAME的配置一致。
第五步:配置共享目录(用于语音文件)
为了让 LMS 能访问到脚本生成的 TTS 语音文件,需要在控制端和 LMS 服务器(群晖)之间正确设置共享目录。
在群晖上创建共享目录:
在 File Station 中,在你存储音乐的共享目录下(例如
music)创建一个名为announcements的子文件夹。确保该文件夹有适当的读写权限。
在控制端(Windows):脚本中配置的
WIN_ANNOUNCE_DIR是一个网络路径(SMB共享)。你需要确保:你的 Windows 电脑可以正常访问这个网络路径(可以在文件资源管理器中输入
192.168.1.100music试试,注意替换 IP)。你有足够的权限在该目录下的
announcements子文件夹中创建和写入文件(用于保存 TTS 生成的语音文件)。
路径对应关系:
Windows 路径:
192.168.1.100musicannouncements(脚本中WIN_ANNOUNCE_DIR)Docker 容器内路径:
/music/announcements(脚本中LINUX_ANNOUNCE_DIR)这两者通过 Docker 卷映射(
/volume1/music:/music:ro)和 SMB 共享指向群晖上的同一个物理目录。
第六步:运行测试与设置自动化
首次测试运行:
在 VS Code 中打开终端,或者直接在项目目录打开命令行,运行:
python lms_alarm_clock.py观察控制台输出。脚本会执行以下操作:
连接 LMS 服务器(例如
192.168.1.100:9000)。发现所有在线的播放器(例如
Living_Room_N1和Bedroom_N1)。将第一个播放器设为主播放器,并将其他所有播放器同步到它,建立同步组。
根据当前时间判断模式(早上/下午/晚上),并决定是否执行。
生成 TTS 语音,并通过同步组对所有播放器进行播报。
播报后,播放指定数量的随机音乐。
如果一切正常,你的所有播放器应该会同步响起语音和音乐。请注意,由于前面设置了
alsamixer,现在播放器音量应该足够大。
设置自动化(两种方式任选其一):
方式一:使用专用控制脚本(推荐):可以编写一个简单的调度脚本(例如使用 Python 的
schedule库或系统 cron),在指定时间调用主脚本。这种方式更灵活,可以集成更复杂的逻辑。方式二:使用 Windows 任务计划程序:
在 Windows 搜索栏输入“任务计划程序”并打开。
点击“创建基本任务”。
名称:例如“早上音乐闹钟”。
触发器:选择“每天”,设置时间(如6:30)。
操作:选择“启动程序”。
“程序或脚本”:填写
python的完整路径(例如C:Users[你的用户名]AppDataLocalProgramsPythonPython310python.exe)。“添加参数”:填写你的脚本完整路径(例如
D:HomeAutomationlms_alarm_clock.py)。“起始于”:填写脚本所在目录(例如
D:HomeAutomation)。
完成创建。用同样的方法为其他时间点(如下午、晚上)创建任务。
🔧 故障排除与小贴士
脚本连接 LMS 失败:检查控制端电脑的防火墙,并确认脚本中
LMS_HOST和LMS_WEB_PORT配置正确,且控制端能 ping 通群晖。LMS Docker 容器无法访问:检查群晖防火墙是否放行了
9000端口,并使用docker-compose logs lms查看容器日志。确保使用了network_mode: "host"。LMS 中看不到 Squeezelite 播放器:
在 N1 上检查 Squeezelite 服务状态:
systemctl status squeezelite检查 N1 和群晖是否在同一个局域网子网内。
确认 LMS Docker 容器使用了
network_mode: "host",这是确保 LMS 能主动发现局域网播放器的关键。
播放器音量过低:
在 N1 上执行
alsamixer,确保Master和PCM音量已调到最高(显示为00)。执行
sudo alsactl store保存设置,确保重启后音量依然有效。
播放不同步:
脚本会自动建立同步组。如果不同步,可以登录 LMS 网页界面,在右下角播放器列表手动检查各播放器的同步状态。
网络延迟可能导致轻微不同步,确保所有设备通过有线网络连接效果最佳。
没有音乐或语音:
在 LMS 网页界面手动选择播放器并播放音乐,确认播放器本身和音频输出正常。
检查脚本日志文件(在项目目录的
log/文件夹下),查看具体的错误信息。重点检查:确认
WIN_ANNOUNCE_DIR路径在 Windows 上可访问且有写入权限,并且该路径在群晖上与 Docker 容器内的LINUX_ANNOUNCE_DIR路径正确对应。
温馨提示:开始前建议先将各播放器音量调小,进行测试。所有高级功能(生日、节气、农历提示、寒暑假日期、音量计划等)均可通过在脚本开头的配置区域直接修改相应的变量值来定制或关闭。
现在,你的智能家庭音乐系统已经搭建完成!享受被音乐温柔包围的每一个清晨和夜晚吧! 🎶
作者提示含AI生成内容。作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
