今天在 GitHub Trending 上看到一个有意思的项目:Folia,这是一款以全屏沉浸式歌词播放为核心的音乐播放器,能够让歌词展示如文字 PV 般具有丰富的视觉效果。
一、项目概述
Folia(辞曲新境)是一个开源的全屏沉浸式歌词播放器,其核心设计理念是将歌词播放从传统的"伴唱"角色提升为视觉主角。项目采用 Electron + React 技术栈构建,支持多平台部署(桌面端和 Web 端)。
核心特性:
- 全屏歌词动画:提供多种歌词动画效果(浮名、流光、心象、云阶、群唱、倾诉等),每种都有独特的排版氛围和可调参数
- 多源音乐支持:支持网易云音乐在线搜索、Navidrome 媒体服务器、本地音乐文件
- 智能歌词匹配:自动从在线资源、本地 LRC 文件、音频元数据匹配歌词
- AI 主题生成:基于歌曲情绪与歌词内容生成沉浸式背景与视觉参数
- Now Playing 接入:支持通过本机服务接入外部播放器的歌曲信息
支持平台:
- Windows / macOS / Linux 桌面端(Electron 打包)
- Web 版(支持 Vercel 一键部署)
- 移动设备(通过浏览器访问)
二、技术原理
架构设计
Folia 采用前后端分离架构,在桌面端通过 Electron 封装,Web 端则纯前端运行:
┌─────────────────────────────────────────┐
│ Electron Shell │
│ ┌──────────────────────────────────┐ │
│ │ React Frontend (Vite) │ │
│ │ ┌────────────┬──────────────┐ │ │
│ │ │ Lyrics │ Stage View │ │ │
│ │ │ Renderer │ (Fullscreen) │ │ │
│ │ └────────────┴──────────────┘ │ │
│ │ ┌────────────┬──────────────┐ │ │
│ │ │ Music │ Theme │ │ │
│ │ │ Player │ Generator │ │ │
│ │ └────────────┴──────────────┘ │ │
│ └──────────────────────────────────┘ │
│ ┌──────────────────────────────────┐ │
│ │ Preload (IPC Bridge) │ │
│ └──────────────────────────────────┘ │
│ ┌──────────────────────────────────┐ │
│ │ Main Process (Electron) │ │
│ │ - Window Management │ │
│ │ - Local File Access │ │
│ │ - Discord RPC │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
核心技术栈
前端框架:
- React 19 + TypeScript
- Vite 6 构建工具
- Tailwind CSS 4 + PostCSS
- framer-motion(动画库)
- zustand(状态管理)
桌面端:
- Electron 41
- electron-store(持久化存储)
- electron-updater(自动更新)
音乐源接入:
- @neteasecloudmusicapienhanced/api(网易云音乐 API)
- music-metadata(音频元数据解析)
- LDDC 格式支持(增强型逐字歌词)
AI 能力:
- @google/genai(Google Gemini API,用于主题生成)
关键算法:歌词副歌检测
项目中实现了一个巧妙的副歌检测算法,通过分析 LRC 歌词中重复出现的句子来识别副歌部分:
const detectChorusLinesOptimized = (lrcString) => {
const lines = lrcString.split('\n');
const lineCounts = new Map();
// 快速提取歌词文本(去除时间标签)
lines.forEach(line => {
const lastBracketIndex = line.lastIndexOf(']');
let text = "";
if (lastBracketIndex !== -1) {
text = line.substring(lastBracketIndex + 1).trim();
} else {
text = line.trim();
}
if (!text || text.length < 2) return;
const count = lineCounts.get(text) || 0;
lineCounts.set(text, count + 1);
});
// 找出出现次数最多的歌词行(即为副歌)
let maxCount = 0;
lineCounts.forEach(count => {
if (count > maxCount) maxCount = count;
});
const chorusLines = new Set();
if (maxCount <= 1) return chorusLines;
lineCounts.forEach((count, text) => {
if (count === maxCount) {
chorusLines.add(text);
}
});
return chorusLines;
};
该算法的时间复杂度为 O(n),通过 Map 数据结构实现高效的词频统计,可用于自动高亮副歌部分的歌词。
数据流分析
用户操作
↓
Music Player Store (Zustand)
↓
┌───────────────┬─────────────────┐
│ │ │
歌词加载 播放控制 主题生成
│ │ │
↓ ↓ ↓
LRC Parser Audio API Gemini API
│ │ │
↓ ↓ ↓
Lyrics Waveform Color
Renderer Visualizer Palette
三、安装与快速开始
环境要求
- Node.js ≥ 18
- npm 或 yarn
- (桌面端)Electron 构建环境
安装步骤
方案 1:直接使用桌面端(推荐)
前往 Releases 页面 下载对应平台的安装包:
- macOS:下载
.dmg文件 - Windows:下载
.exe安装程序 - Linux:下载
.AppImage或.deb包
方案 2:从源码构建
# 克隆仓库
git clone https://github.com/chthollyphile/folia-major.git
cd folia-major
# 安装依赖
npm install
# 开发模式(Web 版)
npm run dev
# 开发模式(Electron 桌面端)
npm run dev:electron
# 构建桌面端
npm run build:electron
方案 3:部署 Web 版到 Vercel
点击 README 中的 “Deploy with Vercel” 按钮,一键部署到 Vercel 平台。
最简运行示例
// 配置网易云音乐 API 地址(如需自建 API 服务)
// 在 .env 文件中设置:
// VITE_NETEASE_API_BASE=http://your-api-server
// 启动开发服务器
npm run dev
// 访问 http://localhost:3000
// 1. 点击搜索按钮
// 2. 输入歌曲名或歌手名
// 3. 选择歌曲,自动加载歌词和封面
// 4. 进入全屏模式,享受沉浸式歌词体验
四、使用方法与实战
基础用法
- 在线音乐搜索:在搜索框中输入关键词,选择歌曲后自动播放
- 本地音乐导入:拖拽本地音频文件到播放器,自动索引
- 全屏歌词:点击全屏按钮或按 F11,进入沉浸式歌词视图
- 主题切换:在设置中选择不同的歌词动画主题
进阶用法
本地音乐智能匹配:
Folia 会自动从以下来源补全本地音乐的元数据:
- 音频文件自身元数据(ID3 标签)
- 同目录同名
.lrc歌词文件 - 在线匹配结果(网易云音乐数据库)
如果自动匹配不准确,可以手动修正:
- 在播放界面右侧面板进入"本地"选项卡
- 手动搜索并指定歌词、封面或元数据来源
Now Playing 接入:
通过本机 Now Playing 服务,可以将外部播放器(如 iTunes、Spotify)的歌曲信息接入 Folia:
// 启动 Now Playing 服务后,Folia 会自动监听
// 无需额外配置,歌曲、时间轴与歌词信息会自动同步
AI 主题生成:
配置 Gemini API Key 后,Folia 可以基于当前歌曲的情绪和歌词内容生成沉浸式背景:
# 在 .env 文件中配置
GEMINI_API_KEY=your_api_key_here
# 或在设置界面中直接输入 API Key
实际项目示例
示例 1:部署到个人服务器
# 构建 Web 版
npm run build
# 将 dist 目录部署到 Nginx/Apache
# Nginx 配置示例
server {
listen 80;
server_name folia.yourdomain.com;
root /path/to/folia/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
示例 2:自定义歌词动画主题
Folia 的歌词动画基于 React 组件实现,可以通过修改 src/components/lyrics/ 目录下的文件来自定义动画效果。
五、常见问题与解决方案
安装失败
问题: npm install 失败,提示依赖冲突
解决方案:
# 清除 npm 缓存
npm cache clean --force
# 删除 node_modules 和 package-lock.json
rm -rf node_modules package-lock.json
# 重新安装
npm install
运行时错误
问题: Electron 桌面端启动失败,提示 “The SUID sandbox helper binary was found, but is not configured correctly”
解决方案(Linux):
# 方案 1:使用 --no-sandbox 启动
npm run dev:electron:dist:swiftshader
# 方案 2:配置 SUID sandbox
sudo chmod 4755 chrome-sandbox
问题: Web 版无法连接网易云音乐 API
解决方案:
Folia 需要网易云音乐 API 服务支持。可以使用官方推荐的 NeteaseCloudMusicApiEnhanced 自行部署:
# 克隆 API 项目
git clone https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
cd api-enhanced
# 安装依赖并启动
npm install
npm start
# 在 Folia 的 .env 文件中配置 API 地址
VITE_NETEASE_API_BASE=http://localhost:3001
性能问题
问题: 全屏歌词动画卡顿
解决方案:
- 在设置中降低歌词动画质量
- 关闭 AI 主题生成(如已启用)
- 使用
--disable-gpu参数启动 Electron(Linux)
# Linux 下使用软件渲染
FOLIA_LINUX_GRAPHICS_MODE=software npm run dev:electron:dist
兼容性问题
问题: 本地音乐无法识别歌词
解决方案:
- 确保音频文件同目录下有同名的
.lrc文件 - 检查 LRC 文件编码是否为 UTF-8
- 手动在"本地"选项卡中指定歌词来源
六、总结
Folia 是一款设计精良、技术实现扎实的开源音乐播放器。其最大的创新在于将歌词播放从传统的"附属品"提升为视觉主角,通过多种全屏歌词动画效果和 AI 生成的沉浸式主题,为用户带来了前所未有的音乐可视化体验。
项目亮点:
- 技术选型先进:React 19 + Vite 6 + Electron 41,紧跟技术前沿
- 架构设计合理:前后端分离,支持多平台部署
- 用户体验优秀:智能歌词匹配、AI 主题生成等功能的加入,大大提升了易用性
- 开源社区活跃:20 位贡献者参与,项目持续迭代
适用场景:
- 音乐爱好者:享受沉浸式歌词体验
- 设计师/开发者:学习全屏动画实现、React 性能优化
- 自部署用户:作为个人音乐播放解决方案
许可证: AGPL-3.0(请注意开源协议要求)
相关资源:
- 项目地址:https://github.com/chthollyphile/folia-major
- 在线文档:https://folia-site.vercel.app/guide/
- 技术说明:docs/technical.md
- 网易云音乐 API:https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced
- LDDC 歌词工具:https://github.com/chenmozhijin/LDDC
如果你对音乐可视化、React 动画或 Electron 桌面端开发感兴趣,Folia 绝对是一个值得深入研究的优秀开源项目。