把歌词做成「唱一句出一句、唱完即清」的时间轴。
核心不是猜 LRC 偏移,而是:
demucs抽出人声- 在人声上找起唱点
- 按起唱点数量自动选路,把歌词行挂上去
- 输出卡拉 OK 式 ASS:
start = 该句起唱,end = 下一句起唱
这是从十几部歌词视频里踩出来的对齐器,不是整条成片流水线。不管画面生成,不管人物变形。
- 要把一首歌做成歌词视频,字幕必须跟人声走
- 以前用手猜 offset / LRC 绝对时刻,前半段或副歌会漂
- 想从已经烧录字幕的视频里反推时间轴(见
SKILL.md)
不适合:
- 想一键出风景成片
- 要求零听感误差、完全不需要人工听一遍
pip install -r requirements.txt人声分离另装 demucs:
pip install demucs需要本机有 ffmpeg。
先准备两样东西:
vocals.wav:demucs -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.mp4ASS 只用淡入淡出和柔光,禁止缩放旋转动画。最后一句和长间奏只留 6 秒,尾奏无字。
先出深色背景验证版,听前两分钟和副歌。过了再去生成风景画面。画面坏了只重渲那一段,字幕坏了只重烧录。
更完整的坑和反向学习方法见 SKILL.md。
MIT