本节摘要:音素集定义"语言的最小发音单位",发音词典把词表逐条翻译成音素序列,两者合起来构成声学模型与语言模型之间的汇率体系。本节从零建一套小规模图谱:设计音素表、生成词典、登记特殊条目、跑语言资源准备脚本、验收产物。承接 3.3 的干净标注,是备矿的收官工序。
化验单治理完,每个词都"有名有姓"了,但声学模型不认名字只认发音。档案室要为词表里每个词建一张发音卡:这个词由哪几个音素按什么顺序拼出来。卡片集合就是发音词典,音素的分类目录就是音素集。
音素集怎么定,是这道工序里最大的设计决策,因为粒度直接决定后续一切。定粗了(比如直接用拼音音节),发音区分度够,但音节组合数上千,声学模型每个单元能分到的训练数据变少;定细了(拆到声母韵母再带声调),单元数压到百级,数据充足,但需要一套可靠的"字到音素"换算规则。中文任务通行做法是声韵母体系:声母二十来个、韵母三十来个,声调视任务决定是否并入韵母(口语任务常不带调,朗读任务常带调)。
| 粒度方案 | 单元规模 | 数据需求 | 换算难度 | 适用 |
|---|---|---|---|---|
| 整词单元 | 与词表等大 | 极高 | 无需换算 | 词汇表极小的封闭任务 |
| 音节单元 | 千级 | 高 | 中 | 方言、特殊领域 |
| 声韵母 | 百级 | 中 | 需规则表 | 中文通用方案 |
| 声韵母带调 | 两百级上下 | 中偏高 | 规则加变调处理 | 朗读与清晰口令任务 |
英文任务没有现成声韵母表,通行做法是直接采用一套约定的音素符号体系(与多数开源词典兼容),词典靠人工标注加自动生成器补齐:人工标几百个高频词打底,剩下的丢给"字转音"模型按拼写规律猜发音,猜完抽查纠错。
图谱里除了正经词,还要登记几类特殊条目。静音条目对应词间停顿与首尾静音;噪声条目对应咳嗽、笑声、呼吸声这类"有声但不是话"的成分;填充词条目对应呃嗯这类犹豫声。它们不进语言模型的正式词表(或以极低概率进),但声学模型必须会给它们打分,否则这些时段的帧会被硬塞给某个正经音素,污染参数。
# 音素表(简化示意):一音素一行,可附类别注释 a # 韵母:啊 i # 韵母:衣 an # 韵母:安 b # 声母:玻 sh # 声母:诗 SIL # 静音条目 SPN # 噪声条目( spoken noise ) LAU # 笑声条目 # 词典片段:词 音素序列(可多行表变体) 八 b a 把 b a 识别 sh i b i 语音 y v y in <SIL> SIL <SPN> SPN
两个表之间的一致性是硬约束:词典里出现的每个音素都必须在音素表注册,音素表里的非静音音素最好都在词典里被至少一个词用到(没用到的等于白建模)。
背景:一个工厂语音指令任务,词表两百个整词,全是短指令(启动、停止、查询故障之类)。目标:产出能通过语言资源准备脚本的词典包。
操作分三步。第一步定音素集:指令是清晰口令,选声韵母体系不带调,音素总数六十出头。第二步生成词典:两百个词的发音人工录写太慢,用一张"字到声韵母"的对照表自动展开,人工复核容易出错的同音字。
# 字到声韵母的自动展开(玩具版,实际用完整对照表) char2phones = { "启": ["q", "i"], "动": ["d", "ong"], "停": ["t", "ing"], "止": ["zh", "i"], "查": ["ch", "a"], "询": ["x", "un"], "故": ["g", "u"], "障": ["zh", "ang"], } words = ["启动", "停止", "查询故障"] for w in words: phones = [p for ch in w for p in char2phones[ch]] print(f"{w}\t{' '.join(phones)}") # 输出: # 启动 q i d ong # 停止 t ing zh i # 查询故障 ch a x un g u zh ang
第三步装配:把词典包交给语言资源准备脚本,它会展开音素的上下文依赖、构建词典与语法的转换器、生成符号表。
# 装配命令(在食谱目录内,词典包已备好) utils/prepare_lang.sh data/local/dict \ "<SPN>" data/local/lang data/lang # 预期输出:多段日志滚动,最后无报错结束 # 验收:语言目录的四样关键产物 ls data/lang # 预期输出(节选): # L.fst L_disambig.fst G.fst phones.txt words.txt topo # L 是词典转换器,G 是语法转换器, # 两个符号表分别是音素与词的编号账本
结果解读:符号表是"名字到编号"的账本,转换器是"编号之间的跳转规则"。第 5 章组装解码图时,会看到这几样原料如何进一步与声学模型焊接成完整的搜索空间。验收时再跑一道词典自检:音素表与词典双向核对、词表与语言模型词表核对,三账对齐才算入库。
变式:若任务词汇开放(不能穷举词表),图谱策略要换成"子词单元"——把词拆成字或词片段,词典给片段建档,解码时片段串回词。子词方案牺牲一点语言模型精度,换取对生词的免疫,第 6 章谈领域迁移时会再遇到它。
英文与中英混排任务的图谱还有一层"生成器"话题。所谓字转音生成器,是一个学过大量"拼写到发音"对照的小模型:给它没见过的词,它按学到的规律猜一串音素。用法上的要点是"生成加抽检"——批量生成后,按词频从高到低人工过一遍前几百条,错误集中在低频词时可以放行,错误蔓延到高频词时说明生成器与你的音素表不匹配,需要补训练。中英混排任务的常见做法是两套音素表合并:中文声韵母加英文音素,各自独立编号,词典里中文词用中文音素、英文词用英文音素,互不干扰。
音素变体是图谱的最后一道选修课。同一个词可能有多种可接受读法(书面读法与口语缩读、地名的地方读法),词典允许一个词挂多行发音,解码时各行竞争。工程提醒是变体别贪多:两三个常见变体足够,挂上十几种读法等于告诉模型"怎么读都行",声学参数会学散。变体发音的另一个来源是口音——目标用户口音统一时,直接把变体写成该口音的读法,比死守标准音更贴合任务。
⚠️ 常见坑一:同音词在词典里发音相同、在语言模型里概率不同,这是正常设计;但若把同音词直接合并成一个词条,语言模型的区分信息就丢了。坑二:静音条目只登记了一种,而真实停顿有长短两类,长任务建议分开建模。坑三:词典带了变体发音却没在训练时声明概率,两条发音平权,模型会学得犹豫。
备矿四道工序走完,标准料齐了。下一章点火开炉:三代选矿机依次运转,从高斯混合的逐级精炼,到神经网络接管打分,再到链式模型的整体提效。