本文解读 CMU "Subword Modeling" (Spring 2026) 第23讲:Syllables and Syllabification。
这节课介绍音节的内部结构、响度层级的形式化定义,以及基于响度的自动音节切分算法。音节是一个比音素更大、比词更小的语音单位,它在语音学规则中扮演核心角色,也跟形态学和 subword tokenization 有直接关联。
1. 什么是音节
几乎所有语言的语音都可以被分组为「音节 syllable」。音节是一段具有如下特征的语音序列:
- 有一个响度峰值
- 峰值之前响度持平或上升
- 峰值之后响度持平或下降
直觉上就是「一个发音脉冲」。你对着任何一个词拍手打节拍,每拍一下就是一个音节。母语者几乎不需要思考就能做到这一点。
1.1 音节的内部结构
音节的标准结构模型是这样的:
σ (音节)
/ \
onset rhyme
/ \
nucleus coda
以英语单词 "blast" /blæst/ 为例:
- onset 声母:/bl/,音节开头的辅音部分
- nucleus 核心:/æ/,音节的响度峰值,通常是元音
- coda 韵尾:/st/,核心之后的辅音部分
- rhyme 韵:nucleus + coda,即 /æst/
一个有趣的历史细节:这个结构最早是中国隋唐时期的音韵学家发明的,记录在《切韵》和《广韵》等韵书中。后来被美国语言学家 Charles Hockett 重新发现。Hockett 本人串联了这门课的很多主题:他是把形态学理论分成 IA、IP、WP 三派的人,也提出了最早的基于 HMM 的形态学概率模型,还曾与 Claude Shannon 短暂合作。
1.2 核心不一定是元音
大多数时候 nucleus 是元音,可以是单元音 monophthong 也可以是双元音 diphthong。但有时候辅音也可以充当 nucleus,比如英语 "indescribable" /ɪn.dəs.ˈkraj.bə.bl̩/ 最后一个音节的核心是成音节辅音 /l̩/。
2. 音节为什么重要
Mortensen 给了一系列证据,说明音节不是一个随意的分组方式,而是语音系统中的核心结构单元:
-
重音分配在音节上。 英语的重音落在特定的音节上,而不是特定的音素上。
-
韵律脚以音节为单位定义。 一个韵律脚通常是两到三个音节的组合,其中一个是重读的。
-
声调分配在音节上。 在很多声调语言中,每个音节承载一个声调。
-
某些音只能出现在特定的音节位置。 英语里 /ŋ/ 只能出现在 coda 位置:可以说 "mung" 但不能说 "ngum"。普通话里,除了 /n/ 和 /ŋ/ 之外的所有辅音都只能出现在 onset 位置,而 /ŋ/ 只能出现在 coda。
-
语音交替基于音节位置。 上节课讲的加泰罗尼亚语词尾清化,更准确地说是 coda 位置的清化。英语的送气规则也跟音节有关:onset 位置的塞音才可能送气,coda 位置的永远不送气。
-
在很多语言里,语素和音节高度重合。 所有现代中文变体都有这个特点:一个语素大致对应一个音节。很多其他语言里,语素边界也总是落在音节边界上。
最后一点对 subword modeling 特别重要。如果语素边界总是在音节边界上,那么一个「好的」tokenizer 切出来的 subword 理论上也应该尊重音节边界。切在音节中间的 token 大概率是没有语言学意义的碎片。
3. 响度:音节的物理基础
音节的核心概念是响度 sonority。定义上有点循环:响度就是一个音「有多适合做音节核心」。但它跟声学上的响亮程度高度相关。
Blevins 用发音特征把响度形式化为一个决策树。从高到低排列:
低元音 > 中元音 > 高元音 > 滑音 > 近音 > 鼻音 > 浊擦音 > 清擦音 > 浊塞音 > 清塞音
最左边的低元音响度最高,最适合做 nucleus;最右边的清塞音响度最低,只能出现在 onset 或 coda。
这个层级跟发音特征的对应关系很清晰:
-
+cons\] vs \[-cons\] 区分了辅音和元音/滑音
-
+cont\] vs \[-cont\] 在阻碍音内部区分了擦音和塞音
PanPhon 实现了这个决策树,可以自动计算任意音素的响度值。
4. 基于响度的自动音节切分
有了每个音素的响度值,就可以用算法自动做音节切分。Mortensen 介绍了一个实现在 syllabiphon 工具里的算法。
核心思路很简单:在响度序列中找到所有的峰值,然后在峰值之间的低谷处画音节边界。
具体步骤是:
- 把输入的音素序列转成响度值序列
- 找到所有响度值超过阈值 α 的位置,这些是潜在的 nucleus
- 在每两个相邻 nucleus 之间,找到响度从下降转为上升的位置,在那里画边界
- 处理边界情况:如果一个位置在第一个 nucleus 之前或最后一个 nucleus 之后,不画边界
这个算法的优势是完全不需要训练数据,也不需要针对特定语言做调整。只要有音素到响度值的映射,就能对任何语言做音节切分。代价是精度不如基于 HMM 等监督模型的方法。
5. 捣乱分子:/s/ 的特殊行为
响度层级有一个出了名的例外:英语的清擦音 /s/。
按照 Blevins 的层级,/s/ 的响度比 /t/ 高。这意味着在 coda 位置,/s/ 应该比 /t/ 更靠近核心。如果一个音节已经有了 /t/ 作为 coda,/s/ 就不应该出现在 /t/ 的外面。
但实际上英语允许这样的序列:
pat /pæt/ ✓ 符合预测
pass /pæs/ ✓ 符合预测
past /pæst/ ✓ 符合预测
pats /pæts/ ✗ 违反响度下降原则
pasts /pæsts/ ✗ 严重违反
"pats" 里 /s/ 出现在 /t/ 的外面,"pasts" 更离谱,coda 是 /sts/,响度先降再升再降。同样的问题出现在 onset:英语允许 "spat" 但不允许 "psat",可是按响度层级 /s/ 比 /p/ 响度高,/sp-/ 这个 onset 的响度是先降后升的,违反了「onset 响度应该上升」的原则。
Mortensen 提到的一个处理方案是:在词边界处把擦音的响度值设为最低值,然后再做音节切分。这相当于承认 /s/ 在词边界有特殊地位,不受正常响度约束的限制。
这个问题在语音学里被广泛讨论,没有完全令人满意的解决方案。但对于实际的音节切分算法来说,这种 ad hoc 的修补已经足够让算法在大多数情况下正确工作。
6. 总结
| 概念 | 核心内容 | 跟 NLP 的关系 |
|---|---|---|
| 音节结构 | onset + nucleus + coda | 语素边界倾向于落在音节边界上,好的 tokenizer 应该尊重音节结构 |
| 响度层级 | 低元音 > ... > 清塞音 | 可以用发音特征自动计算,是音节切分算法的基础 |
| 自动音节切分 | 在响度序列的低谷处画边界 | 无需训练数据,可用于任何语言 |
| /s/ 的特殊行为 | 词边界处的擦音不遵守响度约束 | 提醒我们语音学规律总有例外,算法需要容错 |
核心 takeaway:
音节是语音系统中比音素更大的结构单位,大量语音规则都以音节位置为条件。响度层级提供了一种形式化的方式来定义音节,并且可以实现为不依赖训练数据的自动切分算法。对于 subword modeling 来说,音节的重要性在于:在很多语言里语素边界和音节边界高度重合,这意味着一个在音节中间切断的 token 很可能既没有语音学意义,也没有形态学意义。