当前位置: 首页 > news >正文

基于RPI Monitor与Squeezelite的分布式家庭音频控制系统搭建指南

1. 项目概述:一个老玩家的分布式音频控制方案

折腾家庭音频系统,尤其是想搞一套覆盖多个房间的、音质不错还能集中管理的方案,是很多技术爱好者的共同追求。早年Logitech的Squeezebox系列口碑极佳,后来虽然硬件停产,但其软件生态——Logitech Media Server(LMS)和Squeezelite播放器——被开源社区接手并持续维护,生命力反而更旺盛了。这套系统的核心优势在于稳定、成熟,并且拥有极高的可定制性。当你拥有不止一个播放器时,一个直观、统一的控制界面就成了刚需。你肯定不想在手机或电脑上开好几个网页,或者来回切换App去控制不同房间的音响。

我尝试过不少方案,最终发现将RPI MonitorSqueezelite结合起来,是个非常优雅的解法。RPI Monitor本是一个用来监控树莓派各项指标(CPU、内存、温度等)的Web工具,但它有两个被严重低估的特性:一是支持完全自定义的插件(Addons),二是内置了“朋友”(Friends)列表功能,可以一键跳转到网络中的其他树莓派监控页面。我们正是要利用这两点,把每个播放器的控制界面(基于LMS的Material Skin)嵌入到RPI Monitor中,再通过Friends功能将所有播放器的监控与控制页面串联起来。最终,你只需要记住一个主播放器的IP地址,打开它的RPI Monitor页面,就能看到所有播放器的运行状态,并随时切换到任何一个进行控制,仿佛它们都在同一个管理后台里。

这个方案听起来有点“跨界”,但实测下来非常稳定可靠。它本质上是用一个成熟的监控框架,承载了另一个成熟的音频播放前端,两者通过DietPi系统可以一键安装,省去了大量底层配置的麻烦。下面,我就把从硬件准备、系统部署到深度定制的完整过程,以及我踩过的坑和总结的技巧,毫无保留地分享出来。

2. 核心思路与方案选型:为什么是RPI Monitor + Squeezelite?

在决定采用这个方案前,我评估过几种常见的多房间音频控制思路。最简单的是给每个播放器一个独立的Web界面,但这意味着你要收藏一堆书签,管理起来非常混乱。另一种是使用LMS自带的“播放器选择”下拉菜单,虽然能切换,但界面通常比较简陋,且无法同时看到播放器主机的运行状态。还有一些专用的家庭自动化平台(如Home Assistant)集成方案,功能强大但配置复杂,属于“杀鸡用牛刀”。

RPI Monitor + Squeezelite的组合脱颖而出,原因在于它的“恰到好处”:

  1. 低耦合,高内聚:RPI Monitor只负责提供Web服务器框架和跳转链接,Squeezelite(通过LMS的Material Skin)负责实际的音频控制。两者互不干扰,稳定性各自继承。
  2. 零额外开发:我们不需要写一行后端代码。整个方案的核心是修改几个配置文件,将LMS的Web界面以<iframe>的形式嵌入到RPI Monitor的插件页面中。这是最朴素也最可靠的Web集成方式。
  3. 状态监控与控制一体化:这是最大的亮点。在控制播放/暂停、选择歌单的同时,你能一眼看到这个树莓派的CPU负载、温度、网络流量。如果某个房间的音乐卡顿了,你可以立刻判断是网络问题(看WLAN流量)、还是主机负载过高(看CPU),而不用再SSH登录上去查。
  4. 部署标准化:得益于DietPi系统,RPI Monitor和Squeezelite都可以通过其软件中心一键安装,并自动配置为系统服务开机启动。这几乎将部署难度降到了最低,重复操作的成本很小。

关于设备选型的补充

  • 树莓派型号:推荐使用Raspberry Pi 3B+或更新型号。它们性能足够,且自带Wi-Fi和蓝牙。Pi Zero 2 W虽然便宜,但处理能力和I/O可能在高码率音频解码时成为瓶颈,不建议作为主力播放器。
  • 声卡/DAC HAT:这是提升音质最关键的一环。树莓派板载的3.5mm音频输出质量一般,底噪明显。我强烈建议为每个播放节点配备一块专用的I2S DAC HAT(如HiFiBerry DAC+系列、JustBoom DAC系列等)。它们通过树莓派的I2S总线直接传输数字音频信号,由HAT上的专用芯片进行数模转换,音质和信噪比有质的飞跃。
  • 电源与网络:使用官方电源或质量可靠的5V/3A以上电源适配器,供电不足会导致播放爆音甚至系统不稳定。网络方面,尽管支持Wi-Fi,但对于音频流传输,尤其是高解析度文件,有线以太网连接永远是更稳定、延迟更低的选择。

3. 系统准备与基础软件安装

3.1 DietPi系统安装与初始配置

DietPi是一个极其轻量且高度优化的Debian衍生系统,特别适合树莓派等单板计算机。它的优势在于提供了友好的dietpi-config配置工具和强大的dietpi-software软件中心,让我们能免去很多命令行下的繁琐操作。

第一步:烧录系统镜像

  1. 从DietPi官网下载对应你树莓派型号的最新镜像文件(通常选择Raspberry Pi OS版本)。
  2. 使用Balena Etcher或Raspberry Pi Imager将镜像写入一张至少8GB的MicroSD卡。这个过程会格式化存储卡,请提前备份数据。
  3. (关键技巧)预配置网络:在弹出SD卡前,你可以提前进行一些配置,让树莓派在第一次启动时就能联网,实现真正的“无头”(无显示器键盘)启动。在电脑上打开SD卡的boot分区,你会看到几个DietPi的配置文件。
    • 编辑dietpi-wifi.txt文件,填入你的Wi-Fi SSID和密码。如果你用有线网络,可以跳过这一步。
    • 编辑dietpi.txt文件,你可以在这里设置主机名、时区、键盘布局等。找到对应选项(文件内有详细注释),取消注释(删除行首的#)并修改值。例如:AUTO_SETUP_NET_WIFI_ENABLED=1AUTO_SETUP_LOCALE=en_US.UTF-8AUTO_SETUP_TIMEZONE=Asia/Shanghai
    • 这样做的好处是,插卡开机后,树莓派会自动应用这些配置,你无需连接显示器就能直接通过SSH登录。

第二步:首次启动与基础配置将SD卡插入树莓派,上电启动。第一次启动会进行文件系统扩展和初步更新,需要几分钟。当指示灯停止频繁闪烁后,就可以尝试连接了。

  1. 查找IP地址:在你的路由器管理界面查找名为DietPi(或你预设的主机名)的新设备,记下其IP地址。或者使用手机App如Fing扫描局域网。
  2. SSH登录:使用SSH客户端(如PuTTY、Terminal),连接树莓派的IP地址,用户名为root,密码为dietpi。首次登录会强制你修改密码,请设置一个强密码。
  3. 运行系统配置:在命令行输入sudo dietpi-config,进行以下关键设置:
    • Network Options -> Adapters:如果预配置Wi-Fi失败,在这里手动设置。
    • Language/Regional Options:确认时区、Wi-Fi国家代码(如CN)和键盘布局。
    • Security Options:可以再次修改密码,并建议修改主机名(如livingroom-pi)。注意,这里修改的是系统主机名,Squeezelite服务的主机名需要单独配置,后面会讲。
    • Network Options -> Misc -> Wait for Network on Boot:务必启用。这能确保系统在完全启动网络后再启动Squeezelite等服务,避免因网络未就绪导致播放器启动失败。
    • Audio Options
      • 启用Auto conversionPSU noise reduction
      • Sound card下拉菜单中,选择你连接的声卡或DAC HAT(例如hifiberry-dac)。如果列表里没有你的设备,可能需要先安装驱动,DietPi通常会提示你安装Alsa Utilities,选择是。

完成配置后,根据提示重启系统。

3.2 一键安装核心软件

DietPi的软件中心让安装变得异常简单。重启并重新SSH登录后,执行:

sudo dietpi-software

在软件浏览界面,使用方向键和空格键选中以下两个软件:

  • Squeezelite: 轻量级音频播放客户端。
  • RPI Monitor: 系统监控Web界面。

如果之前在音频配置时没有安装Alsa Utilities,也建议在这里一并选中。然后选择“Install”,DietPi会自动处理所有依赖和安装过程。这个过程需要一些时间,取决于网络速度。安装完成后,这两个服务都会自动设置为开机启动。

注意:DietPi安装的RPI Monitor版本可能不是最新的,但通常是最稳定的。它的配置文件路径和结构与从GitHub直接安装的版本略有不同,本教程的配置路径均基于DietPi的安装方式。如果你从其他源安装,可能需要调整路径。

4. 深度配置:让Squeezelite与RPI Monitor协同工作

基础软件装好了,但现在是两个独立的服务。我们的目标是把Squeezelite的控制界面“装进”RPI Monitor的页面里。

4.1 为Squeezelite创建RPI Monitor插件目录

首先,为我们的自定义插件创建一个专属目录:

sudo mkdir -p /usr/share/rpimonitor/web/addons/squeezelite

这个目录将存放我们自定义的HTML、CSS和JavaScript文件,RPI Monitor会从这里读取并渲染我们的插件页面。

4.2 个性化Squeezelite播放器名称

默认安装后,Squeezelite在LMS服务器上显示的名字是DietPi,如果你有多个播放器,会全部叫DietPi,根本无法区分。我们需要修改服务配置文件来赋予每个播放器独特的身份。

编辑Squeezelite的系统服务文件:

sudo nano /lib/systemd/system/squeezelite.service

找到以ExecStart=开头的一行。它可能看起来像这样:

ExecStart=/usr/bin/squeezelite -n DietPi -o hw:CARD=sndrpihifiberry,DEV=0 ...

我们需要修改-n参数后面的名字。注意:不要改动其他参数,特别是-o指定的音频输出设备。将DietPi改为你想要的唯一名称,例如-n LivingRoom-n Kitchen-Speaker

ExecStart=/usr/bin/squeezelite -n LivingRoom -o hw:CARD=sndrpihifiberry,DEV=0 ...

保存并退出编辑器(Ctrl+X, 然后按Y确认,再按回车)。

让系统重新加载服务配置并重启Squeezelite生效:

sudo systemctl daemon-reload sudo systemctl restart squeezelite

现在,去你的LMS服务器网页界面(通常是http://你的LMS服务器IP:9000),在播放器列表里应该能看到名字已经更新了。

4.3 创建核心插件文件:HTML、CSS与JS

这是整个方案的技术核心——创建一个HTML页面,用<iframe>标签嵌入LMS的Material Skin界面。

第一步:创建HTML文件在之前创建的插件目录下,新建文件squeezelite.html

sudo nano /usr/share/rpimonitor/web/addons/squeezelite/squeezelite.html

将以下内容粘贴进去,务必将其中的MY_LMS_SERVER_IP替换为你实际的LMS服务器内网IP地址。端口9000是LMS的默认Web界面端口,如果你的LMS改了端口,这里也要相应修改。

<!DOCTYPE html> <html lang="en"> <head> <title>Player Controller</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="Squeezelite Controller via RPI Monitor"> <!-- 引入RPI Monitor的基础样式和脚本 --> <link href="../css/bootstrap.min.css" rel="stylesheet"> <link href="../css/rpimonitor.css" rel="stylesheet"> <link rel="shortcut icon" type="image/png" href="../img/favicon.png"> </head> <body> <!-- 顶部菜单栏占位,RPI Monitor会自动注入 --> <div id='topmenu'></div> <!-- 核心部分:嵌入LMS的Material Skin界面 --> <div class="container-fluid"> <iframe src="http://192.168.1.100:9000/material/" style="border:none; width:100%; height:85vh;" title="Squeezelite Controller"> </iframe> </div> <!-- 底部栏占位 --> <div id="footer"></div> <!-- 对话框占位 --> <div id="dialogs"></div> <!-- 引入必要的JavaScript --> <script src="../js/jquery.min.js"></script> <script src="../js/bootstrap.min.js"></script> <script src="../js/rpimonitor.js" charset="utf-8"></script> <script src="../js/rpimonitor.index.js" charset="utf-8"></script> </body> </html>

关键点解析

  • src="http://.../material/": Material Skin是LMS的一个现代化、响应式Web界面,比默认界面美观易用得多。你需要先在LMS的插件管理页面安装“Material Skin”插件。
  • width:100%; height:85vh;: 设置iframe占满宽度,高度为视口高度的85%。这样既能留下空间给RPI Monitor的顶部菜单和底部信息,又能让控制界面足够大。你可以根据屏幕大小调整85vh这个值。
  • 引入的CSS和JS文件路径使用了../,这是因为我们的插件目录在web/addons/squeezelite/,而公共资源在web/css/web/js/

第二步:创建样式文件(CSS)为了让插件页面更好地融入RPI Monitor的整体风格,我们可以添加一点自定义样式。在同一个目录创建squeezelite.css

sudo nano /usr/share/rpimonitor/web/addons/squeezelite/squeezelite.css

内容可以很简单,主要是微调iframe容器的边距:

/* squeezelite.css */ .container-fluid { padding-top: 10px; padding-left: 5px; padding-right: 5px; } iframe { border-radius: 5px; /* 给iframe加一点圆角 */ }

第三步:创建脚本文件(JS)虽然不一定需要复杂功能,但一个JS文件是RPI Monitor插件机制所要求的。创建squeezelite.js

sudo nano /usr/share/rpimonitor/web/addons/squeezelite/squeezelite.js

内容可以是一个简单的初始化占位符:

// squeezelite.js // 此文件可为空,或用于未来可能的插件交互逻辑 console.log("Squeezelite addon loaded.");

4.4 配置RPI Monitor以识别新插件

现在需要告诉RPI Monitor,我们有一个新的插件,并且把它添加到菜单里。

第一步:编辑插件配置文件

sudo nano /etc/rpimonitor/template/addons.conf

这个文件可能已经有了一些示例配置。我们可以在文件末尾添加我们的插件配置。找到类似web.addons.*的段落,在其后添加:

# 自定义Squeezelite控制插件 web.addons.10.title=音乐控制 web.addons.10.showtitle=false web.addons.10.addons=squeezelite web.addons.10.allowupdate=false

参数解释

  • web.addons.10.title: 这是将在RPI Monitor顶部导航栏显示的菜单项名称,我写的是“音乐控制”,你可以改成“播放器”或任何你喜欢的名字。
  • web.addons.10.showtitle=false: 不在插件页面内部再次显示标题,让页面更简洁。
  • web.addons.10.addons=squeezelite必须与你在/usr/share/rpimonitor/web/addons/下创建的目录名(即squeezelite)完全一致。RPI Monitor会根据这个名字去查找对应的.html文件。
  • web.addons.10.allowupdate=false: 禁止自动更新此插件页面,因为我们完全自定义了静态内容。

第二步:调整数据源配置文件(可选)RPI Monitor通过data.conf文件决定在首页显示哪些监控“卡片”(chicklets)。你可以根据喜好精简或调整。

sudo nano /etc/rpimonitor/data.conf

例如,如果你只用Wi-Fi,可以找到关于network的章节,将其注释掉(在行首加#),并取消注释wlan相关的部分。这样首页就只显示无线网络信息,不显示有线网络了。调整后保存。

第三步:启用Friends功能(实现多设备跳转)这是实现“一个界面控制所有播放器”的关键。我们需要列出网络中其他安装了RPI Monitor的树莓派(即其他房间的播放器)。

  1. 首先,确保每个播放器都完成了上述所有步骤,并且拥有独立的IP地址和主机名。
  2. 主控制节点(比如你最常访问的那个播放器)上,编辑Friends配置文件。首先复制示例文件为有效配置文件:
    sudo cp /etc/rpimonitor/template/example.friends.conf /etc/rpimonitor/template/friends.conf
  3. 编辑这个新的friends.conf文件:
    sudo nano /etc/rpimonitor/template/friends.conf
    文件格式很简单,每两行定义一个“朋友”:第一行是显示名称,第二行是其IP地址。例如,如果你还有两个播放器在厨房和卧室:
    厨房音响 192.168.1.101 卧室音响 192.168.1.102
    重要:不要把自己(主控制节点)的IP地址加进去。这个列表是用于从当前页面跳转到其他设备的。

第四步:重启RPI Monitor服务完成所有配置后,重启服务使更改生效:

sudo systemctl restart rpimonitor

等待几秒钟,然后在浏览器中打开你的树莓派IP地址(RPI Monitor默认使用8888端口,即http://你的树莓派IP:8888)。

你应该能看到:

  1. 顶部导航栏多了一个“音乐控制”的选项卡,点击它会打开一个内嵌了LMS Material Skin界面的页面,你可以直接控制本机的Squeezelite播放器。
  2. 页面右侧或顶部(取决于RPI Monitor版本)会出现一个“Friends”下拉列表或板块,里面列出了你配置的“厨房音响”、“卧室音响”。点击任何一个,浏览器就会跳转到对应树莓派的RPI Monitor监控页面,进而可以控制那台播放器。

5. 高级定制与故障排查实录

5.1 界面与功能深度定制

基础的集成完成后,你可以玩出更多花样:

1. 修改RPI Monitor主题颜色:RPI Monitor的默认样式文件位于/usr/share/rpimonitor/web/css/rpimonitor.css。你可以直接修改这个文件,或者更推荐的方式,在squeezelite.css中覆盖某些样式,来让你的控制页面风格更统一。例如,改变导航栏颜色以匹配你的家居UI风格。

2. 在插件页面集成更多信息:我们的squeezelite.html文件只是一个简单的iframe包装器。你完全可以在这个页面里添加更多HTML元素。例如,在iframe上方添加一个显示本机播放器状态(如当前播放歌曲、音量)的区域。这需要你调用LMS的CLI接口或JSON API来获取数据,并通过一点JavaScript动态更新页面。这属于进阶玩法,但可行性很高。

3. 创建不同的插件页面:你可以复制squeezelite目录,创建squeezelite_radiosqueezelite_volume等新目录,并在对应的HTML文件中嵌入LMS的不同功能页面(如电台浏览器界面)。然后在addons.conf中为它们配置新的菜单项。这样你就可以在RPI Monitor内部分门别类地管理所有音频功能。

5.2 常见问题与解决方案速查表

在部署和使用的过程中,我遇到了不少问题,这里总结一下最常见的几个及其解决方法:

问题现象可能原因排查步骤与解决方案
访问RPI Monitor页面(IP:8888)显示“无法连接”或空白页。1. RPI Monitor服务未启动。
2. 防火墙阻止了8888端口。
1. SSH登录,执行sudo systemctl status rpimonitor查看服务状态。如果未运行,执行sudo systemctl start rpimonitor
2. DietPi默认防火墙(UFW)可能是关闭的。如果启用,需放行端口:sudo ufw allow 8888
点击“音乐控制”选项卡,页面空白或显示错误。1.squeezelite.html中LMS的IP地址错误。
2. 插件目录或文件权限不正确。
3.addons.confaddons名称与目录名不匹配。
1. 检查squeezelite.html中iframe的src属性,确保IP和端口正确,且LMS服务器可达(尝试直接用浏览器访问这个地址)。
2. 确保/usr/share/rpimonitor/web/addons/squeezelite/目录及内部文件对所有用户有读取权限:sudo chmod -R 755 /usr/share/rpimonitor/web/addons/squeezelite
3. 核对addons.confweb.addons.X.addons的值是否为squeezelite
Friends列表不显示或点击后无法跳转。1.friends.conf文件未创建或格式错误。
2. 目标朋友设备的RPI Monitor服务未运行或端口不通。
3. 目标设备IP地址已变更。
1. 确认/etc/rpimonitor/template/friends.conf文件存在且格式正确(名称和IP交替,无多余空格)。
2. 尝试从浏览器直接访问朋友设备的IP:8888,看是否能打开。
3. 检查路由器DHCP分配或为朋友设备设置静态IP。
LMS中看不到Squeezelite播放器,或播放器名称未改变。1. Squeezelite服务启动失败。
2. 音频输出设备配置错误。
3. 服务配置文件修改后未重载。
1. 执行sudo systemctl status squeezelite查看服务日志,常见错误是音频设备找不到。用aplay -l确认声卡名称。
2. 检查/lib/systemd/system/squeezelite.service-o参数后的设备名是否与aplay -l输出匹配。
3. 修改服务文件后,必须执行sudo systemctl daemon-reload再重启服务。
播放音乐时出现爆音、卡顿。1. 电源供电不足。
2. 网络波动(Wi-Fi环境下常见)。
3. 树莓派CPU负载过高或温度过高。
4. 音频缓冲区设置过小。
1. 使用足额(5V/3A)且质量好的电源。
2. 尽可能使用有线网络连接。优化Wi-Fi信号,或让播放器播放本地音乐库文件以减少实时流压力。
3. 在RPI Monitor首页监控CPU和温度。考虑为树莓派加装散热片。
4. 在Squeezelite启动参数中(编辑service文件)增加缓冲区参数,如-b 2048:4096

5.3 一个实用的技巧:绕过插件,直接使用Friends链接

如果你觉得配置插件有点复杂,或者你只想要一个最简单的跳转功能,有一个“捷径”:你可以完全不用创建squeezelite插件目录和修改addons.conf

直接在friends.conf文件中,将“朋友”的链接指向LMS服务器本身,但带上控制特定播放器的参数。不过,更简单的方法是:把每个播放器RPI Monitor的Friends列表,都配置成指向LMS服务器的Material Skin页面

具体做法是,在每个播放器的friends.conf里,添加一个这样的条目:

全家音频控制中心 http://你的LMS服务器IP:9000/material/

这样,你在任何一个播放器的RPI Monitor页面上,点击“全家音频控制中心”,就会直接全屏打开LMS的Web界面,在那里你可以管理所有播放器。这相当于把RPI Monitor当作一个简单的导航门户来使用。缺点是离开了RPI Monitor的监控页面,优点是配置极其简单,且LMS的界面功能最全。

经过以上步骤,一个基于RPI Monitor和Squeezelite的分布式家庭音频控制系统就搭建完成了。这个方案的美妙之处在于,它用最小的开发成本,将两个成熟开源项目的优势结合了起来,创造出了一个实用、直观且信息丰富的控制中心。每当朋友问我怎么用树莓派做全屋音响时,我都会把这个方案丢给他——它可能不是最华丽的,但绝对是经过实战检验、稳定且可维护性极高的那一个。

http://www.cnnetsun.cn/news/2711675.html

相关文章:

  • 基于ESP32-CAM的双目视觉系统:构建低成本VR远程观察平台
  • KDU:通过易受攻击驱动实现Windows内核探索的实用工具
  • 基于ESP8266的DIY智能门锁:从硬件选型到Web控制全解析
  • 从零打造基于Arduino的智能调光台灯:PWM原理与实战
  • xWRL6432毫米波雷达开发包(2023.05版):含CAN_SBL引导、天线图、工具箱与多场景例程
  • Spark-TTS核心技术解析:单流解耦语音令牌如何提升TTS效率 3倍
  • 如何快速实现抖音直播数据抓取:3步完成实时弹幕监控与数据分析
  • 终极Windows风扇控制指南:5分钟掌握Fan Control完全静音散热方案
  • Dreamcast手柄内置震动改造:从电路原理到3D打印的硬件DIY实践
  • Arduino家务激励器:从电路到代码的嵌入式入门实践
  • 如何用79万条中文医疗对话数据打造专业级医疗AI助手:完整指南
  • 基于ESP8266与PID算法的触觉温控系统设计与实现
  • 终极城通网盘加速指南:3分钟突破限速的完整解决方案
  • 如何在直播中让观众“看见“你的操作:input-overlay输入可视化终极指南
  • VR头显过热卡顿?DIY被动散热方案,低成本解决手机热降频
  • 基于树莓派与OpenCV的智能仓储机器人:从PID循线到视觉定位的完整实现
  • Studio Library:专业Maya动画库管理工具完全指南
  • Unity游戏开发:手把手教你用BMFont把美术给的图片变成可用的艺术字体(附避坑指南)
  • 汽车知识问答系统源码包:含爬虫采集、图谱构建、实体链接与SPARQL多轮查询全流程
  • 3个颠覆性玩法:解锁《鸣潮》隐藏功能的效率革命
  • 让PS3手柄在Windows上完美无线连接:BthPS3驱动全面解析
  • 【华为OD机试真题 新系统】1003、优化充电桩调度算法 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)
  • 使用Ansible批量管理+更新产品环境服务器配置
  • 3步解决Windows 10 PL-2303串口驱动代码10错误:老旧硬件完美重生指南
  • c#软件开发学习笔记--面向对象
  • 营销自动化升级迫在眉睫:2024年仅剩37天窗口期,完成AI+CDP+CRM三端协议对齐的企业不足11%
  • 告别Unknown display:手把手教你为Ubuntu老旧或特殊显示器手动创建xorg.conf配置
  • 7、More examples of machine learning can and connot do?机器学习可行性事例
  • 你的大脑只能同时处理4件事:一天下来你什么事都没做完的原因
  • 【轴承故障诊断】基于SE-TCN和SE-TCN-SVM西储大学轴承故障诊断研究附Matlab代码