歌曲歌词转写
把一首歌变成带时间轴的歌词文本和播放器可用的 LRC。全本地推理,音频不出本机。
产出
<曲名>-歌词.txt:按主歌/副歌/桥段分段,每行带[mm:ss.xx]时间点。<曲名>.lrc:同内容标准 LRC,播放器可直接滚动。
歌词是受版权保护的作品:文件里给全文,对话里只贴两三行样例、说明结构和时长。
一次性安装
脚本都在本技能目录的 scripts/ 下,用 PowerShell 调用:
powershell -NoProfile -ExecutionPolicy Bypass -File "<技能目录>\scripts\setup.ps1"
- 默认把运行时装在
%USERPROFILE%\.dsh\asr(venv + 模型),可用-AsrHome <目录>换位置。 - 会从清华镜像装 faster-whisper,从 ModelScope 下
pengzhendong/faster-whisper-large-v3-turbo(1.51 GB)。国内直连 huggingface 只有 0.2–0.5 MB/s,hf-mirror 常 TLS 握手超时,别换源。 - 幂等:已有 venv 和
model.bin就跳过。 - 装完用
scripts\doctor.ps1体检,五行全[ok]即就绪;缺什么它会直接给出该跑的命令。
流程
prepare_audio.py解出 16 kHz 单声道 wav,并打印时长。transcribe.py --rounds 1:不切 VAD、词级时间戳、beam 10——文字以此为准。- 再跑一次
--rounds 1,2,round2 是 VAD 版,只用来判断人声起止和有没有整段漏掉。 - 读
rounds.json(结构化)/segments.txt(可读)。按,。!?把合并的段落拆成歌词行,行首时间取该句首字的words[].s。 levels.py看每秒响度,定位前奏、间奏、尾奏。- 拿不准的行用
probe.py截 4–6 秒片段复听比对。 build_outputs.py吃一个spec.json,输出 txt + LRC,再交给用户。
$env:PYTHONIOENCODING='utf-8'
$PY = "$env:USERPROFILE\.dsh\asr\venv\Scripts\python.exe"
& $PY "<技能目录>\scripts\prepare_audio.py" "<音频>" "<工作>\song.wav"
& $PY "<技能目录>\scripts\transcribe.py" "<工作>\song.wav" "<工作>\out" --rounds 1,2
& $PY "<技能目录>\scripts\probe.py" "<工作>\song.wav" "<工作>\probe_spec.json" "<工作>\probe_out.json"
& $PY "<技能目录>\scripts\build_outputs.py" "<工作>\spec.json" --out-dir "<输出目录>"
spec.json / probe_spec.json 的字段见对应脚本顶部注释。
判断规则
- 幻觉指纹:
字幕志愿者 XXX、作词 作曲 作曲 作曲…、优优独播剧场——YoYo Television Series、未经许可,不得翻唱或使用。出现在静音或纯器乐上,一律当"无人声",不能写进歌词。 - VAD 轮只取边界,不取文字:它会合并相邻句、吞句尾,例如把两行拼成"已经是你最近赶去了南边"。
- 分段粒度不固定:可能一句一段,也可能两三句一段。按标点拆句,不要照抄段落。
- 行首时间:用词级时间戳里该句首字的
s。第一段常出现0.00的幽灵起点(第一个词的s是 0、下一个词跨了十几秒),那是前奏,按实际起唱时间改。 - 重复段互证:副歌通常唱三遍,对齐后共同的措辞最可信;某遍异常(如"问那天谁更把承诺拆开"对"如果那天谁肯把沉默拆开")说明是误听,取多数。
- 同音字:用语义和搭配定夺。机器常给"一个万一步"(应为"一个误会一步")、"你在另一座成果的号码"(应为"你在另一座城拨过的号码")、"手脚的刻痕"(应为"墙角的刻痕")、"书和上了"(应为"书合上了")。照发音抄就是病句。
- prompt 会带偏:把整句候选答案放进
initial_prompt,模型会原样复读。每条片段至少留一条无 prompt("")的解码作参照,以它为主。 - 短片段幻觉:<4 秒极易出幻觉;片段前后各补 0.25 s 静音,必要时拉长到 5–6 秒。
- 器乐判定:多轮都只有幻觉、响度正常但无词、VAD 也没有语音段 → 直接告诉用户这是纯器乐,不要编歌词。
交付
把 txt 和 LRC 两份文件交给用户;回复里给结构(主歌/副歌/桥段各几行)、总时长、人声起止,以及 2–3 行开头样例;说明这是机器听写、同音字可能有偏差。若有推断改字,点名那一行让用户核对。
脚本
| 脚本 | 作用 |
|---|---|
scripts/doctor.ps1 |
只读体检:ffmpeg / venv / 模型是否就绪 |
scripts/setup.ps1 |
建 venv、装 faster-whisper、下模型(幂等) |
scripts/ms_download.py |
ModelScope 断点续传下载器 |
scripts/prepare_audio.py |
任意音视频 → 16 kHz 单声道 wav |
scripts/transcribe.py |
两轮转写,写 rounds.json / segments.txt |
scripts/probe.py |
疑点片段多 prompt 复听 |
scripts/levels.py |
每秒响度,判断前奏/间奏/尾奏 |
scripts/build_outputs.py |
spec → 歌词 txt + LRC |
环境要求与排错
Windows 10/11 + PowerShell 5.1+ + ffmpeg + Python 3.11/3.12,磁盘约 2.5 GB。常见问题(ensurepip 失败、Store 版 python 占位符、执行策略、控制台乱码、ffmpeg 路径、下载慢)见 references/troubleshooting.md。