好不容易把自己压箱底的 MP3 传到了网易云音乐云盘,打算在手机上随时听歌怀旧,结果点开一看:歌词呢?我那辛辛苦苦整理的大段歌词怎么全是空白?
这种感觉就像是精心准备了一顿大餐,结果发现没给餐具。别急着骂网易云,这其实是因为网易云音乐有个“怪癖”:它不爱走寻常路。标准的 MP3 歌词存储方式(USLT 帧)它视而不见,非要读取一个叫 TXXX:LYRICS 的自定义字段。
今天 taishanhuo.com 就带大家用一个简单的 Python 脚本,暴力解决这个“歌词失踪案”。
为什么你的歌词在网易云里“装死”?
简单来说,MP3 文件的标签(ID3 协议)就像一个档案袋。
国际标准: 大家都把歌词放在一个叫
USLT(Unsynced Lyrics)的隔层里。网易云云盘: 偏不看
USLT,它只盯着一个叫TXXX(自定义文本)且描述为LYRICS的小纸条。
想让歌词显示?咱们得把档案袋拆了,把 USLT 里的内容掏出来,塞进 TXXX:LYRICS 里。这就是咱们今天要干的“搬运工”活计。
准备工作:搭好“手术台”
在动刀之前,我们需要准备两样东西:
Python 环境: 去官网下个 3.9 以上的版本就行。安装时千万记得勾选 “Add Python to PATH”,不然回头电脑不认识你写的命令。
mutagen 库: 这是处理音频标签的神器。
- 打开你的 CMD(命令行),输入:
pip install mutagen
- 打开你的 CMD(命令行),输入:
核心脚本:一键乾坤大挪移
新建一个文本文档,把下面这段代码粘进去,保存为 geci.py(记得后缀是 .py,不是 .txt)。
Python
import os
from mutagen.id3 import ID3, USLT, SYLT, TXXX
def force_convert(mp3_path):
try:
tags = ID3(mp3_path)
# 看看有没有标准歌词
uslt_frames = tags.getall("USLT")
if not uslt_frames:
return
lyrics_text = uslt_frames[0].text
# 暴力清理:把旧的、乱七八糟的标签全部抹掉
tags.delall("USLT")
tags.delall("SYLT")
tags.delall("TXXX")
# 重新写入网易云认的格式
tags.add(
TXXX(
encoding=3, # 使用 UTF-8 编码,拒绝乱码
desc="LYRICS",
text=lyrics_text
)
)
# 强制保存为 ID3v2.3 版本,兼容性最强
tags.save(v2_version=3)
print(f"✅ 已修复: {mp3_path}")
except Exception as e:
print(f"❌ 报错了: {mp3_path} -> {e}")
def process_folder(folder):
for root, dirs, files in os.walk(folder):
for file in files:
if file.lower().endswith(".mp3"):
full_path = os.path.join(root, file)
force_convert(full_path)
if __name__ == "__main__":
folder = input("请输入你的 MP3 文件夹路径: ").strip('"')
process_folder(folder)
print("\n🎉 全部处理完成!快去上传云盘试试吧。")
实操步骤:别在最后一步别翻车
解决中文乱码: 在 Windows 的命令行里,输入
chcp 65001然后回车。这一步是告诉电脑:“咱现在说的是 UTF-8,别把中文路径搞晕了。”运行脚本: 输入
python geci.py。输入路径: 把你装满 MP3 的文件夹拖进去,按回车。
常见坑点吐槽(避坑指南)
“为什么我跑完脚本,MP3Tag 里看着没变?” 兄弟,别急着怀疑人生。先把 MP3Tag 关了重新打开!那软件有缓存,不刷新它是不会告诉你真相的。
“依然不显示歌词?” 检查三件事:
字段名是不是全大写
LYRICS?原来的
USLT删干净了吗?(脚本里已经帮你删了)是否保存成了 ID3v2.3?网易云对 v2.4 的兼容性有时候像玄学,用 v2.3 最稳。