从 赛尔号 Unity 客户端提取游戏背景音乐(BGM)的工具。
English · 中文
基于 SeerAPI 的两个开源项目构建:
albi0 用于下载 Unity 资源包,UnityPy 用于解码其中的 AudioClip 对象。
⚠️ 注意:本工具仅支持 Unity 端赛尔号。Flash 端和 H5 端使用完全不同的资源格式,不在支持范围内。
- 🎵 一键提取 BGM:点击开始,得到 WAV 文件。
- 🌐 直接从赛尔号官方 CDN 下载(通过
albi0),无需安装游戏客户端。 - 🔄 支持每周更新:游戏更新后再运行一次,只会下载和提取新增的 BGM(内容哈希去重)。
- 🏷️ 场景标签命名:文件命名如
mainstoryline__01_bgm.wav,标签源自资源在 Unity 项目中的路径。 - 🖥️ 两种使用方式:面向普通用户的单文件 Windows
.exe图形界面,以及可脚本化的命令行版本。 - 🌏 双语界面(English / 中文),首次运行时根据系统语言自动选择。
- 📦 可移植:exe 不需要 Python 运行环境,也不依赖固定路径——放在 U 盘里也能用。
- 从最新 Release 页面下载
SeerBGMExtractor.exe。 - 放到任意有写权限的文件夹中(如
D:\SeerBGM\)。 - 双击运行。如有需要,可在右上角选择语言。点击开始提取。
- 完成后点击打开输出文件夹查看提取出的 BGM 文件。
首次完整下载约几百 MB,后续运行只会下载有变化的部分。
需要 Python 3.10+:
git clone https://github.com/Lin-Xavier/seer-unity-audios.git
cd seer-unity-audios
pip install -r requirements.txt
python seer_bgm_gui.py # 图形界面版本
# 或
python extract_seer_bgm.py --download -o ./bgm # 命令行版本在已安装 Python 3.10+ 且加入 PATH 的 Windows 机器上:
build.bat输出文件:dist\SeerBGMExtractor.exe——单文件、无控制台窗口的 Windows 可执行文件(约 60–90 MB),所有依赖都打包在内。每次构建时会通过 make_icon.py 重新生成图标。
下载并提取(一条命令完成):
python extract_seer_bgm.py --download -o ./bgm如果已有下载好的资源包:
python extract_seer_bgm.py /资源包路径 -o ./bgm通过模式过滤限制下载范围,节省带宽:
python extract_seer_bgm.py --download \
--pattern '*audio*' --pattern '*sound*' --pattern '*music*' \
-o ./bgm提取所有音频,不进行 BGM 过滤(适合探索性用途):
python extract_seer_bgm.py ./bundles --all-audio -v -o ./all_audio可用的更新器(下载组):
| 更新器 | 资源包 | 包含内容 |
|---|---|---|
newseer.default (默认) |
DefaultPackage |
通用游戏资源——大部分 BGM 在这里 |
newseer.startup |
StartupPackage |
启动 / 标题画面 |
newseer.config |
ConfigPackage |
配置数据 |
newseer.pet |
PetAnimPackage |
精灵动画——主要是音效(SFX) |
newseer (组) |
以上四个 | 全部内容 |
完整参数列表请运行 python extract_seer_bgm.py --help。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
│ albi0 下载 │──▶│ 本地资源包文件 │──▶│ UnityPy 解码 │
│ (newseer.*) │ │ │ │ AudioClip → WAV │
└─────────────────┘ └─────────────────┘ └─────────────────────┘
│
▼
BGM 启发式过滤
(名称匹配 + 时长判断)
│
▼
从每个 AudioClip 的
m_Container 路径提取场景标签
│
▼
./bgm_out/
满足以下任一条件时,AudioClip 会被识别为 BGM:
- 文件名包含
bgm、music、bg_、theme、battle.*music或ost - 音频时长 ≥ 15 秒
同时排除名称符合音效模式的文件(如 sfx_、voice、click、hit 等)。
资源包通过文件魔数(magic bytes)识别,而非依赖文件扩展名——YooAsset(即 newseer 使用的资源系统)有时会写出无扩展名的哈希命名文件,这种情况也能正确识别。
.
├── docs/
│ ├── screenshot-cn.png
│ └── screenshot-en.png
├── README.md ← 中文说明
├── README.en.md ← 英文说明
├── extract_seer_bgm.py ← 核心提取逻辑与命令行入口
├── seer_bgm_gui.py ← Tkinter 图形界面
├── make_icon.py
├── app_icon.ico
├── build.bat ← Windows 构建脚本
├── run_from_source.bat ← 不构建直接运行 GUI
├── requirements.txt
├── diagnose_scene_info.py ← 探索性工具(m_Container 路径、AudioSource 引用)
└── diagnose_monobehaviour.py ← 探索性工具(场景配置启发式分析)
- SeerAPI 提供的
albi0下载器和理解赛尔号 CDN 协议的newseer插件。 - K0lb3 的 UnityPy 用于 Unity AssetBundle 解析。
- FMOD 团队(通过
fmod_toolkit)提供的音频解码支持。
- 更新器名称可能变化:如果
albi0后续版本重命名了更新器,运行albi0 list查看正确名称,通过--updater-name或界面字段传入。 - 场景配置提取经过研究但未实现:通过诊断脚本发现赛尔号的 IL2CPP 编译过的场景逻辑并不暴露在资源包内,因此场景标签来源于每个音频的 Unity 项目路径(
m_Container),而不是运行时的音频绑定。实测效果已足够好;技术细节见源码注释。 - 版权说明:提取的音乐版权归游戏发行商(淘米)所有。个人收听通常风险较低;但重新分发、二次上传、用于衍生作品都属于侵权行为。请合理使用。
MIT 协议 —— 详见 LICENSE。
