# Lw Tone Check

> The tone-melody conflict detector and how to read it (倒字检测器). The one objective, computable criterion this library has - Mandarin dao-zi, where a syllable is heard as a different word because the melody enters it against its tone contour. Covers the correct model (incoming interval versus the syllable's own contour, not previous-end versus next-start), how to run it, how to read a risk score, the three boundaries that make it a risk indicator rather than a verdict, and the five ways to fix a flagged syllable. Use when fitting Mandarin words to a melody, when a sung line is misheard as different words, when checking a draft before delivery, or when a melody must be adjusted to fit words already written. 倒字、依字行腔、字调、声调、检测器、唱出来听成了别的字、唱成别的字、字唱错了、tone_check。

- Skill: `jtydhr88/lw-tone-check` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jtydhr88/lw-tone-check`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jtydhr88/lw-tone-check/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: jtydhr88 (https://skillmd.com/u/jtydhr88)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/jtydhr88/lw-tone-check

---


# 倒字检测器（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 后字起点」的相对高度。

```python
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）：

1. **与口语结合紧、语感强的作品从严**：流行歌曲、说唱一类。这条几乎覆盖本库全部产出
2. **主题句、高潮句、关键词、结尾句从严**。这正是 §2.3 三类位置之外要加查的一档：位置不高、不跳，但它是 hook
3. **前后紧挨的两个音音程大、呈上下行跳进的从严**。与 §2.3 的"大跳落点字"同一条

落在这三条里的风险**必改**；其余五条从宽的情形在 `lw-mandarin` §3.6，落在那里的可以放过并记理由。
仓库内部有同模型的检测器脚本，**不随包发布，用户不需要**。

---

## 4. 结果怎么读

```
我深爱你   —— ★ 教科书例：上行大跳进入平调「深」→ 听成「神」
  倒字率 33%  （1/3 对相邻字有风险）
  字      调型    进入    风险   说明
  深       平    +7  0.47 ← 阴平是平调，7 度大跳会带出走向
  爱       降    -2  0.00
  你       降    -1  0.00
```

| 列 | 含义 |
|---|---|
| **调型** | 本字自己的调要求什么走向（升/降/平） |
| **进入** | 实际的旋律走向（半音） |
| **风险** | 0–1。**跳得越大风险越高**（`min(|interval|, 12) / 12`） |
| **倒字率** | 有风险的相邻字对 / 总对数 |

**三条计分规则**：
- 升调被下行进入、降调被上行进入 → 风险 = 量级
- **平调被 ≥3 半音的跳进入** → 风险 = 量级 × 0.8
- **轻声** → 风险再 × 0.5

---

## 5. ★★ 三条边界：别把这个检测器当判官

**这一节是本 skill 最重要的部分。**

### 5.1 一字多音（拖腔）没处理

**本工具假设一字一音。**
一个字拖多个音时，**字内轮廓本身就能承载调型，规则不同**——
多音的情况需要逐音符对齐信息，本方法给不出。

★ **后果**：慢歌、抒情曲、戏曲风的段落，**这个工具会误报**。

### 5.2 不看语境消歧

> **"深爱"在"我深爱着你"里几乎不会听错，因为上下文锁死了词。**
> **本工具只看声学层面的风险，不懂词。**

★ **后果**：常用搭配、成语、固定词组会被误报。

### 5.3 ★ 倒字风险 ≠ 错

> **长音、重音、清晰咬字都能救。**
> **输出的是「风险」不是「判决」。**

⚠ **LYR-LINT 第 7 条只给出数值，不给"过/不过"。**

→ 哪些风险可以放过，五条判据在 `lw-mandarin` §3.6；哪些必改，三条在本文 §3。

### 5.4 综合起来怎么用

> ★ **把它当成一支荧光笔，不是一个判官。**
> 它告诉你"这几个字值得念一遍听听"，**念了没问题就放过**。

**自检动作**：
1. 跑检测器 → 得到高风险字的清单
2. ★ **把那几句唱出来**（或念出来）
3. 真的听成别的字 → 改（§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）没有对应判法
- **跨库引用**：编剧库戏曲层的**依字行腔**与**十三辙**表——同一个问题的老版本

