TTS前端基础知识介绍

TTS前端基础知识介绍

TTS前端基础知识介绍

  • 一、TTS是什么
    • 1.1 TTS是什么
    • 1.2 都有哪些流程
  • 二、 前端流程
    • 2.1 前端组成部分
      • 2.1.1 什么是TN
      • 2.1.2 什么是G2P
      • 2.1.3 什么是PSP
    • 2.2 模型介绍
      • 2.2.1 BERT or TinyBERT
      • 2.2.2 Polyphone prediction layer
      • 2.2.3 Prosody prediction layer
      • 2.2.4 Mul-task
      • 2.2.5 distillation
  • 三、文章实验结果

文章:https://arxiv.org/pdf/2012.15404 介绍内容主要根据这批文章展开。

一、TTS是什么

1.1 TTS是什么

TTS–Text To Speech,释义语音合成,是一种将文本转换为语音的技术。它通过分析输入的文本,提取相关语音信息,将其转换为相应的语音波形信号,并输出语音。

1.2 都有哪些流程

当前我们把TTS实现分成两大部分,前端+后端
前端:由TN+G2P+PSP三部分组成

  • TN: 非中文符号转换处理。数字,日期,百分数,加减法,缩写等字符的转换处理。
  • G2P:字素-音素转换,把文字转换成用于后端生成语音需要的发音单元–即音素
    • 单音字 音素转换
    • 多音字消歧
  • PSP: 韵律结构预测,预测一个文本要在什么地方停顿。
    后端:音素-声音波形转换
    例如,输入文本:有句谚语是:“良好的开端是成功的一半”。
    经过TTS前端后端流程,生成一条语音:
    示例前端实现流程图:

二、 前端流程

2.1 前端组成部分

前端:由TN+G2P+PSP三部分组成

2.1.1 什么是TN

TN: 非中文符号转换处理。数字,日期,百分数,加减符号,缩写等字符的转换处理。

原始文本:1234 规范化文本:一千二百三十四 or 一二三四 原始文本:2023/06/27 规范化文本:二零二三年六月二十七日 原始文本:¥123.45 规范化文本:一百二十三点四五元 原始文本:75% 规范化文本:百分之七十五 原始文本:5kg 规范化文本:五千克 原始文本:138-0013-8000 规范化文本:一三八零零一三八零零零 原始文本:ABC 规范化文本:ABC 原始文本:你好,世界! 规范化文本:你好,世界!

2.1.2 什么是G2P

G2P:grapheme to phoneme 字素-音素转换,把文字转换成用于后端生成语音的发音单元–即音素

  • 单音字:直接查发音字典即可。
  • 多音字消歧:需要根据语义预测多音字的发音概率,取概率最大的发音。
    为什么要做多音字消歧:例如下文“行”到底是读xing2 还是读hang2呢?这就需要用到多音字消歧来确定到底是发哪一个音。
人要是行,干一行行一行,一行行行行行。人要是不行,干一行不行一行,一行不行行行不行。

2.1.3 什么是PSP

PSP: prosodic structure prediction 韵律结构预测,预测一个文本应该在什么地方停顿。工程实现认为有五级韵律#0 #1 #2 #3 #4 ,韵律级别是指停顿时间的长短级别,#0表示没有停顿,#4表示停顿时间最长。一般的我们认为是有三级韵律, 韵律词PW、韵律短语PPH、语调短语IPH。#0 #4是实际工程实现的时候,添加的两个韵律停顿级别。
eg:良好的开端是成功的一半。
- #0 字边界,例如,‘良’字边界 表示没有停顿
- #1 PW: prosodic word 韵律词 词边界 例如,“良好”
- #2 PPH:prosodic phrase 韵律短语 短语边界 例如,“良好的开端”
- #3 IPH: intonational phrase 语调短语 短句边界 例如,“良好的开端是成功的一半”
- #4 长句边界,表示一句话的结束,一般以句号、分号等作为结束标志。“良好的开端是成功的一半”
为什么要做韵律结构预测?
为了让生成的语音更自然,更能拟合人类的发音。因为正常人说话都有恰到好处的停顿。

2.2 模型介绍

2.2.1 BERT or TinyBERT

预训练的中文BERT文本编码器,用于编码原始文本。由Transformer块组成,使用大量中文文本数据进行预训练,能捕获丰富的中文语境和语义信息,促进下游PSP G2P这两个NLP任务。
当前系统用的tTinyBERT,比BERT少了一些模型层和参数。BERT有12层transformer,768个隐藏单元,模型较大。Tinybert有6层transformer,312个隐藏单元,模型较小。

2.2.2 Polyphone prediction layer

线性层–多音字消歧预测层。对每一个多音字,根据文本的上下文预测多音字所有发音的概率,输出概率最大的作为发音音素,输出单元是发音单元的个数。基于BERT丰富的上下文特征,用一个线性层+softmax去做多音字消歧预测,用交叉熵对一个训练句子统计多音字损失并求损失平均值。

2.2.3 Prosody prediction layer

线性层–韵律结构预测层。对每一个字输出韵律等级概率。输出单元是韵律标签的个数【当前我们的模型标签是五级,那么输出单元数就是5】。传统流程是做三级韵律,首先预测一遍PW,再此基础上再去预测PPH、IPH;当前我们现有的流程是将韵律标签混合,在一次预测中一次性预测出所有的韵律标签。

#0 #1 #0 #1 #4 #0 #1 #1 #0 #2 #1 #0 #0 #1 #0 #4

2.2.4 Mul-task

模型使用混合数据训练。多音字训练数据和韵律训练数据混合在一起输入到预训练的BERT编码器,经过两个输出层–多音字消歧预测层+韵律结构预测层,分别对相应的数据做loss,即每个句子只计算标记任务的损失,其他损失置0。再对两个损失做加权计算一个全局损失。

多音字训练数据"""宋代出现了▁le5▁燕乐音阶的记载2011年9月17日,爆发了▁le5▁占领华尔街示威活动""" 韵律训练数据'''今天#1 天气 #1 怎么样 #3'''输入数据,把发音和韵律整合成一个字典列表,有多音字标记数据对韵律标签用IGNORE_ID占位符代替,有韵律标记数据对多音字内容IGNORE_ID占位符代替,计算loss的时候IGNORE_ID就会被剔除掉,这样就实现了只计算标记任务的损失:IGNORE_ID=-100{'sentence':tokens,'phones':all_phones,'prosody':[IGNORE_ID]* len(all_phones)}{'sentence':tokens,'phones':[IGNORE_ID]* len(prosody),'prosody':prosody}

2.2.5 distillation

BERT模型训练完成后需要做蒸馏压缩,为什么要做精馏压缩? BERT训练出来的模型计算量、存储量都特别大,无法在实时应用和边缘设备中使用。需要对BERT模型–> TinyBERT模型做蒸馏压缩。

三、文章实验结果

文章实验结果
多音字消歧测试结果:BERT-polyphone表现最好![

韵律结构测试集预测结果:BERT-prosody测试效果最好

压缩后的TinyBERT-MTL的大小约为基准测试的25%, 利于在移动设备上部署。