倒字检测器(Tone Check)
这是本库唯一一个不需要任何教材就能建、且立刻产生客观判据的东西。 声调表和旋律走向都是确定的数据。 它在本库的地位,相当于音频线里的 tempo——而 tempo 恰好是库一唯一校准成功的那一项。
按任务读哪几节
| 任务 | 读 |
|---|---|
| 倒字是什么 | §1 |
| 怎么跑 | §3 |
| 结果怎么读 | §4 |
| 这个数能不能当判决 | ★ §5 三条边界(必读) |
| 标出风险了怎么改 | ★ §6 五种改法 |
| 粤语 | §7(★ 协音不是这个工具) |
边界
| 不归这里 | 归哪 |
|---|---|
| 十三辙、平仄、中文韵表 | lw-mandarin |
| 粤语协音 | ★ lw-cantonese(约束更严、且写作顺序反转) |
| 押韵 | lw-rhyme |
| 字怎么安到音上(每句几个字) | lw-workflow §2 的 S2 + lw-structure |
| 旋律本身怎么改 | 库一 mc-melody |
| 那些字该怎么唱(气声/力度/修音) | 库一 mc-vocal-direction |
1. 倒字是什么
唱出来听成别的字。
普通话每个字有调型。旋律在字与字之间的走向如果和调的高低关系相反, 听感上字就变了——"深爱"(shēn ài) 唱成"神爱"(shén ài)。
★ 戏曲里这叫「依字行腔」,是同一个问题的老版本—— 编剧库的戏曲层有现成的表,可以直接跨库引用。
2. ★ 正确的模型(第一版错在哪)
判的是「进入某个字的音程」vs「那个字自身的调型」, 不是「前字终点 vs 后字起点」的相对高度。
contour = TONE_PITCH[t][1] - TONE_PITCH[t][0] # 本字调型:+升 −降 0平
incoming = notes[i] - notes[i - 1] # 进入本字的音程(半音)
2.1 为什么第一版是错的
第一版按相对高度判,结果漏掉了教科书上最经典的例子: "深爱→神爱" 算出来的期望是 +0,永远不会被标记。
原因是流行歌一字一音是常态,字内没有调型可言—— 这时候听者是从进入这个字的旋律走向去推断它的调的。 上行进入"深"(阴平,平调),就听成了阳平 = 神。
★ 这个教训值得记住: 当一个检测器测不出教科书上的标准案例时,先怀疑模型,不要怀疑案例。
2.2 五个调与它们的约束
赵元任五度标调,取每个调的起点与终点:
| 调 | 五度值 | 调型 | ★ 约束 |
|---|---|---|---|
| 阴平 1 | 55 | 平 | 进入它不该有大跳(大跳会把平调听出走向) |
| 阳平 2 | 35 | 升 | ★ 不该下行进入 |
| 上声 3 | 21 | 降 | 不该上行进入(连读半上;全上 214 只在单念和句末) |
| 去声 4 | 51 | 降 | ★ 不该上行进入 |
| 轻声 5 | ~3 | 平 | 同阴平,但权重减半(本来就轻、短、易被吞) |
★★ 这正是老话说的"阳平字别配下行、去声字别配上行"。
2.3 ★ 没有检测器时怎么手判
只查三类位置(它们是倒字最常发生的地方,约占全部字的 1/5):每段最高音的字、每句第一个字、大跳(≥5 半音)的落点字。 对每个字:查它的调(§2.2 表)→ 看进入它的旋律方向 → 阳平被下行进入、去声被上行进入、平调被 ≥3 半音大跳进入 → 标风险 → 念一遍。
3. 怎么判
把词和旋律并排写成两行(字 / 音高),按 §2.3 的三类位置逐字查,念一遍确认。
★ 查出风险之后先分从严从宽。薛範的八条里三条从严(黄志华《文字声律与粤语歌创作》附录 p0107):
- 与口语结合紧、语感强的作品从严:流行歌曲、说唱一类。这条几乎覆盖本库全部产出
- 主题句、高潮句、关键词、结尾句从严。这正是 §2.3 三类位置之外要加查的一档:位置不高、不跳,但它是 hook
- 前后紧挨的两个音音程大、呈上下行跳进的从严。与 §2.3 的"大跳落点字"同一条
落在这三条里的风险必改;其余五条从宽的情形在 lw-mandarin §3.6,落在那里的可以放过并记理由。
仓库内部有同模型的检测器脚本,不随包发布,用户不需要。
4. 结果怎么读
我深爱你 —— ★ 教科书例:上行大跳进入平调「深」→ 听成「神」
倒字率 33% (1/3 对相邻字有风险)
字 调型 进入 风险 说明
深 平 +7 0.47 ← 阴平是平调,7 度大跳会带出走向
爱 降 -2 0.00
你 降 -1 0.00
| 列 | 含义 |
|---|---|
| 调型 | 本字自己的调要求什么走向(升/降/平) |
| 进入 | 实际的旋律走向(半音) |
| 风险 | 0–1。跳得越大风险越高(`min( |
| 倒字率 | 有风险的相邻字对 / 总对数 |
三条计分规则:
- 升调被下行进入、降调被上行进入 → 风险 = 量级
- 平调被 ≥3 半音的跳进入 → 风险 = 量级 × 0.8
- 轻声 → 风险再 × 0.5
5. ★★ 三条边界:别把这个检测器当判官
这一节是本 skill 最重要的部分。
5.1 一字多音(拖腔)没处理
本工具假设一字一音。 一个字拖多个音时,字内轮廓本身就能承载调型,规则不同—— 多音的情况需要逐音符对齐信息,本方法给不出。
★ 后果:慢歌、抒情曲、戏曲风的段落,这个工具会误报。
5.2 不看语境消歧
"深爱"在"我深爱着你"里几乎不会听错,因为上下文锁死了词。 本工具只看声学层面的风险,不懂词。
★ 后果:常用搭配、成语、固定词组会被误报。
5.3 ★ 倒字风险 ≠ 错
长音、重音、清晰咬字都能救。 输出的是「风险」不是「判决」。
⚠ LYR-LINT 第 7 条只给出数值,不给"过/不过"。
→ 哪些风险可以放过,五条判据在 lw-mandarin §3.6;哪些必改,三条在本文 §3。
5.4 综合起来怎么用
★ 把它当成一支荧光笔,不是一个判官。 它告诉你"这几个字值得念一遍听听",念了没问题就放过。
自检动作:
- 跑检测器 → 得到高风险字的清单
- ★ 把那几句唱出来(或念出来)
- 真的听成别的字 → 改(§6);听不出来 → 在
checks.self_audit里记一句"已人工确认"
6. 标出风险了,五种改法
按代价从低到高:
| # | 改法 | 代价 |
|---|---|---|
| 1 | 换字 | 最低。同义词里找一个调型顺的 |
| 2 | 调整词序 | 低。把那个字挪到旋律走向合适的位置 |
| 3 | 给那个字加时值(拖长) | 中。★ 拖长之后字内可以自己走出调型,风险消失(见 §5.1) |
| 4 | 改旋律的那一跳 | 中高。★ 先曲后词时这是最后手段;先词后曲时它是正常选项 |
| 5 | 接受它 | ——但要在 checks.self_audit 里写明理由(如"这里刻意的错听是个双关") |
★ 第 1 条永远先试。 中文同义词极多,换个字通常就解决了, 而改旋律会牵动库一的一大堆东西。
★★ 第 5 条不是偷懒:真实的流行歌里有大量"技术上倒字但听起来没问题"的地方 (见 §5.2、§5.3)。关键是你知道它在那儿,而不是没检查。
7. 粤语:不是这个工具
★ 粤语的协音是另一回事,严得多。
| 普通话倒字 | 粤语协音 | |
|---|---|---|
| 声调数 | 4(+轻声) | 9 |
| 约束强度 | 风险(可救) | ★ 硬约束(违了就是错字) |
| 写作顺序 | 词曲都可以先 | ★ 旋律先定,每个位置只剩几个字可选 |
| 判法 | §2.3 手判 | 见 lw-cantonese |
→ lw-cantonese。不要用普通话那套顶替。
8. 与 LYR-SPEC 的字段对应
| 字段 | 本 skill |
|---|---|
prosody.sections[].peak_syllable |
★ 最高音落在哪个字——那个字的倒字风险要单独看 |
prosody.sections[].melody_contour |
检测器的输入 |
checks.computed.daozi_rate |
检测器的输出 |
checks.self_audit |
★ §5.4 第 3 步、§6 第 5 条的人工确认写这里 |
9. 用完必过
- 跑过检测器,拿到了数值
- ★ 高风险的几句实际唱/念过一遍,不是只看数字
- 人工确认没问题的,在
self_audit里记了一句 - 要改的,先试换字,最后才动旋律
- 一字多音的段落,知道检测器在那儿会误报
- 常用搭配被标红时,没有为了数字好看去改一个本来没问题的词
- ★ 粤语没有用这个工具顶替
附:来源
- 仓库内部有同模型的检测器脚本(不随插件发布)
- 一个可调的标定参数:
semitone_per_degree = 2.0(把五度调值折算成半音的系数,"调值差 1 度 ≈ 2 个半音的听感期望") - ⚠ 本方法不处理一字多音;粤语协音(§7)没有对应判法
- 跨库引用:编剧库戏曲层的依字行腔与十三辙表——同一个问题的老版本