Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lyric-subtitle-align

把歌词做成「唱一句出一句、唱完即清」的时间轴。

核心不是猜 LRC 偏移,而是:

  1. demucs 抽出人声
  2. 在人声上找起唱点
  3. 按起唱点数量自动选路,把歌词行挂上去
  4. 输出卡拉 OK 式 ASS:start = 该句起唱end = 下一句起唱

这是从十几部歌词视频里踩出来的对齐器,不是整条成片流水线。不管画面生成,不管人物变形。

适用

  • 要把一首歌做成歌词视频,字幕必须跟人声走
  • 以前用手猜 offset / LRC 绝对时刻,前半段或副歌会漂
  • 想从已经烧录字幕的视频里反推时间轴(见 SKILL.md

不适合:

  • 想一键出风景成片
  • 要求零听感误差、完全不需要人工听一遍

安装

pip install -r requirements.txt

人声分离另装 demucs

pip install demucs

需要本机有 ffmpeg。

用法

先准备两样东西:

  • vocals.wavdemucs -n htdemucs song.mp3 抽出来的人声
  • lyrics_raw.txt:每行 秒<TAB>文本,删空行、重复行、词曲作者信息

然后:

python scripts/align_auto.py \
  --vocals vocals.wav \
  --lyrics lyrics_raw.txt \
  --out-dir out \
  --trim 0 \
  --duration 301 \
  --gap-long 10

输出:

文件 内容
events.json 逐行起止、来源、相对 LRC 偏差
lyrics.ass 极简卡拉 OK 字幕
report.json 走了哪条路、起唱点数、偏差统计

常用参数:

  • --trim:裁掉的前奏秒数,时间轴整体减这么多
  • --duration:原曲时长;不填就用人声文件时长
  • --gap-long:超过这个间隔视为长间奏,字幕只留 6 秒后清屏
  • --force-route {sparse,balanced,dense}:强制路线,默认自动选

自动分流

路线 何时走 做法
dense 起唱点远多于歌词行,或重复副歌容易错吸 信官方 LRC,人声只做 ±1.2s 校正
balanced 数量接近 单调吸附 + 漏检行插值
sparse 起唱点明显少于歌词行 同 balanced,漏检更多时靠插值

回测:

  • 《朋友的酒(DJ版)》:dense,偏差均值 0.19s
  • 《平凡之路》:balanced(56 对 56),41 个真起唱点 + 15 行插值

烧录字幕

Windows 上不要给 ffmpeg subtitles 滤镜写 C: 绝对路径,盘符冒号会被当成选项分隔符。先 cd 进 ass 所在目录:

ffmpeg -y -f lavfi -i color=c=0x0c1020:s=1920x1080:r=25 -i song.mp3 \
  -vf subtitles=lyrics.ass \
  -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest out.mp4

ASS 只用淡入淡出和柔光,禁止缩放旋转动画。最后一句和长间奏只留 6 秒,尾奏无字。

建议工作流

先出深色背景验证版,听前两分钟和副歌。过了再去生成风景画面。画面坏了只重渲那一段,字幕坏了只重烧录。

更完整的坑和反向学习方法见 SKILL.md

License

MIT

About

歌词字幕对齐命令行工具:demucs 起唱点提取 + 带约束单调动态规划,中位偏差 0.00s(人工校验真值对照)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages