今天在 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. 进入全屏模式,享受沉浸式歌词体验

四、使用方法与实战

基础用法

  1. 在线音乐搜索:在搜索框中输入关键词,选择歌曲后自动播放
  2. 本地音乐导入:拖拽本地音频文件到播放器,自动索引
  3. 全屏歌词:点击全屏按钮或按 F11,进入沉浸式歌词视图
  4. 主题切换:在设置中选择不同的歌词动画主题

进阶用法

本地音乐智能匹配:

Folia 会自动从以下来源补全本地音乐的元数据:

  1. 音频文件自身元数据(ID3 标签)
  2. 同目录同名 .lrc 歌词文件
  3. 在线匹配结果(网易云音乐数据库)

如果自动匹配不准确,可以手动修正:

  • 在播放界面右侧面板进入"本地"选项卡
  • 手动搜索并指定歌词、封面或元数据来源

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

性能问题

问题: 全屏歌词动画卡顿

解决方案:

  1. 在设置中降低歌词动画质量
  2. 关闭 AI 主题生成(如已启用)
  3. 使用 --disable-gpu 参数启动 Electron(Linux)
# Linux 下使用软件渲染
FOLIA_LINUX_GRAPHICS_MODE=software npm run dev:electron:dist

兼容性问题

问题: 本地音乐无法识别歌词

解决方案:

  1. 确保音频文件同目录下有同名的 .lrc 文件
  2. 检查 LRC 文件编码是否为 UTF-8
  3. 手动在"本地"选项卡中指定歌词来源

六、总结

Folia 是一款设计精良、技术实现扎实的开源音乐播放器。其最大的创新在于将歌词播放从传统的"附属品"提升为视觉主角,通过多种全屏歌词动画效果和 AI 生成的沉浸式主题,为用户带来了前所未有的音乐可视化体验。

项目亮点:

  1. 技术选型先进:React 19 + Vite 6 + Electron 41,紧跟技术前沿
  2. 架构设计合理:前后端分离,支持多平台部署
  3. 用户体验优秀:智能歌词匹配、AI 主题生成等功能的加入,大大提升了易用性
  4. 开源社区活跃: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 绝对是一个值得深入研究的优秀开源项目。