富有表现力的普通话 TTS 自动重音标注与预测
自然且富有表现力的普通话语音合成正受到越来越多的关注。在普通话 TTS 系统中,重音检测和建模是增强韵律和节奏表现的有效方法。然而,手动标注重音既耗时又不准确。本文提出了一种自动音节级重音标注机制,并基于此构建了一个基于 ALBERT 的前端模块进行重音预测。
1 引言
普通话作为一种声调语言,不同声调在区分词义方面起着重要作用。在自然对话中,语调、音节声调都会导致句子意思的变化。重音和非重音音节通常表明句子中合适的强调位置,不恰当的重音位置会使语音不自然,甚至难以理解。因此,重音建模和检测机制是 TTS 系统的基础研究。
重音是韵律词或话语中的感知突出部分,会导致音高轮廓的波动。但普通话中重音的定义仍存在争议。本文将重音视为音节级现象,分为强重音(SS)、常规重音(RS)和非重音(US)三个等级。
此前的研究表明,音高和时长是影响重音感知的两个重要声学特征,特定的声调模式组合也能表明音节是否重读。在现有的重音检测和标注工作中,有多种模型和方法,但完全依赖手动标注既耗时又不准确。
本文的主要贡献在于提出了一种基于规则的自动重音检测机制,用于从音频文件中标注重音,解决了手动标注的耗时和偏差问题。此外,这些标注数据成功地在声学模型 DurIAN 和前端模型 ALBERT 中对重音进行了建模,构建了一个可控制重音的 TTS 系统。
2 方法
2.1 重音检测方法
数据准备和统计结果
首先,对大规模语料库进行分析,以研究不同语境下的韵律变化。本文使用的语料库是单说话人普通话小说风格语料库,具有独特的风格和可变的音高轮廓。语言专家使用 Praat 工具对语料库进行韵律边界、拼音和重音标注,然后将所有音节单元分类,如下表所示:
| 分类 | 描述 |
| — | — |
| tone_categorise | 声调分类 |
| stressed_or_not | 音节是否重读 |
| left/right_prosodic_categories | 前/后音节的韵律边界类别 |
| left/right_syllable_tone | 前/后音节的声调类别 |
| left/right_f0_max | 前/后音节的最大 f0 |
从实验的理论和统计结果可以得出:
1. 音节的重读/非重读分类对提高普通话语音合成的自然度有意义。
2. 通过观察音高曲线,可以根据音节的最大音高是否明显高于前一个或后一个音节,或者音节是否能更好地保持其“典型声调模式形状”来确定音节是否重读。研究结果表明,重音不仅受音节的音高范围和时长影响,还受相邻静音、相邻声调模式和相邻重音的影响。因此,提出了一种基于规则的自动机制,用于从音频文件中进行音节级重音标注。
详细步骤
代码重现可以通过重音检测规则的三个步骤的伪代码实现,所有包含的标量系数均来自之前的统计结果、控制实验和经验值。
以下是相关参数说明:
-
ST
:输入文本的重音标签序列,包括强重音(SS)、常规重音(RS)和非重音(US),从预标注步骤开始初始化为零。
-
P_syl
:离散半音值
[[P1], [P2], ..., [Pt]]
,
Pi
包含第 i 个音节的音节级半音轮廓的点集。
-
P_phr
:短语级半音轮廓的离散点值(通过标点符号和韵律边界 >= IPH 将句子拆分为短语)。
-
P
:将可迭代的
P_syl
的所有元素
Pi
相加,
P = [P1, P2, ..., Pt]
,表示整个序列的所有点。
-
To
:声调,包括 T1(高音)、T2(升调)、T3(降升调)、T4(降调)和 T5(轻声)。
-
D
:所有音节的切片时间线列表。
Di[-1] - Di[0]
表示第 i 个音节的时长列表,
D = [D1, D2, ..., Dt]
。
-
ΔO
:音节音高曲线上最高点和最低点的时间戳差的绝对值。
-
k
:音高曲线上最高点和最低点之间的斜率,
k = |max(P_syl[i]) - min(P_syl[i])| / ΔO
。
Initial settings:
1. 使用 Kaldi 工具包进行强制对齐,以获取音素级时长。
2. 主要基于经验,从 WORLD 获取初始音高数组并进行线性插值,然后将其对齐为音节级 F0 序列,定义为 Pinit。
3. 由于人类感知音高差异近似为对数级别,而非线性级别,因此在本研究中,所有音高值从赫兹尺度归一化为半音尺度。每个当前音节级半音值 Si = 12×log2(F0i/F0ref),其中 F0 表示具有有效跳长的音节级 F0 值序列,F0ref 通常表示说话人音域的下限。
Pre - annotation:
1. 首先通过检测整个句子中的凸音高轮廓来进行音节级重音标签的预标注。
2. 设置一个长度等于音节级语言特征的零初始化重音标签数组 St = {St1, St2, St3, ..., Stt}。
3. 在音节级半音轮廓 S 中,检测那些轮廓峰值高于前一个和后一个的音节。
4. 检测一个音节级半音值 Si,其最高点是 [max(Si - 1), max(Si), max(Si + 1)] 中的最大值,然后通过以下方程计算该音节的重音级别:
Sti =
{
Simax > Med(S) + 1.5 * δ(S), SS → 2
Simax > Med(S) + 0.5 * δ(S), RS → 1
else, US → 0
}
Forward and Cancel Movement:
为了保持声调轮廓的完整性,重音标签的位置可能会向前移动或取消。对于预标注重音结果不为 0 的音节,根据其音高曲线调整重音标签的位置。第 i 个音节的 STi 向前移动到最近的第 j 个音节(j < i),且 Ti - n ≠ 5,当前 STi = 0。具体算法如下:
Ensure: Si != 0
for i in range(1, len(ST)):
if Ti == 5 and Ti == 3:
# MoveForward
elif Ti == 2:
if max(P_syl[i]) - min(P_syl[i]) < 0.5 * δ(St):
# MoveForward
else:
# Cancel
elif Ti == 4:
if k < 10 and Ti - 1 in [2, 3]:
# Move Forward
elif k > 10 and max(P_syl[i]) < Med(P) + 0.75 * δ(P):
# Cancel
else:
# Cancel
elif Ti == 1 and k:
if k < 15 and max(P_syl[i]) < Med(P) + 0.5 * δ(P):
# Cancel
Supplementary Movement:
用于处理在预标注阶段声调为 T2 或 T3 且重音标签未标记的音节。在考虑降升调和升调时,重音的概率与音节时长高度相关。补充意味着对具有明显时长特征的音节进行重新标注。算法如下:
for i in range(1, len(ST)):
if Ti == 3:
if min(P_syl[i]) <= min(min(P_syl[i]), max(P_syl[i + 1])):
if max(P_syl[i]) == min(P) and Di > max(Di - 1, Di + 1) and Di > avg(Dur):
STi = 2
elif max(P_syl[i]) <= min(P_phr[i]) and Di > avg(D):
STi = 1
elif Tonei == 2:
if k > 30 and abs(ΔO) > 0.5 * Di:
if Di > 1.75 * avg(D):
STi = 2
elif Di > 1.2 * avg(D):
STi = 1
Expand Movement:
用于检测在前面步骤中被遗漏重读的音节。当当前第 i 个音节 Syli 被重读时,如果其前一个音节 Syli - 1 或后一个音节 Syli + 1 的声调为 T1 或 T4,则比较它们的音节级半音值最大值与整个句子的整体音高。扩展表示将重音标签扩展到序列中符合条件的前一个和后一个部分。算法如下:
Ensure: Sti != 0
for i in range(1, len(ST)):
if max(P_syl[i]) > Med(P) + 0.5 * δ(P):
if max(P_syl[i]) - max(P_syl[i + 1]) < 0.45 * δ(P) or max(P_syl[i]) - max(P_syl[i - 1]) < 0.45 * δ(P):
if Ti - 1 in [1, 4]:
# Forward Expansion of STi until condition false
if Ti + 1 in [1, 4]:
# Backward Expansion of STi until condition false
2.2 文本级重音预测
文本级重音预测的主要架构如图 1(a) 所示。基于变压器的预训练模型 ALBERT 被用作基线。与 ALBERT 相比,多个与重音相关的先验信息,包括词汇字符 - 词对、层次韵律、声调模式和章节级上下文信息,被有效地集成到网络中。
输入句子
T = [t1, t2, ..., tN]
,
N
是话语的长度,也是每个音节的重音标签数量
S = [s1, s2, ..., sN]
,在头部和尾部填充
<eos>
和
<bos>
。
字符 - 词汇对信息
Elexicon
通过词汇适配器,该适配器遵循 [14] 的相同设置,用于词汇特征和 ALBERT 表示的深度融合。每个音节的声调和韵律边界从基于多任务 ALBERT 的喜马拉雅自研前端系统中获取,
Etone = eT(Tt)
和
Eprosody = eP(Pt)
,其中
eT
和
eP
分别是大小为 5 和 3 的可训练随机初始化嵌入查找表。此外,受 [6] 的启发,从其对话上下文编码器的类似结构设置中,选择从
Et - 2
到当前句子
Et
长度为
c
的 BERT 句子嵌入序列
Et - 2:t
作为输入,以直接从句子嵌入中提取与重音位置相关的上下文特征。
从预训练的 Albert - Chinese - base 模型进行微调,使用随机初始化的密集层,并使用 CRF 层进行序列标注。在训练过程中,模型的任务是最小化句子级负对数似然损失,在解码阶段,通过维特比算法获得最可能的序列。
2.3 声学模型中的重音建模
为了生成包含富有表现力的重音相关性能的目标梅尔频谱图序列,尝试在声学模型中进行重音建模。声学模型的主要架构遵循 DurIAN,通过添加音素级 f0 和能量的额外预测器进行增强,这些预测器遵循 [19] 的相同设置,并且将实际值量化为可训练的嵌入。由于韵律瓶颈子网络已被证明可以在 TTS 系统中产生显著的性能提升,因此在架构中遵循相同的设置。
如图 1(b) 所示,从基于规则的重音检测器获得的音节级重音标签序列被映射到 IPA 级序列。f0 和能量的预测值被量化为可训练的嵌入,与 128 维重音嵌入和缩放后的时长输出连接,以条件解码器进行语音合成。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[输入音频文件]:::process --> B[数据准备和统计分析]:::process
B --> C[重音检测规则]:::process
C --> D[预标注]:::process
D --> E[前向和取消移动]:::process
E --> F[补充移动]:::process
F --> G[扩展移动]:::process
G --> H[获得重音标签序列]:::process
H --> I[文本级重音预测]:::process
I --> J[声学模型重音建模]:::process
J --> K[生成目标梅尔频谱图序列]:::process
3 实验
3.1 完整的可控制重音 TTS 系统
在整个 TTS 系统中,有两种实现重音的方式:
-
MANUAL
:重音标签序列由专业语言学家根据句子语义手动分配,从 SSML 输入。
-
FE
:重音标签序列由基于 Albert 的前端系统预测。
-
BASELINE
:没有任何重音建模的基线修改 DurIAN 模型。
3.2 实验结果
基于规则的重音提取性能
对重音提取工具的标注结果进行初始音节级手动检查,三位语言专家参与评估阶段。随机选择不同说话人(女性、男性、儿童和老年男性)的 100 个音频样本,以验证基于规则的重音提取工具在检测 Wav 文件中重音的准确性。每个重音标签的精度和 F1 分数如下表所示:
| 说话人类型 | SS(精度) | SS(F1 分数) | RS(精度) | RS(F1 分数) | US(精度) | US(F1 分数) | 准确率 |
| — | — | — | — | — | — | — | — |
| 男性 | 0.9679 | 0.9837 | 0.9760 | 0.9803 | 0.9979 | 0.9953 | 0.9918 |
| 女性 | 0.9714 | 0.9714 | 0.9382 | 0.9255 | 0.9700 | 0.9738 | 0.9619 |
| 儿童 | 1.0000 | 1.0000 | 0.9796 | 0.9143 | 0.9572 | 0.9755 | 0.9648 |
| 老年男性 | 0.9767 | 0.9882 | 0.9518 | 0.9693 | 0.9959 | 0.9878 | 0.9837 |
结果表明,重音检测规则通常可以对不同说话人进行准确的重音检测。
前端模型的准确性
作为一个序列标注任务,重音预测应该考虑所有重音进行评估。将训练好的分类器应用于测试语料库,以预测每个重音的标签。下表显示了在 ALBERT 模型中添加不同特征嵌入组合进行测试时,FE 模型的准确率和宏 F1 分数有所提高。声调和韵律边界对提高预测准确率的影响最大。
| 使用的特征 | 准确率(%) | 宏 F1 |
| — | — | — |
| ALBERT 基线 | 75.46 | 0.3462 |
| 词汇 ALBERT(LA) | 76.01 | 0.4548 |
| LA + 章节 | 76.45 | 0.4532 |
| LA + 声调 | 76.51 | 0.4688 |
| LA + 韵律 | 76.64 | 0.4583 |
| LA + 韵律 + 章节 | 76.31 | 0.4776 |
| LA + 声调 + 章节 | 76.85 | 0.4697 |
| LA + 声调 + 韵律 | 76.87 | 0.5076 |
| LA + 声调 + 韵律 + 章节 | 76.75 | 0.4710 |
消融研究
重音作为一个高级特征,与 f0 和能量密切相关,是韵律特征的细化表达。考虑到 f0 和能量的预测可能会带来一些冲突或负面影响,因此进行消融研究,以探索更好地保留更多重音信息的方法。
随机选择 50 个单长句子和 10 个段落,结果表明,基于规则的检测器生成的准确重音标注使得简单的 128 维重音嵌入足以描述韵律特征,可以取代 f0 和能量等低级特征作为解码器的条件。不同系统在句子和段落级别的平均意见得分(MOS)如下表所示:
| 系统 | 句子 MOS | 段落 MOS |
| — | — | — |
| 重音 | 3.86429 | 3.94375 |
| 重音 + f0&能量建模 | 3.8619 | 3.825 |
| 基线 | 3.77381 | 3.76875 |
相似度
使用梅尔倒谱失真(MCD)来计算合成结果与真实语音之间的差异,使用动态时间规整(DTW)来对齐这两个序列。通过手动重音为每个字符合成 100 个 Wav 样本,与语言学家标注的真实 Wav 进行交叉验证。实验中的较小结果表明,合成语音与真实语音更相似,表明重音标注规则的准确性和在 TTS 系统中建模的更好性能。不同系统的 MCD 结果如下表所示:
| 系统 | MCD |
| — | — |
| 基线 | 7.790668 |
| 重音 + f0&能量建模 | 7.645527 |
| 重音 | 7.260958 |
重音建模和可控性
为了进一步验证重音建模在整个 TTS 系统中的效率以及重音在上下文化场景中的重要性,语言学家设计并采用了 50 组问答测试集,每组包括一个问题及其相应的答案,作为语音合成系统的输入。以下是问答示例,不同的重音位置会产生不同的含义:
- Q1: “张三今天中午吃了【什么】?” (What did Zhang San eat for lunch today?)
- A1: “张三今天中午吃了【粽子】。” (Zhang San had dumplings for lunch today.)
- Q2: “张三【哪天】中午吃了粽子?” (Which day did Zhang San eat dumplings at noon?)
- A2: “张三【今天】中午吃了粽子。” (Today, Zhang San had dumplings for lunch.)
不同系统回答问题的正确性得分如下表所示:
| 系统 | 得分 |
| — | — |
| MANUAL | 4.438 |
| FE | 3.893 |
| 基线 | 3.301 |
结果表明,没有前端和后端重音建模的基线模型在问答上下文中难以表达正确的语义,而两种不同的重音条件方式带来了更准确的语义表示。
音频自然度
对测试集进行平均意见得分(MOS)评估,以衡量音频的自然度。随机选择 50 个句子,不同系统在句子和段落级别的 MOS 如下表所示:
| 系统 | 句子 MOS | 段落 MOS |
| — | — | — |
| MANUAL | 4.139 | 4.210 |
| FE | 4.050 | 3.981 |
| 基线 | 3.73 | 3.820 |
综上所述,本文提出的自动重音标注和预测方法在普通话 TTS 系统中表现出良好的性能,能够提高语音合成的自然度和语义表达准确性。
4 总结与展望
4.1 研究成果总结
本文围绕富有表现力的普通话 TTS 自动重音标注与预测展开了深入研究,取得了一系列重要成果:
-
提出自动重音检测机制
:通过对大规模语料库的分析,提出了基于规则的自动音节级重音检测机制。该机制考虑了音高、时长、相邻静音、相邻声调模式和相邻重音等多种因素,能够有效地从音频文件中标注重音,解决了手动标注耗时且不准确的问题。经过实验验证,该机制对不同说话人(男性、女性、儿童、老年男性)的重音检测都具有较高的精度和 F1 分数,说明其具有较好的通用性和准确性。
-
构建文本级重音预测模型
:以变压器-based 预训练模型 ALBERT 为基线,集成了词汇字符 - 词对、层次韵律、声调模式和章节级上下文信息等多个与重音相关的先验信息,构建了文本级重音预测模型。实验结果表明,声调和韵律边界对提高预测准确率的影响最大,该模型在添加不同特征嵌入组合进行测试时,准确率和宏 F1 分数均有所提高。
-
实现声学模型中的重音建模
:在声学模型中,基于 DurIAN 架构,添加音素级 f0 和能量的额外预测器,并将实际值量化为可训练的嵌入。通过将音节级重音标签序列映射到 IPA 级序列,与 128 维重音嵌入和缩放后的时长输出连接,条件解码器进行语音合成。消融研究表明,基于规则的检测器生成的准确重音标注使得简单的 128 维重音嵌入足以描述韵律特征,可以取代 f0 和能量等低级特征作为解码器的条件。
-
验证系统性能
:通过多种实验对重音可控 TTS 系统的性能进行了全面评估。包括重音提取性能、前端模型准确性、相似度、重音建模和可控性以及音频自然度等方面。实验结果表明,该系统在各个方面都表现出良好的性能,能够提高语音合成的自然度和语义表达准确性。
4.2 研究不足与改进方向
尽管本文的研究取得了一定的成果,但仍存在一些不足之处,需要在未来的研究中加以改进:
-
规则的局限性
:基于规则的重音检测机制虽然在实验中表现出较好的性能,但规则的制定可能无法涵盖所有的语言现象和语境。在一些复杂的句子或特殊的语言表达中,可能会出现重音标注不准确的情况。未来可以考虑结合机器学习和深度学习方法,进一步优化重音检测规则,提高其适应性和准确性。
-
特征融合的深度
:在文本级重音预测模型中,虽然集成了多个与重音相关的先验信息,但特征融合的深度还可以进一步加强。可以探索更有效的特征融合方法,充分挖掘不同特征之间的潜在关系,提高模型的预测能力。
-
系统的鲁棒性
:在实际应用中,TTS 系统可能会遇到各种不同的输入和环境条件。目前的研究主要集中在特定的语料库和实验设置下,系统的鲁棒性还有待提高。未来可以通过增加训练数据的多样性、引入对抗训练等方法,增强系统在不同场景下的稳定性和可靠性。
4.3 未来研究展望
随着语音技术的不断发展,富有表现力的普通话 TTS 还有很大的研究空间。未来的研究可以从以下几个方面展开:
-
多模态信息融合
:除了音频和文本信息外,还可以考虑融合视觉、情感等多模态信息,进一步提高语音合成的表现力和自然度。例如,结合面部表情、肢体语言等信息,使合成语音更加生动和富有感染力。
-
个性化语音合成
:根据不同用户的需求和偏好,实现个性化的语音合成。可以通过收集用户的语音样本、情感倾向等信息,为用户生成具有独特风格和特点的语音。
-
实时交互应用
:将重音可控 TTS 技术应用于实时交互场景,如智能客服、语音助手等。在实时交互中,能够根据用户的输入和上下文动态调整重音,提高交互的自然度和流畅性。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[当前研究成果]:::process --> B[改进规则局限性]:::process
A --> C[加强特征融合深度]:::process
A --> D[提高系统鲁棒性]:::process
B --> E[结合机器学习优化规则]:::process
C --> F[探索更有效特征融合方法]:::process
D --> G[增加训练数据多样性]:::process
D --> H[引入对抗训练]:::process
E --> I[多模态信息融合研究]:::process
F --> I
G --> I
H --> I
I --> J[个性化语音合成]:::process
I --> K[实时交互应用]:::process
总之,富有表现力的普通话 TTS 自动重音标注与预测是一个具有重要研究价值和应用前景的领域。通过不断地探索和改进,有望为用户带来更加自然、生动、富有表现力的语音合成体验。
超级会员免费看
589

被折叠的 条评论
为什么被折叠?



