163MusicLyrics:批量获取与处理音乐歌词的跨平台工具
【免费下载链接】163MusicLyrics云音乐歌词获取处理工具【网易云、QQ音乐】项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics
163MusicLyrics 是一款跨平台桌面应用,能从网易云音乐、QQ 音乐批量拉取 LRC 歌词。它支持按单曲、专辑、歌单模糊搜索,LRC ↔ SRT 格式互转,以及逐字歌词。适合需要批量建立本地歌词库的音乐爱好者和字幕编辑。
贴一个链接拿到歌词文件:最短使用路径
主界面就是一个长输入框。粘入歌曲页链接、纯数字 ID,或者用逗号分隔的多个 ID,点搜索后,窗口会展示歌曲元信息、完整歌词预览,以及试听直链的播放条。
以粘入一条 QQ 音乐歌曲页链接为例,返回的内容包括歌曲元数据、原文歌词和罗马音译写,底部还会提示"命中本地缓存",说明这次没有再向平台发起请求。
如果你只记得歌名的一部分,勾上"模糊"选项。会弹出一个结果列表,每行是歌曲名、歌手、专辑、时长、平台,勾选后一次保存多首。
批量模式:扫整个目录或贴一批链接
点右上角"下载管理",可以粘贴一批链接,也可以点"本地扫描"直接指定音频文件所在目录。工具会把文件名当作歌曲 ID 逐条查询,表格给出每首歌的状态:Ready、歌词未收录或查询失败。勾选要保存的歌,点"保存选中"即可导出。
统一接口加缓存装饰:两个平台是怎么被包住的
两个平台的数据结构差别不小:网易云用数字 ID,QQ 音乐有内部 ID 和 mid 两套编号;错误码也各说各话,网易云返回 20001 代表需要登录,QQ 音乐则是 0 表示成功。项目把这些差异都收进了一个IMusicApi接口:
public interface IMusicApi { SearchSourceEnum Source(); ResultVo<PlaylistVo> GetPlaylistVo(string playlistId); // 歌单 ResultVo<AlbumVo> GetAlbumVo(string albumId); // 专辑 Dictionary<string, ResultVo<SongVo>> GetSongVo(string[] songIds); ResultVo<string> GetSongLink(string songId); // 试听直链 ResultVo<LyricVo> GetLyricVo(string id, string displayId, bool isVerbatim); ResultVo<SearchResultVo> Search(string keyword, SearchTypeEnum searchType); }NetEaseMusicApi和QQMusicApi是两个独立实现,把各自特有的字段翻译成统一的SongVo、LyricVo。上层的SearchService按来源枚举取到对应实现,全程不关心具体平台。
第二层包装是MusicCacheableApi基类。两个实现类的方法最终都走一遍缓存:
public ResultVo<T> Process<T>(object keyPrefix, CacheType cacheType, string key, Func<ResultVo<T>> cacheFunc) { var cache = Query<T>(keyPrefix, cacheType, key); if (cache != null) return new ResultVo<T>(cache); var res = cacheFunc.Invoke(); if (res.IsSuccess()) DoCache(keyPrefix, cacheType, key, res.Data); return res; }几个值得注意的细节。只有成功结果才入缓存,失败会原样抛回,下次还会重试。批量查询时BatchQuery先逐条走缓存,把未命中的 ID 挑出来才真正发请求,网络调用量随批次下降。内存缓存之上还有一层磁盘缓存LocalSongCacheService,查过的歌词落盘保存,重启程序后重查同一首歌不再走网络。
QQ 音乐的歌词头部还带着[offset:0]、[kana:]这类额外标记,解析阶段会先把它们清掉,再进入时间戳切分。
翻译歌词对不上毫秒怎么办
多语言歌词最麻烦的是对齐。原文和译文是两股独立的 LRC 流,时间戳不一定毫秒级吻合。LyricUtils的处理分三步:先按时间戳精确配对;对没配上的译文行,在可配置的精度误差窗口内重新查找并改写时间戳;仍然缺的译文行按缺失规则处理——丢弃、用原文补、或留空行。
不做这一步的话,两股歌词只能硬叠在一起。译文行会比原文提前或滞后几秒,交错模式下同一句的原文和译文互相跳位,文件基本没法用。
对齐完成之后,原文和译文才敢安全合并进同一个文件。输出组合有三种:
| 组合模式 | 效果 |
|---|---|
| 交错 | 原文与译文按时间顺序交替穿插 |
| 合并 | 同一时间戳的行拼成一行,中间加分隔符 |
| 独立 | 每种语言的歌词各存一个文件 |
语言判断也不靠平台声明。代码用 NTextCat 逐行识别语言后投票,再决定是否要调翻译。开启翻译能力后,会依次尝试彩云小译、百度翻译的接口;中文歌词还可以输出成拼音,由 py4n 库提供。
用这个工具要付出的代价
工具能力建立在两个平台的公开网页接口上,代价很明确:
- 两个平台都需要你粘贴自己的登录态 Cookie,部分内容不登录查不到,Cookie 过期后相关查询会直接失败。
- 翻译功能依赖彩云小译或百度翻译的密钥,需要自己去申请,不配就只能拿平台自带的原文、译文和罗马音。
- 只支持网易云音乐和 QQ 音乐两家,接入新平台要完整实现一套
IMusicApi。 - 取到的"歌曲链接"是试听级音源,不是高清音频。
- 接口逆向自网页端而非官方 SDK,平台改字段时对应实现类要跟着修,没有契约保证。
另外有个事实要心里有数:这是个人维护的开源项目,老 WinForms 版本已归档在 archive-winform,现在维护的代码在 cross-platform 目录。
延伸:还能找到什么
- 想自己跑源码:
git clone https://gitcode.com/GitHub_Trending/16/163MusicLyrics,构建入口是 cross-platform/MusicLyricApp。 - LRC ↔ SRT 转换是独立功能,主菜单"格式转换"入口可单独使用,字幕编辑场景直接可用。
- 逐字歌词模式由 VerbatimLyricUtils 处理,分别解析两家平台私有的时间戳格式。
- 批量扫描、模糊搜索两条路径的代码都在 SearchService,读这一处就能看懂查询主流程。
【免费下载链接】163MusicLyrics云音乐歌词获取处理工具【网易云、QQ音乐】项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考