CMU Subword Modeling | 23 Syllables and Syllabification

本文解读 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 工具里的算法。

核心思路很简单:在响度序列中找到所有的峰值,然后在峰值之间的低谷处画音节边界。

具体步骤是:

  1. 把输入的音素序列转成响度值序列
  2. 找到所有响度值超过阈值 α 的位置,这些是潜在的 nucleus
  3. 在每两个相邻 nucleus 之间,找到响度从下降转为上升的位置,在那里画边界
  4. 处理边界情况:如果一个位置在第一个 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 很可能既没有语音学意义,也没有形态学意义。

相关推荐
M ? A2 小时前
VuReact 1.6.2 发布,新一代 Vue 3 转 React 编译工具
前端·javascript·vue.js·react.js·面试·开源·vureact
程序员柒叔2 小时前
Agent / Subagent / Swarm 解析:ClaudeCode源码深度解读
人工智能·后端
AI浩2 小时前
PF-RPN:无需提示的通用区域提议网络
人工智能
blxr_2 小时前
深入Spring AI RAG:揭秘RetrievalAugmentationAdvisor的过滤器机制
人工智能·spring
qq_348231852 小时前
企业级避坑指南
人工智能·学习
番茄去哪了2 小时前
JeecgBoot框架集成spring ai并进行同步调用异步调用模板
java·人工智能·spring
X journey2 小时前
机器学习进阶(22):朴素贝叶斯
人工智能·机器学习
大模型最新论文速读2 小时前
RACER:无需训练,让大模型推理速度翻倍
论文阅读·人工智能·深度学习·机器学习·自然语言处理