PianoNic/SpotifyEqExport

GitHub: PianoNic/SpotifyEqExport

将 Spotify 桌面客户端的均衡器设置读取并重建为标准 GraphicEQ 曲线,以便导入 Wavelet、EqualizerAPO 等第三方均衡器。

Stars: 0 | Forks: 0

#

SpotifyEqExport

SpotifyEqExport Logo

Export the Spotify desktop equalizer to Wavelet, EqualizerAPO or any GraphicEQ target.
Reads the six band gains straight out of Spotify's prefs file and rebuilds the actual filter curve.

visits Python 3.8+ no dependencies license

## 关于本项目 Spotify 的桌面均衡器没有导出功能,并且它的设置 UI 有时会停止渲染,而此时滤波器仍在工作,因此你能听到你的配置声音却看不到它。这些值仍然保存在磁盘上,以定点整数的形式存储在未公开的键下。 本项目读取这些键,以与 Spotify 相同的方式重建滤波器链,并生成可供 [Wavelet](https://pittvandewitt.github.io/Wavelet/) 导入的 127 点 `GraphicEQ` 曲线。它还内置了全部 21 个 Spotify 预设,因此你无需安装 Spotify 即可导出它们。 这里的所有内容都仅使用标准库。不需要 pip install,也不需要 numpy。 ## 滤波器参数 Spotify 使用了一条由六组 [RBJ Audio EQ Cookbook](https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html) biquad 组成的链: | 频段 | 类型 | Q / S | prefs 键 | |---|---|---|---| | 60 Hz | low shelf | S = 1.0 | `audio.equalizer.low_shelf_gain_v2` | | 150 Hz | peaking | Q = 1.0 | `audio.equalizer.low_peak_gain_v2` | | 400 Hz | peaking | Q = 1.0 | `audio.equalizer.low_mid_peak_gain_v2` | | 1 kHz | peaking | Q = 1.0 | `audio.equalizer.high_mid_peak_gain_v2` | | 2.4 kHz | peaking | Q = 1.0 | `audio.equalizer.high_peak_gain_v2` | | 15 kHz | high shelf | S = 1.0 | `audio.equalizer.high_shelf_gain_v2` | 增益以 `int32` 格式存储,缩放比例为 `12 / INT32_MAX`,因此 `2147483647` 代表 `+12 dB`。 类型、频率和 ±12 dB 的范围来自 `Apps/xpui/xpui-modules.js`(模块 `51332`)。缩放常量位于 `Spotify.dll` 中 RVA `0x1a28048` 处的 double 类型,由位于 `.text` RVA `0x1085340` 的 prefs 读取器加载。Q 和 S 是从实时滤波器系数中还原出来的,请参阅 [验证参数](#verifying-the-parameters)。 ## 功能特性 - **读取你的实际设置**:自动查找 `prefs` 文件,无需手动复制滑块值。 - **真正的 biquad**:计算 RBJ 传递函数,而不是像 Spotify 自身的 UI 那样仅仅在六个点之间进行插值。 - **内置所有 21 个预设**:`--preset rock`、`--preset rnb` 等,直接从客户端包中提取。 - **削波控制**:使用 `--scale` 来平缓曲线,使用 `--rolloff` 让 low shelf 在 60 Hz 以下逐渐衰减。 - **验证工具**:`verify_eq.py` 会读取 Spotify 当前正在使用的系数,并报告增益、Q 和 S 值。 - **零依赖**:仅需 Python 3.8+,不需要其他任何东西。 ## 安装 ``` git clone https://github.com/PianoNic/SpotifyEqExport cd SpotifyEqExport ``` ## 用法 导出当前在 Spotify 中配置的任何内容: ``` python spotify_eq_export.py ``` ``` 60 Hz lowshelf +12.00 dB 150 Hz peaking +0.30 dB 400 Hz peaking -6.70 dB 1000 Hz peaking -6.70 dB 2400 Hz peaking +0.70 dB 15000 Hz highshelf +12.00 dB -> Spotify EQ.txt ``` 在 Wavelet 的 **AutoEq > Import** 下导入生成的文件。文件名将成为配置文件的名称。 其他选项: ``` python spotify_eq_export.py --preset rock -o Rock.txt # a built-in preset python spotify_eq_export.py --scale 0.5 # halve the curve python spotify_eq_export.py --rolloff # fade sub-bass out python spotify_eq_export.py --prefs /path/to/prefs # explicit prefs file python spotify_eq_export.py --selftest ``` ### 关于削波的说明 Wavelet 在导入时会进行标准化,以保持感知响度不变。它不会将峰值拉低到 0 dB。如果系统全局应用于已经过限幅处理的素材,大幅度的 low shelf 提升会导致削波(clipping)。此外,shelf 滤波器在其转折频率以下也是平坦的,因此 60 Hz 处的 `+12 dB` shelf 意味着在 20 Hz 处同样是 `+12 dB`,而在那里你什么也听不到,却会损失大量的扬声器冲程。这就是 `--scale 0.5` 和 `--rolloff` 的用途。 ## 验证参数 在播放音频时,Spotify 会将这六个 biquad 作为连续的 48 字节块数组保存在内存中:类型为 doubles,未归一化,排列格式为 `[a0,a1,a2,b0,b1,b2]`。由于 `a1 = -2*cos(w0)` 仅取决于频率和采样率,因此该值足以用来定位数组,而增益、Q 和 S 的值则可以通过其余数据解析得出。 ``` python verify_eq.py -v ``` ``` PID 13876 block @ 0x1f551879610 fs=44100 lowshelf 60 Hz gain=+12.0000 dB S=1.000000 peaking 150 Hz gain= +0.3000 dB Q=1.000000 peaking 400 Hz gain= -6.7000 dB Q=1.000000 peaking 1000 Hz gain= -6.7000 dB Q=1.000000 peaking 2400 Hz gain= +0.7000 dB Q=1.000000 highshelf 15000 Hz gain=+12.0000 dB S=1.000000 ``` 还原出的增益与 `prefs` 中的值相匹配,这证实了我们找到的是正确的内存块。此功能仅限 Windows 使用,并且必须正在播放音频,因为当 pipeline 停止时,滤波器对象会被释放。 ## 输出格式 Wavelet 接受从 20 Hz 到 19871 Hz 的固定 127 点曲线。增加、删除或更改频率会使文件失效: ``` GraphicEQ: 20 5.9; 21 5.9; 22 5.9; ... ; 19871 6.0 ``` 相同的格式也可以被 EqualizerAPO 的 `GraphicEQ` 滤波器以及 [AutoEq](https://github.com/jaakkopasanen/AutoEq) 工具读取。 ## 许可证 基于 MIT 许可证发布。详情请参阅 `LICENSE`。 本项目与 Spotify AB 无关联,也未获得其认可或赞助。
标签:Python, Spotify, 均衡器, 数字信号处理, 无后门, 逆向工具, 配置导出, 音频处理