在给 mp3 添置可滚动歌词时,常见的痛点并不局限于我能不能拿到文本,更在于我如何拿到带时间戳的文本,并保证同步准确度。针对这两个层面,本文先厘清 lrc 格式与 ID3 歌词帧的本质差异,再结合免费与商业接口、音频指纹识别、自动语音识别(ASR)以及桌面歌词工具,构建一条从离线文件到高质量 lrc 的全链路策略。通过阅读,你将掌握用 Python 轻量脚本批量解析 ID3、调用 Lyrics API、一键 Fingerprint 识曲取词、乃至离线 Whisper 强制对齐生成 lrc 的完整范式。

背景与目标

lrc 是一种纯文本侧车文件,文件名与音频同名,仅扩展名为 .lrc,其中每一行以 [mm:ss.xx] 标记时间轴,实现播放时逐行高亮(en.wikipedia.org, docs.fileformat.com)。如果播放器没有检测到同名 lrc,就会尝试读取 mp3 内部的 ID3v2 USLT(Unsynchronised Lyrics)帧;该帧只含纯文本,不含时间戳,因此无法滚动同步(docs.puddletag.net, mutagen-specs.readthedocs.io)。目标是:若 mp3 已带 ID3 歌词就抽取并转成 lrc;若无内嵌歌词则自动联网或离线识别补齐

歌词数据的两种来源

内嵌 ID3

ID3v2.3/2.4 的 USLT 帧采用语言|描述|歌词正文三段式结构,适合嵌入整首词,但缺乏时间信息(docs.puddletag.net)。

独立 lrc

lrc 保持了行级别或者词级别时间戳,配合播放器可形成卡拉 OK 效果,主流格式已沿用近二十年并被 Wikipedia、FileFormat 等站点归档(en.wikipedia.org, docs.fileformat.com)。

方案一:解析 ID3 标签中的歌词

理论基础

如果音乐来自付费商店或曾被 MiniLyrics、Mp3tag 之类工具写入标签,很可能已经拥有 USLT 帧(mediamonkey.com, community.mp3tag.de)。我们所需仅是将文本抽出并套上时间戳(可粗粒度全 0:00,后续再校正)。

Python 样例代码
from mutagen.id3 import ID3, USLT
from mutagen.easyid3 import EasyID3
import re, pathlib

def id3_to_lrc(mp3_path: str):
    audio = ID3(mp3_path)
    uslt: USLT = audio.getall('USLT')[0] if audio.getall('USLT') else None
    if not uslt:
        raise ValueError("No embedded lyrics")
    text = uslt.text.strip().splitlines()
    lrc_lines = [f"[00:00.00]{line}" for line in text]
    lrc_path = pathlib.Path(mp3_path).with_suffix('.lrc')
    lrc_path.write_text("\n".join(lrc_lines), encoding="utf-8")
    print("Saved:", lrc_path)

Mutagen 支持完整 ID3 读写,官方文档强调 Unicode 安全(mutagen.readthedocs.io)。

方案二:调用公共歌词 API

lyrics.ovh 免费接口

https://api.lyrics.ovh/v1/艺术家/歌曲 能返回 JSON 中的 lyrics 字段,适合快速补齐纯文本(lyrics.ovh, lyricsovh.docs.apiary.io)。拼写正确率和曲库覆盖度一般,但无需鉴权。

LyricFind 与商业接口

若需要商业授权或更高准确率,可接入 LyricFind、Musixmatch 等平台;LyricFind 提供搜索、展示、时间轴三种付费档位,并保证版权合规(lyricfind.com, lyricfind.com)。Musixmatch 同时为 Spotify、Tidal 提供后台歌词,也说明自动管线仍可能出现误词问题,需要人工校验(wired.com, [pitchfork.com](https://pitchfork.com/thepitch/how-fake-my-bloody-valentine-and-cocteau-twins-lyrics-ended-up-on-spotify?utm_source=chatgpt.com “How “Fake” My Bloody Valentine and Cocteau Twins Lyrics Ended Up on Spotify”))。

使用 Mp3tag 批量写入

Mp3tag 社区脚本可以把 Genius、DarkLyrics 等站点爬取的文本直接写入 USLT 字段,并支持批量操作(community.mp3tag.de, community.mp3tag.de)。写入后可继续走“方案一”流程。

方案三:音频指纹识别 + 歌词数据库

当文件名或标签缺失时,可先通过指纹算法确定曲目,再拉取歌词。

ACRCloud

上传 15 秒指纹即可返回 Track ID、艺人、标题以及同步歌词(若版权方已提供)(docs.acrcloud.com)。

AudD

AudD API 同样在一次调用内回传歌词,首 300 次请求免费,非常适合个人脚本(audd.io)。

调用示例(精简版):

import requests, base64, subprocess, json, pathlib
def fingerprint(file):
    wav = pathlib.Path(file).with_suffix(".wav")
    subprocess.run(["ffmpeg","-y","-i",file,"-t","15",wav],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)
    data = open(wav,'rb').read()
    payload = {"api_token":"YOUR_TOKEN","audio":base64.b64encode(data)}
    return requests.post("https://api.audd.io/",data=payload).json()

ffmpeg 抽取片段再上传即可;AudD 会返回 lyrics 字段和可选的 sync_lyrics 段落。

方案四:利用 ASR 自动生成并对齐歌词

Whisper 语音识别

OpenAI Whisper 的large-v3模型在流行音乐上可达到低于 7% 的词错率;Medium 上关于提取 mp3 歌词的教程展示了两种调用方式(本地和 API)(medium.com)。

强制对齐生成 lrc

Whisper 只能输出段落级时间,需要进一步对齐到行或词。可选工具:

  • Gentle:GitHub 上的开源 Forced Aligner,在 Docker 中即可运行,支持生成带时间戳 JSON,再转 lrc(github.com, textwork.commons.gc.cuny.edu)。

  • aeneas:Python/C 库,输入文本与音频自动输出 SMIL/lrc 等格式(readbeyond.it)。

  • Reddit speechtech 频道也推荐 Gentle 处理不完整歌词时的稳健性(reddit.com)。

示例脚本(Whisper + Gentle 简易管线):

# 1\. whisper transcribe
whisper song.mp3 --model large-v3 --task transcribe --language en --output_format txt
# 2\. gentle align
docker run -v $PWD:/data lowerquality/gentle \
    python3 align.py song.mp3 song.txt > aligned.json
# 3\. json to lrc
python json2lrc.py aligned.json

方案五:桌面歌词工具辅助

如果你倾向鼠标操作而非写脚本,MiniLyrics 仍是经典选择。播放 mp3 时,它会自动匹配在线数据库(原站已转入支持 Leawo Music Recorder),并允许Lyrics → Save lyrics to mp3 file写入同步或非同步歌词(mediamonkey.com)。之后同样可以用 Mutagen 抽取或直接将生成的 .lrc 放进文件夹。

工作流整合建议

  1. 批量扫描 ID3:Mutagen 遍历目录,凡是含 USLT 且文本非空的曲目直接生成基础 lrc。

  2. 指纹识曲:对无歌词的文件,用 ACRCloud 或 AudD 获取同步词;若 API 未返回时间轴,可退而求其次写入 USLT 再走 ASR 对齐。

  3. ASR 自主生成:乐队现场版、稀有翻唱等数据库缺失场景,以 Whisper + Gentle / aeneas 强制对齐为主。

  4. 人工校审:商业接口或自动对齐均可能出现拼写或延迟误差,建议将 lrc 导入 Aegisub 等字幕编辑器微调帧点。

常见问题与质量控制

  • 音乐裁剪引发错位:某些发行渠道会在曲首插入数秒静音,指纹识别不会受影响,但现成 lrc 的时间轴会整体偏移。可用lrc-tools shift 3.5批量校正秒数。

  • 多语言歌曲:ID3 USLT 支持三字母语言标记;Whisper 可自动检测语种,但 Gentle 字典需自行扩展,否则外语段落会被标记not-found

  • 版权与合规:Lyrics API 若未包含同步数据,请遵守站点条款,不要擅自发布。LyricFind、Musixmatch 均提供正版授权渠道,可在前期评估成本。

结束语

通过解析内嵌标签、调动公共与商业歌词接口、结合指纹识别与 ASR,对单曲和大批量曲库都能找到最合适的生成路径。结合脚本自动化与桌面工具,你可以在数分钟内为整个音乐收藏补齐高精度 lrc,并为移动端或镭射投影卡拉 OK 提供即开即用的滚动歌词体验。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐