LYR-SPEC v1.0 —《词稿规格单》规范
本库唯一的交接物。一物四用:对外交接、AB 测试对象、编译源(→Suno/YuE2)、验收基准。 与库一的
ARR-SPEC双向耦合(这是本库的结构特点,库一对下游是单向的)。配套:
LYR-SPEC.template.yaml、example-*.yaml。写完按 §2 十条自查;中文按lw-tone-check§2.3 手判倒字。
0. 使用纪律
- ★
intent五项不填齐,不许写第一句词。 这是本库唯一的硬门禁。 - 写完逐条过十条自查(§2),不过的条目改掉或写明理由再交。这些是判据不是铁律。
- 中文词按
lw-tone-check§2.3 手判倒字,并人工念一遍高风险处。 - ★ 先词后曲时,旋律回来之后必须重跑倒字/协音检查——这一步最常被漏。
- 交稿前过
lw-ai-tell-audit的八条。
1. 字段规范
1.1 meta
| 字段 | 必填 | 说明 |
|---|---|---|
spec_version |
✅ | "1.0" |
title |
✅ | |
language |
✅ | 普通话 / 粤语 / 英文 / 日文 / 韩文。★ 决定读哪个 L2 skill |
flow |
✅ | 先曲后词 / 先词后曲。★ 本库的第一个岔路口,两条路的阶段表完全不同 |
style_layer |
○ | L3 skill id,如 lw-chinese-style;无则 none |
arr_spec |
○ | 配套 ARR-SPEC 的路径。★ 有的话,§1.3 的六个字段必须一致 |
1.2 intent —— 动笔前必填(★ 门禁)
| 字段 | 必填 | 说明 |
|---|---|---|
plot_type |
✅ | ★ 先答。这首歌是哪一类,封闭集合:attitudinal 态度型 / situational 情境型 / narrative 叙事型 / expository 说理型。默认不是 narrative,大多数流行歌是前两类。它定人称、声音与重复预算,见 lw-song-intent §1.1–1.3 |
one_thing |
✅ | 这首歌只说一件事。一句话,不许两句,不许"既…又…"。★ 念出来要像一句人话,不是主题词 |
to_whom |
✅ | 对谁说。★ "抒情"和"听众"不是对象——要一个能想象出脸的对象 |
at_what_moment |
✅ | 在哪个时刻说。★ 时间点,不是时间段 |
anchor_object |
✅ | 一个贯穿全曲的、能拍照的物件。★ 判据:说得出它的颜色、大小、新旧 |
anchor_phrase |
○ | 锚也可以是一句话:态度型/说理型常常没有物件,贯穿全曲的是一句直接对「你」说的话(请求、决定、质问、宣言),副歌反复它。填了它,态度型/说理型的 anchor_object 可以写「无」。语料:国语态度型四成没有贯穿物件,这一组破题句 41% 是独白、口语占 82% |
为什么设门禁:AI 写的词不是"用词不好",是没有人做过选择—— 它写出来的四段可以属于任何一首歌。这四项就是强迫做选择的地方。 详见
lw-song-intent。
1.3 prosody —— 词与旋律的咬合
先曲后词时来自 ARR-SPEC;先词后曲时由本表输出、反向约束 ARR-SPEC。
★ syllables 的填法:词写完之后,对着 lyrics[].lines 逐行数汉字再填,不要先定字数再凑词。只数汉字,标点与整行括号的 ad-lib 不算。这一项是历次测试里最稳定的差一个字的地方,所以顺序要反过来:先有词,后有数。
prosody:
sections:
- id: C1 # ★ 必须与 ARR-SPEC.form[].id 一一对应
syllables: [9, 9, 7, 11] # 每句音节/字数。★ 一个元素 = 词稿里的一行
stress_positions: # 英文:重音位置;中文:旋律强拍落在第几字
peak_syllable: # ★ 全段最高音落在哪个字——这个字必须经得起唱
melody_contour: "5→3 下行"
notes: [67, 69, 67, 64] # ○ MIDI 音高序列,给 倒字判定 用★ 与库一必须一致的六个字段:
form[].id / form[].bars / form[].name / meta.tempo / meta.key / vocal.persona
任何一边改了,另一边必须同步。
1.4 rhyme
| 字段 | 必填 | 说明 |
|---|---|---|
scheme |
✅ | 韵式,如 AABA |
che |
✅ | 辙口(普通话十三辙 / 粤语韵部)。写成列表;推荐逐段写,每项 {section, 辙, 宽窄, 韵脚},也接受只写辙名的字符串列表。受第 8 条自查约束:不许全曲只用一两个宽辙 |
deliberate_breaks |
✅ | ★ 哪几处故意不押——全押到底是 AI 味。空数组视为未填 |
surprise_notes |
○ | 哪个韵脚是"意外又觉得对"的。受 lint 第 9 条约束 |
1.5 imagery
| 字段 | 必填 | 说明 |
|---|---|---|
concrete_nouns |
✅ | ★ 能拍照的具体物件清单。受 lint 第 2 条约束 |
system |
✅ | ★ 这些物件构成什么系统——不是随机堆意象。空着意味着它们只是装饰 |
forbidden |
✅ | 本首禁用的抽象词(时光/远方/梦/自由/青春/思念…)。受 lint 第 2 条约束:零出现 |
1.6 narrative
| 字段 | 必填 | 说明 |
|---|---|---|
pov |
✅ | 人称与视角。受 lint 第 6 条约束 |
tense_anchor |
✅ | 时间锚点。★ 由 intent.at_what_moment 决定 |
withholding |
✅ | ★ 该说的地方不说的那一处在哪。受 lint 第 5 条约束。AI 会把情绪走完整,真人经常停在难受里 |
1.7 asymmetry —— ★ 专门一节:刻意的不对称
| 字段 | 说明 |
|---|---|
short_line |
哪一行故意短 |
unrhymed |
哪一段故意不押 |
chorus_variation |
末遍副歌改了哪一到三个字,落在热点位。★ 前两遍逐字相同是常态,不是缺陷 |
repetition_budget |
★ 副歌重复几遍、主歌靠什么推进(新事件 / 再看一眼 / 拉远镜头)。副歌占全曲三到六成(人工分段 72 首中位 0.44),先定副歌几行几遍再算主歌剩几行;主歌之间也要有复用。不同行占比超过 0.85 先怀疑这一项没花。见 lw-structure §6.0 |
受 lint 第 3、4、10 条约束:三项至少填两项;各段字数不许完全相同;副歌各遍文本不许完全相同。
★ 每一处不对称都要说得出理由。 为了破坏而破坏,和整齐一样机械。
1.8 lyrics —— 词本身
lyrics:
- section: C1
lines:
- "第一行"
- "第二行"★ 分行不是排版,是指令——后端会把换行当成乐句边界读。
分行必须与 prosody.sections[].syllables 一致。详见 lw-suno-interface §3。
★ section 必须等于 ARR-SPEC form[].id(C1、A2 这种 id,不是 Chorus 这种名字)。两张规格单靠这一列咬合:编曲侧的 MusicXML 领奏谱、ChordPro 和 ABC 的 w: 行都从这里取词,按 form[].id 找到该段的小节,再按"每个音符一个音节"逐字贴上去,中文一字一音节。Suno 的段落标签由 ARR-SPEC 的 form[].name 派生,这里不重复存。
★★ 词里不许有任何注释/创作说明——后端会把它唱出来。注释写 note 字段。
1.9 render
render:
suno: {format_notes: ""} # 段落标签由 ARR-SPEC form[].name 派生,不在这里手填
yue: {}★ 段落标签序列由库一的 mc-render-compile 统一编译;这里只放词这一侧的格式说明。
1.10 checks
checks:
computed: {} # 倒字率、协音违例、韵脚意外度…(脚本填)
self_audit: [] # 人工逐条打勾
exemptions: [] # ★ 豁免必须写理由,不许静默跳过人工项固定这几条:
-
one_thing念出来是一句人话,不是主题词 -
anchor_object说得出颜色、大小、新旧 - 去掉标题和专名,别人能说出这首歌讲的是哪一件具体的事
- 每一处不对称说得出理由
- 中文:倒字高风险处实际唱/念过,确认无误
2. LYR-LINT 十条
人工逐条过;仓库内部有同名脚本做同样的检查,不随包发布。不过 = 改或写理由,不是禁止交付。
| # | 检查 | 对抗的 AI 味 | 可算 |
|---|---|---|---|
| 1 | intent 五项非空,anchor_object 是能拍照的实物,或态度型/说理型用 anchor_phrase 代替 |
没做过选择 | 半 |
| 2 | 每段至少 N 个具体名词;forbidden 抽象词零出现 |
名词全是抽象的 | ✅ |
| 3 | 各段字数不许完全相同 | 结构对称到死 | ✅ |
| 4 | asymmetry 三项至少填两项 |
同上 | ✅ |
| 5 | narrative.withholding 非空 |
什么都解决了 | 半 |
| 6 | pov + tense_anchor 非空 |
没有视角和时间 | ✅ |
| 7 | 倒字率 ≤ 阈值(普通话)/协音违例 = 0(粤语) | 倒字不管 | ✅ |
| 8 | 辙口不许全曲只用一两个宽辙 | 只挑最顺的辙 | ✅ |
| 9 | 韵脚意外度:不许全是最高频韵字 | 押韵选第一个想到的 | ✅ |
| 10 | 副歌各遍文本不许完全相同 | 原样重复三遍 | ✅ |
2.1 ⚠ 哪些条能判过/不过
第 2、7、8、9 条只报数,不判过/不过:
| 条 | 状态 |
|---|---|
| 1、3、4、5、6、10 | ✅ 可判过/不过(结构性检查,不需要阈值) |
| 2 | ⚠ forbidden 零出现可判;"每段至少 N 个具体名词"的 N 待定 |
| 7 | ⚠ 只能给数值(详见 lw-tone-check §5) |
| 8、9 | ⚠ 只能给数值,需要辙口表与韵脚词频表 |
3. 与 ARR-SPEC 的双向接口
先曲后词:ARR-SPEC.form + 旋律符割り ──→ LYR-SPEC 的 prosody 约束
先词后曲:LYR-SPEC 的字数句式 ──→ 反向约束 ARR-SPEC.form[].bars| 方向 | 传什么 |
|---|---|
| ARR → LYR | form[].id/name/bars、energy_curve(情绪弧)、每句音节数、重音位置、最高音落在哪个字 |
| LYR → ARR | 各段字数句式 → 反推 form[].bars;★ 字调轮廓 → 旋律的约束(避免先词后曲时事后发现倒字) |
★ 共享字段(改一边必须同步另一边):
form[].id / form[].bars / form[].name / meta.tempo / meta.key / vocal.persona
★ 与导出格式的接口:
| 去向 | 从 LYR-SPEC 取什么 | 怎么落 |
|---|---|---|
| MusicXML 领奏谱 | lyrics[].lines、meta 里的词作者 |
每个音符一个 lyric,syllabic=single;creator lyricist |
| ChordPro | lyrics[].lines |
歌词行,和弦来自 ARR-SPEC harmony_letters |
| ABC(YuE2) | lyrics[].lines |
w: 行,字数与该行音符数相等 |
| LRC 等时间戳歌词 | 不从这里出 | 生成后由音频或 MIDI 的时间推 |
| 倒字校验 | lyrics[].lines + prosody |
★ 输入是旋律的实际音高(ABC 或 MusicXML)加歌词文本;只有文字描述的轮廓时按 lw-tone-check §2.3 手判,有谱时按谱判 |
intent、imagery、narrative、rhyme、asymmetry 是仅意图的块,行业里没有格式存它们,导出时整块作为文本随文件走。
4. 为什么是这些字段
直接对着「AI 直接写的词为什么一耳朵能听出来」清单来的:
| AI 味症状 | 对抗项 | 可算 |
|---|---|---|
| 名词全是抽象的 | imagery.concrete_nouns + forbidden |
✅ |
| 结构对称到死 | asymmetry 三项 |
✅ |
| 什么都解决了 | narrative.withholding |
⚠ |
| 没有视角和时间 | narrative.pov + tense_anchor |
⚠ |
| 倒字不管 | prosody + 检测器 |
✅ 完全可算 |
| 辙口只挑最顺的 | rhyme.che |
✅ |
| 押韵选第一个想到的 | rhyme.surprise_notes |
✅ |
| 副歌三遍全同且末遍没有一处改动 | asymmetry.chorus_variation |
✅ |
★ 八条里六条可算。 比库一(十四条里九条)的比例更硬,因为文本不需要检测。