0 概述
语音合成过程,需要处理两部分内容,分别是:
文本(Text)处理: 假设我们的输入是
你好看啊
音频(speech)处理: 对应
你好看啊.wav
1 文本处理
1.1 规范化
对文本进行预处理,主要是去掉无用字符,全半角字符转化等
有时候普通话文本中会出现简略词、日期、公式、号码等文本信息,这就需要通过文本规范化,对这些文本块进行处理以正确发音[7]。例如
- “小明体重是 128 斤”中的“128”应该规范为“一百二十八”,而“G128 次列车”中的“128” 应该规范为“一 二 八”;
- “2016-05-15”、“2016 年 5 月 15 号”、“2016/05/15”可以统一为一致的发音
对于英文而言,如:
- 类别为年份(NYER): 2011 $\rightarrow$ twenty eleven
- 类别为货币(MONEY): £100 $\rightarrow$ one hundred pounds
- 类别为非单词,需要拟音(ASWD): IKEA $\rightarrow$ apply letter-to-sound
- 类别为数字(NUM) : 100 NUM $\rightarrow$ one hundred
- 类别为字母(LSEQ) : DVD $\rightarrow$ dee vee dee
1.2 转化为拼音
参考国家汉语拼音方案
使用一个汉语拼音词典,将你好看啊
转换为: nǐ
,hǎo
,kàn
,ā
。此过程需要注意有些多音词需要处理,可以只是使用python的pypinyin
1.3 拼音转换为音调表示
目前支持将汉语拼音中的一
,二
,三
,四
声转换为 1
,2
,3
,4
,5
(5代表轻声)
nǐ
,hǎo
,kàn
,ā
$\rightarrow$ ni3
,hao3
,kan4
,a1
事实上pypinyin可以一步从你好看啊
转换为 ni3
,hao3
,kan4
,a1
1.4 将音节分解为音素
音素为汉语拼音的最小单元。包括声母
,韵母
,但是其中还会有一些整体认读音节。(注意:下面所列并非官方标准版,不同情形可以采取不同取舍,参考MTTS文本分析)
整体认读音节
16个整体认读音节分别是:zhi 、chi、shi、ri、zi、ci、si、yi、wu、yu、ye、yue、yuan、yin 、yun、ying
,但是要注意没有yan,因为yan并不发作an音
声母(23个)
1 | b p m f d t n l g k h j q x zh ch sh r z c s y w |
韵母(39个)
- 单韵母 a、o、e、 ê、i、u、ü、-i(前)、-i(后)、er
- 复韵母 ai、ei、ao、ou、ia、ie、ua、uo、 üe、iao 、iou、uai、uei
- 鼻韵母 an、ian、uan、 üan 、en、in、uen、 ün 、ang、iang、uang、eng、ing、ueng、ong、iong
韵母(39个)(转换标注后)
- 单韵母 a、o、e、ea、i、u、v、ic、ih、er
- 复韵母 ai、ei、ao、ou、ia、ie、ua、uo、 ve、iao 、iou、uai、uei
- 鼻韵母 an、ian、uan、 van 、en、in、uen、 vn 、ang、iang、uang、eng、ing、ueng、ong、iong
1.5 结果
此步骤的结果为
1 | [('n', 'i3'), ('h', 'ao3'), ('k', 'an4'), ('a5',)] |
2 合成基元选取
合成基元就是合成语音所需的最小单元。由大到小来说:
- 可以选择每个汉字,一共有6万多,会导致需要很大的训练集
- 可以选择所有拼音,数量会比汉字少很多
- 也可以选择声韵母,声韵母是组成音节的单元,21个声母+39个韵母,数据量大幅度减少。
在实际语音中除了这些文本上的内容之外,还会存在开始和结束的静音,标点符号之间存在的短暂停顿。所以我们可以采取以下这套合成基元方案。
- 声母: 21个声母+wy(共23个)
- 韵母: 39个韵母
- 静音:
sil
,pau
,sp
。sil(silence) 表示句首和句尾的静音,pau(pause) 表示由逗号,顿号造成的停顿,句中其他的短停顿为sp(short pause)
3 上下文相关标注
上下文相关标注的规则要综合考虑有哪些上下文对当前音素发音的影响,总的来说,需要考虑发音基元及其前后基元的信息,以及发音基元所在的音节、词、韵律词、韵律短语、语句相关的信息。
此类标注对于不同任务可以自由设计,一种参考是MTTS普通话标注示例。这里将参考中的一些内容作出一些解释:
层级(由小到达) | 标注格式 |
---|---|
声韵母层 | p1^p2-p3+p4=p5@p6_p7 |
. | /A:a1_a2-a3_a4#a5 |
音节层 | /B:b1_b2!b3_b4#b5@b6!b7+b8@b9#b10_b11 |
. | /C:c1+c2-c3=c4#c5 |
词层 | /D:d1-d2 /E:e1&e2^e3_e4 /F:f1-f2 |
韵律层 | /G:g1-g2 /H:h1-h2@h3+h4 /I:i1-i2 |
韵律短语层 | /J:j1^j2=j3-j4 /K:k1=k2_k3^k4&k5_k6 /L:l1^l2#l3-l4 |
语句层 | /M:m1#m2+m3+m4!m5 |
下面的(发音)基元指的是声韵母,HMM建模选用的单元是音节
标号 | 含义 |
---|---|
p1 | 前前基元 |
p2 | 前一基元 |
p3 | 当前基元 |
p4 | 后一基元 |
p5 | 后后基元 |
p6 | 当前基元在当前音节的位置(正序) |
p7 | 当前基元在当前音节的位置(倒序) |
a1 | 前一音节的首基元 |
a2 | 前一音节的末基元 |
a3,a4 | 前一音节的声调类型(词典和文本分析,下同) |
a5 | 前一音节的基元数目 |
b1 | 当前音节的首基元 |
b2 | 当前音节的末基元 |
b3,b4 | 当前音节的声调类型(词典和文本分析,下同) |
a5 | 当前音节的基元数目 |
b6 | 当前音节在词中的位置(正序) |
b7 | 当前音节在词中的位置(倒序) |
b8 | 当前音节在韵律词中的位置(正序) |
b9 | 当前音节在韵律词中的位置(倒序) |
b10 | 当前音节在韵律短语中的位置(正序) |
b11 | 当前音节在韵律短语中的位置(倒序) |
c1 | 后一音节的首基元 |
c2 | 后一音节的末基元 |
c3,c4 | 后一音节的声调类型(词典和文本分析,下同) |
c5 | 后一音节的基元数目 |
d1 | 前一个词的词性 |
d2 | 前一个词的音节数目 |
e1 | 当前词的词性 |
e2 | 当前词中的音节数目 |
e3 | 当前词在韵律词中的位置(正序) |
e4 | 当前词在韵律词中的位置(倒序) |
f1 | 后一个词的词性 |
f2 | 后一个词的音节数目 |
g1 | 前一个韵律词的音节数目 |
g2 | 前一个韵律词的词数目 |
— | —- |
h1 | 当前韵律词的音节数目 |
h2 | 当前韵律词的词数目 |
h3 | 当前韵律词在韵律短语的位置(正序) |
h4 | 当前韵律词在韵律短语的位置(倒序) |
— | – |
i1 | 后一个韵律词的音节数目 |
i2 | 后一个韵律词的词数目 |
– | — |
j1 | 前一韵律短语的语调类型 |
j2 | 前一韵律短语的音节数目 |
j3 | 前一韵律短语的词数目 |
j4 | 前一韵律短语的韵律词个数 |
— | —- |
k1 | 当前韵律短语的语调类型 |
k2 | 当前韵律短语的音节数目 |
k3 | 当前韵律短语的词数目 |
k4 | 当前韵律短语的韵律词个数 |
k5 | 当前韵律短语在语句中的位置(正序) |
k6 | 当前韵律短语在语句中的位置(倒序) |
— | — |
l1 | 后一韵律短语的语调类型 |
l2 | 后一韵律短语的音节数目 |
l3 | 后一韵律短语的词数目 |
l4 | 后一韵律短语的韵律词个数 |
— | — |
m1 | 语句的语调类型 |
m2 | 语句的音节数目 |
m3 | 语句的词数目 |
m4 | 语句的韵律词数目 |
m5 | 语句的韵律短语数目 |
4 问题集设计
问题集(Question Set)即是决策树中条件判断的设计。问题集通常很大,由几百个判断条件组成。
问题集的设计依赖于不同语言的语言学知识,而且与上下文标注文件相匹配,改变上下文标注方法也需要相应地改变问题集,对于中文语音合成而言,问题集的设计的规则有:
- 前前个,前个,当前,下个,下下个声韵母分别是某个合成基元吗,合成基元共有65个(23声母+39韵母+3静音),例如判断是否是元音a QS “LL-a” QS “L-a” QS “C-a” QS “R-a” QS “RR-a”
- 声母特征划分,例如声母可以划分成塞音,擦音,鼻音,唇音等,声母特征划分24个
- 韵母特征划分,例如韵母可以划分成单韵母,复合韵母,分别包含aeiouv的韵母,韵母特征划分8个
- 其他信息划分,词性划分,26个词性; 声调类型,5个; 是否是声母或者韵母或者静音,3个
- 韵律特征划分,如是否是重音,重音和韵律词/短语的位置数量
- 位置和数量特征划分
对于三音素模型而言,对于每个划分的特征,都会产生3个判断条件,该音素是否满足条件,它的左音素(声韵母)和右音素(声韵母)是否满足条件,有时会扩展到左左音素和右右音素的情况,这样就有5个问题。其中,每个问题都是以 QS 命令开头,问题集的答案可以有多个,中间以逗号隔开,答案是一个包含通配符的字符串。当问题表达式为真时,该字符串成功匹配标注文件中的某一行标注。格式如:
QS 问题表达式 {答案 1,答案 2,答案 3,……}
QS “LL==Fricative” {f^*,s^*,sh^*,x^*,h^*,lh^*,hy^*,hh^*}
对于3音素上下文相关的基元模型的3个问题,例如: * 判断当前,前接,后接音素/单元是否为擦音 * QS ‘C_Fricative’ * QS ‘L_Fricative’ * QS ‘R_Fricative’
问题集示例参考 MTTS问题集设计参考
值得注意的是,merlin中使用的问题集和HTS中有所不同,Merlin中新增加了CQS问题,Merlin处理Questions Set 的模块在merlin/src/frontend/label_normalisation 中的Class HTSLabelNormalisation
Question Set 的格式是
QS + 一个空格 + “question_name” + 任意空格+ {Answer1, answer2, answer3…} # 无论是QS还是CQS的answer中,前后的**不用加,加了也会被去掉 CQS + 一个空格 + “question_name” + 任意空格+ {Answer} #对于CQS,这里只能有一个answer 比如 CQS C-Syl-Tone {(d+)+} merlin也支持浮点数类型,只需改为CQS C-Syl-Tone {([d.]+)+}
参考 : https://mtts.readthedocs.io/zh_CN/latest/text_analyse.html