
人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本文是 PaddleSpeech 语音合成TTS前端中g2pGrapheme-to-Phoneme字形到音素字典设计的完整技术指南。内容覆盖英文侧基于 CMUDict 的 ARPAbet 音标体系、中文多套注音系统的复杂性分析以及 PaddleSpeech 为统一各数据集标注风格而设计的声母 韵母 声调 儿化内部注音方案与全套符号表。读完本文你将理解 PaddleSpeech 中文 TTS 词典lexicon与音素符号表symbols的设计动机、组合规则并能直接对照仓库中的 generate_lexicon.py 与 simple.lexicon 落地自己的 g2p 转换流程。为什么 TTS 需要精心设计 g2p 字典一个完整的 TTS 系统主要由三部分构成文本前端Text Frontend、声学模型Acoustic Model和声码器Vocoder。其中文本前端负责把普通文本转成声学模型能够消费的符号序列其核心链路包括文本正则化Text Normalization→ 分词 → 韵律预测 →g2p字音转换→ 生成音素/字符序列。关于中文规则文本前端的整体介绍可参考 zh_text_frontend.md。g2p 是文本前端中最关键也最复杂的环节之一英文需要处理词典外单词OOV中文则需要同时面对多套注音系统、儿化、变调、多音字等问题。而字典lexicon与音素符号集symbols的设计直接决定了后续模型词汇表的大小、Embedding 的训练充分程度以及音素序列能否真实反映发音。本文讨论的正是 PaddleSpeech 在符号系统这一层面所做的设计与取舍。英文侧ARPAbet 音标系统与 CMUDict对于英文 TTS常用的 g2p 做法是查询 CMUDictCMU 发音词典来完成字到音的转换而 CMUDict 注音使用的符号系统就是ARPAbet。ARPAbet 是专门为语音合成/识别设计的 ASCII 化音标系统避免了 IPA 特殊字符在计算机中难以表示的问题在 PaddleSpeech 中被直接实现为 arpabet.py 中的ARPABET类。39 个音素phonemeARPAbet 包含 39 个音素不含词汇重音变体PhonemeExampleTranslationAAoddAA DAEatAE TAHhutHH AH TAOoughtAO TAWcowK AWAYhideHH AY DBbeB IYCHcheeseCH IY ZDdeeD IYDHtheeDH IYEHEdEH DERhurtHH ER TEYateEY TFfeeF IYGgreenG R IY NHHheHH IYIHitIH TIYeatIY TJHgeeJH IYKkeyK IYLleeL IYMmeM IYNkneeN IYNGpingP IH NGOWoatOW TOYtoyT OYPpeeP IYRreadR IY DSseaS IYSHsheSH IYTteaT IYTHthetaTH EY T AHUHhoodHH UH DUWtwoT UWVveeV IYWweW IYYyieldY IY L DZzeeZ IYZHseizureS IY ZH ER这 39 个音素在 arpabet.py 中被完整定义在phonemes列表中并与 4 个标点符号, . ? !及pad、unk、s、/s4 个特殊 token 一起构成 47 个符号的词汇表39 phones 4 punctuations 4 special tokens供声学模型使用。三个重音标记除音素外ARPAbet 还包含三个重音标记附着在元音后面0— No stress无重音1— Primary stress主重音2— Secondary stress次重音例如AA1表示带主重音的AA。当只需要音标而不需要重音标记时可以直接省略。在 arpabet.py 中_stress_to_no_stress_映射表正是把带重音的写法如AA0/AA1/AA2规整为无重音写法AA这就是有重音与无重音两种词汇表ARPABET与ARPABETWithStress之间的转换逻辑。OOV 的处理思路CMUDict 本质上只是一个词典当出现词典中不存在的词OOVOut-Of-Vocabulary时需要借助其他工具根据拼写推导发音业界常见的方案包括 CMU 的 Lexicon Tool、基于序列到序列seq2seq训练的 g2p 模型如 g2p-seq2seq等。这是英文 g2p 中词典 生成式兜底的经典组合思路。中文注音系统的复杂性与英文不同中文普通话存在多套注音/拉丁化系统汉语拼音pinyin、注音符号bopomofo、国语注音符第二式、威妥玛拼音等。其中汉语拼音本身是拉丁化方案而非纯粹的音位标注方案因此为了符号系统的经济性做了一系列简并和修改这给直接拿拼音做 TTS 音素带来了若干坑同一个符号对应多个音位i实际代表三个音位如zi、zhi、yi中的i各不相同e代表两个音位单用写作ê。存在简写规则bpmf后的o是uo的简写ui是uei的简写iu是iou的简写un是uen的简写ao是为了书写避免形近而改掉的au。零声母符号y和w是为了连续书写时作分隔而产生的零声母符号。省写规则ü在j、q、x后面省略两点大陆美式键盘输入时一般只在女、律、略、虐一类字里用v代替ü在j、q、x后仍写作u。结构不对称有鼻韵母uang而没有ueng但又有weng这个音节有ong韵母但从不单用。此外汉语声调用特殊符号标调型用字母记录时常用12345轻声标5或1234轻声不标等手段。还有两个突出问题儿化鼻韵母儿化需要去掉韵尾再换成r若直接抽取拼音字符串表示可能出现的音节会超过 1400 个有效音节数含糊不清即便是韵母也会因此扩展近一倍。变调一般我们为汉字标音是标字调而不标变调但标贝Baker数据集是标变调的且并未把所有变调都正确标出。变调规则轻声变调、一不变调、三声变调的详细说明见 zh_text_frontend.mdPaddleSpeech 在 tone_sandhi.py 中实现了相应规则。正是由于这些情形且不同数据集自带的拼音标注风格可能不同PaddleSpeech 认为必须在内部转成统一的表示于是大胆设计了一套内部注音方案。PaddleSpeech 内部注音方案九条设计原则为了让符号集既贴近真实语音、又减少模型学习负担PaddleSpeech 的内部注音方案遵循以下九条原则只切声母和韵母有效符号集仅切分为声母和韵母不作声母、介音、韵腹、韵尾的进一步切分。不同音用不同符号i拆分为 3 个符号、e拆分为 2 个符号u和ü开头的韵母分开。这是为了 TTS 系统考虑——尽量反映语音现实不把注音系统里的奇怪规则留给模型去学习。不保留零声母y、w这些符号不发声或发声极短不加入音符序列中以期待注意力attention更对角。声调与韵母分离声调不并入韵母符号而是单独标注。这样可以减少词汇量让符号的 Embedding 得到更充分的训练也更能反映声调语言的特点数据集少时推荐这样做。儿化用拆分 特殊符号r儿化标音采用拆分方式处理增设特殊符号r表示儿化的r它和一般的er不同以区分实际读音差异。贴近注音符号的转写in写作ien、ing写作ieng、un写作uen、ong写作ueng、iong写作üeng。其中in/ing的转写纯属偏好无论什么符号写都可映射为同一个 index而ong写作ueng有实际差别若ong作为独立韵母weng经修改后变成ueng会同时存在ueng和ong两个符号不细究音值差异时ong就是注音符号中ㄨㄥ的表示iong则是ㄩㄥ。展开简写ui、iu展开为uei、iou纯属偏好对结果无影响bpmf后的o展开为uo这是为了和单独的o哦区分——波里的韵母发音与哦不同。ü统一写作v所有ü都用v代替无论是单独作韵母还是复韵母和鼻韵母。纳入停顿与特殊符号停顿以#1等方式纳入pad、unk、s、/s等处理符号序列的特殊 token 也加入符号表。多一些特殊词汇并不会对 Embedding 产生什么影响。于是PaddleSpeech 通过这样一套规则系统可以把标贝数据的拼音标注转换成内部需要的统一形式如果其他数据集的标注不同转换规则相应修改即可。在实际使用中文数据集时PaddleSpeech仅使用数据集提供的拼音标注而不使用音素标注PhoneLabel因为不同数据集标注规则不同有的数据集如 aishell3根本没有音素标注。这套做法与维基百科的汉语拼音音节列表更接近。统一后的符号表21 个声母 41 个韵母转换之后的符号集分为两部分。声母基本没有争议共 21 个声母bpmfdtnlgkhjqxzhchshrzcs韵母与儿化韵尾共 41 个韵母解释iizi、ci、si里面的韵母iiiizhi、chi、shi、ri里面的韵母ia啊卡o哦e恶个eaêai爱在ei诶薇ao奥脑ou欧勾an安单en恩痕ang盎刚eng嗯更er儿i一ia鸦家io哟ie叶界iai崖台语发音iao要教iou有久ian言眠ien因新iang样降ieng英晶u无卢ua哇瓜uo我波uai外怪uei位贵uan万乱uen问论uang网光ueng翁共v玉曲üve月却van源倦ven韵君veng永炯r儿化韵尾这份符号表直接对应设计原则 2、4、6、8ii/iii把i的三个音位分开ea单独表示êuei/iou/uen是展开后的完整写法v系列统一表示ür表示儿化韵尾。源码实现generate_lexicon.py 的音节组合引擎PaddleSpeech 把上述设计落成了可直接运行的脚本 examples/other/mfa/local/generate_lexicon.py同一实现也存在于 paddlespeech/t2s/frontend/generate_lexicon.py两者均注明设计原则源自同一篇专栏文章。脚本的核心是三个部分INITIALS 与 FINALS 常量脚本顶部定义了声母与韵母的完整集合。INITIALS包含 21 个声母与上文声母表完全一致FINALS是韵母候选集与上文韵母表略有出入——正如文档开头所注代码可能与此处的描述有些许出入以代码为准例如FINALS中鼻韵母实际写作in、ing、iong、vn对应ün而文档韵母表写作ien、ieng、veng、ven这正印证了原则 6 中in/ing的转写纯属偏好无论用什么符号写都可以被转为一个 index。此外脚本还定义了SPECIALS [sil, sp]静音与短停顿。rule()拼音正字法组合规则rule(C, V, R, T)函数根据声母 C、韵母 V、儿化指示 R、声调 T 四元组生成一个合法音节并对不符合普通话拼读规律的组合返回None予以过滤。它集中体现了拼音正字法orthography的约束源码中的关键规则包括ii只能与z、c、s相拼iii只能与zh、ch、sh、r相拼。齐齿呼i开头与撮口呼v开头韵母不能与f、g、k、h、zh、ch、sh、r、z、c、s相拼。撮口呼v开头只能与j、q、x、n、l相拼v、ve可拼n、l其余仅拼j、q、x。j、q、x只能拼齐齿呼或撮口呼。b、p、m、f不能与合口呼u开头u本身除外及撮口呼相拼。ua、uai、uang不能与d、t、n、l、r、z、c、s相拼。sh与ong不能相拼o不能与d、t、n、g、k、h、zh、ch、sh、r、z、c、s相拼。ueng只是weng这一音节的 ad-hoc 写法其他情况下都是ong故ueng不允许带声母。非儿化的er只能单独存在以r结尾的音节不能再儿化。同时rule()也实现了拼音书写层面的转换即设计原则 3、7、8 的落地零声母处理i/in/ing前补yu前补wi/u开头的复韵母去掉首字母并补y/wv开头的零声母写作yu。j、q、x后的v改写为u省写两点。iou→iu、uei→ui、uen→un的拼音简写还原。ii/iii在最终音节中规整为i。generate_lexicon() 与 generate_symbols()生成字典与符号表generate_lexicon(with_tone, with_erhua)通过四重循环遍历声母含零声母 × 韵母 × 儿化 × 声调的所有组合用rule()过滤非法音节产出形如a1 a1、xing1 x ing1的音节 → 声母 韵母(r)(声调)映射generate_symbols()则从字典中提取去重的音素集合加上sil、sp两个特殊符号写出.symbols文件。命令行接口支持output必填参数保存字典的路径会生成.lexicon与.symbols两个文件--with-tone是否考虑声调开启后每个音节带 1~5 声--with-r是否考虑儿化开启后每个韵母追加r变体--rhy-with-duration是否额外写入sp1~sp4韵律停顿符号。从设计到落地simple.lexicon 与 MFA 强制对齐生成的字典被用于MFAMontreal Forced Aligner蒙特利尔强制对齐的发音词典。为了让标贝等数据集满足 MFA 的语料要求PaddleSpeech 提供了 reorganize_baker.py它读取标贝数据集的ProsodyLabeling/000001-010000.txt标注带韵律的文本与拼音清洗标点后为每个句子写出.lab文件并可选地把音频重采样到 16kHz从而得到 MFA 需要的音频 文本语料结构normalize_rhy()与insert_rhy()则负责把文本中的#1~#4韵律层级标记转换成sp1~sp4停顿符号对应generate_lexicon.py中--rhy-with-duration分支写出的特殊条目。生成的带声调、带儿化拼音字典示例就是 examples/csmsc/tts3/local/simple.lexicon。以它为例可以直观看到设计的落地效果每个音节覆盖 5 个声调a1 a1、a2 a2、…、a5 a5儿化作为独立变体存在ar1 ar1、anr1 anr1、angr1 angr1鼻韵母儿化直接体现去韵尾 r音素层ü写作vxu1 x v1、xue1 x ve1、xuan1 x van1、xun1 x vn1印证原则 8 与源码 docstring 中ü在音素中恒写作v的说明j、q、x后的ü在音节层写作u如xu但在音素层仍写v。在真实 TTS 前端中的应用这套 g2p 设计最终服务于 PaddleSpeech 的中英文文本前端。在 zh_frontend.py 中Frontend类组合了Polyphonic多音字、ToneSandhi变调、pypinyin/g2pM/g2pW等工具先按规则做拼音获取再经modified_tone做变调修正最后通过_merge_erhua依据must_erhua/not_erhua词表完成儿化合并在前端初始化时还可传入tone_vocab_path加载声调词汇表或在with_tone开关下输出带声调的音素序列——这与generate_lexicon.py的--with-tone参数一脉相承。英文侧则由 arpabet.py 的ARPABET类承载 39 音素词汇表并处理重音剥离与特殊 token 填充。从整体链路看generate_lexicon.py产出的是静态发音字典供 MFA 对齐训练数据而zh_frontend.py/arpabet.py是运行时推理前端把新文本转成音素序列二者共享同一套符号设计思想这也是 PaddleSpeech 中文 TTS如 csmsc 的 tts3 示例能够稳定工作的根基之一。总结PaddleSpeech 的 g2p 字典设计本质上是在回答如何为中文 TTS 构建一个既真实反映语音、又便于模型学习的符号系统英文侧依托 CMUDict/ARPAbet 的 39 音素体系中文侧则在分析汉语拼音作为拉丁化方案的种种简并之后用21 声母 41 韵母 独立声调 r儿化韵尾的统一符号集屏蔽数据集差异并用 generate_lexicon.py 的正字法规则自动生成合法音节、过滤非法组合。对照 simple.lexicon 可以看到设计原则的完整落地而 reorganize_baker.py 与 zh_frontend.py 则分别展示了它在数据对齐与运行时推理两端的实际应用。对于需要自建中文 TTS 数据集或定制音素系统的开发者这套先设计符号集、再用规则枚举合法组合的方法论具有直接可复制的参考价值。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech g2p 字典设计从拼音标注到统一音素符号集的完整方案PaddleSpeech g2p 字典设计从拼音标注到统一音素符号集的完整方案 导读 grapheme to phonemeg2p字形到音素转换是 TT人工智能语音音频PaddleSpeech ARPABET 前端解析英文 TTS 中音素化G2P与词表设计的完整实现指南PaddleSpeech ARPABET 前端解析英文 TTS 中音素化G2P与词表设计的完整实现指南 导读 本文以 PaddleSpeech 仓库中 p人工智能语音音频PaddleSpeech多音字问题解决方案详解PaddleSpeech多音字问题解决方案详解 问题背景 在使用PaddleSpeech进行中文语音合成 TTS 时开发者可能会遇到多音字发音不准确的问题。例人工智能语音音频上一篇用 QUALITY_SCORE.md 建立 Agent 可读的仓库质量追踪体系learn-harness-engineering 中 OpenAI 高级模板的实践下一篇RMSNorm优化mirrors/unsloth/llama-3-8b-bnb-4bit中1e-05 eps参数作用解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考