随着人机交互技术的发展,语音合成技术逐渐进入了我们的视野。语音合成即文本转语音(text-to-speech,TTS),是一种将文本转化为自然流畅的语音的技术。
以我们熟悉的智能语音助理Siri为例,Siri是Speech Interpretation & Recognition Interface[1]的缩写,其中涉及到了很多的语音技术与自然语言处理技术。在我们说出“嗨,Siri”的唤醒词时,Siri用到了语音关键词检测(spoken keyword spotting, KWS),进入到交互状态,我们向Siri说“查询今天的天气”,Siri会用自动语音识别(automatic speech recognition,ASR)将语音转换为文本,再经过自然语言理解,返回需要播报的文本,这时就需要语音合成技术来将文本转换为语音播报出来,这整个流程可以作为语音人机交互的一个典型的范例。
语音合成的历史
语音合成的理论体系已经发展了很多年,在基于深度神经网络的语音合成系统广泛应用之前,传统的语音合成方法已经经历了几个重大的发展阶段。
早期方法
早期的语音合成方法有物理语音合成法和电语音合成法[2,3],这两种方法只是做出了初步的探索,通过物理方法或脉冲信号与滤波器模拟人的发声器官和发声原理,合成的语音质量还远远达不到实际应用的要求。
拼接法
拼接法是通过对预录制的高质量自然语音进行拼接来合成语音的语音合成方法。
基于波形拼接的语音合成首先需要构建语料库,语料库内需要语音段与其对应的拼接单元,需要按照拼接单元切分原始录制的语音得到[4,5]。在进行合成阶段时,首先需要从输入的待合成文本得到拼接单元序列,以及进行单元选择时所需要的音节发音信息、音节位置信息、音节时长信息、词位置信息、韵律短语位置信息、语调短语位置信息、音节边界信息、词性等等。然后根据事先设定的规则,从语音库中进行预筛选,挑选出一些可能可以进行合成的候选单元,然后利用单元选择算法,比如利用动态规划算法寻找最近路径,选择出最优的合成单元。最后将挑选出的最优的合成单元进行波形调整、波形拼接,得到最终的语音结果。
拼接法可能是合成高自然度、高可懂度语音的最简单的方法。但是拼接合成法通常相比其他方法需要更多的、更高质量的语音数据,以便覆盖所有可能的拼接单元组合,且只能合成训练语料库中的说话人的语音。
参数法
随着统计机器学习技术的发展和大型语料库可用性的提升,通过应用统计学习算法来构建语音合成系统渐渐变得可行,这便是基于参数的语音合成技术。
基于参数的语音合成系统中最常用的算法模型是隐马尔科夫模型(HMM)。
统计参数语音合成系统通常由三个部分组成:文本分析模块、参数模型模块(声学模型)、声码器模块[6]。其中,文本分析模块又包含文本正则化、音素转换模块和分词模块等。在训练阶段,首先需要对训练语料库的文本数据进行文本分析,提取音素、音素时长、词性等不同粒度的文本特征。然后用声码器模块从训练语料库的语音数据中提取频谱、基频等声学特征作为声学模型训练参数特征,用文本特征和声学特征对训练声学模型[7,8]。在推理阶段,需要先对待合成文本进行文本分析,将得到的文本特征输入训练好的声学模型得到预测的频谱、基频等参数特征,然后输入声码器转化为语音。
基于参数的语音合成系统可以在语料库上自动地进行训练,具有较高的灵活性,可以生成较为自然的语音,并且可以再现原始说话人的声音特征,且在数据成本、内存等方面都优于基于波形拼接的语音合成系统。但是基于参数的语音合成技术使用的统计学习算法建模能力一般,且模型的文本前端输入单一,这带来了合成语音过平滑,自然度、音质一般的问题[7,8]。
端到端语音合成
随着深度学习、神经网络技术的高速发展,端到端语音合成模型打破了统计参数语音合成系统的结构,将其中不同的模块进行了融合,简化了特征工程的难度,提高了合成的效果。
端到端演化历程
语音合成模型的端到端演化历程如图所示[10]。
阶段0:统计参数语音合成系统。
阶段1:将文本分析与声学模型合二为一进行端到端的尝试,直接从音素序列预测得到声学特征,然后送入统计参数语音合成的声码器中生成语音波形。
阶段2:深度学习时代语音合成模型端到端的初尝试,可以被认为是统计参数语音合成系统中声学模型和声码器的组合,输入为语言学特征,输出为语音,所以依旧需要文本分析模块。
阶段3:Tacotron[9]进一步简化了语音合成系统的结构,将统计参数语音合成系统中文本分析模块和声学模型合并,省略了文本分析模块中繁琐的子模块和专家知识。
阶段4:完全端到端模型,直接从音素串或文本生成语音。
端到端语音合成系统架构
现在常用的端到端语音合成系统架构如图所示。
1、TTS前端:
不同于参数法中的文本分析模块需要进行复杂的文本分析,端到端合成模型的文本前端一般只需要在进行文本正则化(text normalization)和单词转音素(Grapheme-to-Phoneme,G2P)。文本正则化,即将文本中的表达进行规范化和消歧,以便于后续的文本处理流程,例如将62%转换为百分之六十二,将编号27149转换为编号二七一四九。文本在被正则化后就会进行单词转音素得到音素串(音素是构成音节的最小单位),甚至可以直接将字母输入到声学模型中。通常也会对文本进行韵律预测来提升合成的自然度,但是这一步不是必选项。
2、TTS后端:
TTS系统的后端部分通常由声学模型和声码器组成。整个TTS系统最后输出的目标为语音。以10秒的语音为例,假设采样率为16k,语音波形采样点的数目便为160k,这个序列长度相比输入的文本长度提升了数个数量级,所以TTS后端模型常常分为声学模型和声码器,通过预测中间谱特征来降低模型的学习压力。声学模型预测得到了中间谱特征,再由声码器从谱特征得到语音信号。
1) 声学模型
声学模型的任务是从输入的文本信息还原语音中蕴含的音色信息、韵律信息和情感信息等等。声学模型本质上是一个一对多的回归任务,同一文本的韵律、风格可能会有很多种不同的表达,所以学习难度相对较高,最后合成语音的自然度很大程度上受声学模型影响。
声学模型还有一个需要重点解决的问题是对齐问题,输入的音素串序列和输出的谱特征序列应该有一个映射关系,即每个音素对应谱特征序列中的哪些部分。这个对齐关系有三个特点:本地性、单调性、完备性。本地性即每帧谱特征只会对应一个音素,单调性即谱特征序列中两帧a和b,若a在b之前,则a对应的音素也一定在b对应的音素之前,完备性即每个音素都需要发音,即每个音素都有自己对应的谱特征,违背完备性会发生跳字的问题。针对对齐问题,现在常见的解决方案有两种:注意力机制和时长预测模型,注意力机制即让模型学习每帧特征应该对应哪部分音素;时长预测模型则是直接对每个音素的持续时长,即在谱特征中对应的子序列长度进行预测。
2) 声码器
声码器的任务是从谱特征预测最后的语音信号。现在常用的谱特征为梅尔谱,在梅尔谱的提取阶段有三个关键步骤:短时傅里叶变换,将信号从时域转换到频域;对短时傅里叶变换的结果取平方,这一步消除了相位信息;梅尔滤波,根据事先设计的滤波器来取得符合人听感知效应的特征。所以声码器需要做到这三件事:复原原先尺度的幅度谱;重构相位;从频域信号转换为时域信号。声码器任务本质上相当于是一个一对一的回归任务,预测难度会低于声学模型。
由于声学模型和声码器是分别进行训练,声学模型预测得到的特征和真实特征肯定会有一定的差别,这引领TTS模型迈入完全端到端时代。完全端到端语音合成模型将声学模型和声码器合二为一,省去了人工设计的中间特征,简化了训练流程,减少了声学模型和声码器的不匹配问题,是近年TTS领域研究的热点。
ESPnet
ESPnet是一个端到端的语音处理工具包,主要面向端到端语音识别和端到端语音合成[11]。ESPnet中包含了多种语言、多种常用模型,单说话人和多说话人的语音合成模型训练和推理示例。这次我们以标贝开源的中文标准女声语料库库(Chinese Standard Mandarin Speech Copus,csmsc)[12]为例演示语音合成模型的训练和推理流程。
ESPnet的语音合成运行脚本包含有九个阶段。阶段1-7包含了数据准备、训练和推理阶段,我们在此简单介绍。阶段8-9是将训练好的模型打包并上传到Zenodo,与本文关系不大。
阶段1:数据准备。该阶段创建了Kaldi风格的数据目录,为后面的特征提取做准备。
阶段2:文件列表/ Embedding准备。将
音频文件列表整理为wav.scp,放在数据目录下。ESPnet同时支持加入X向量(一种在说话人识别中使用的向量)进行训练,该向量也在本阶段进行提取,单说话人训练的话不需要进行X向量的提取。
阶段3:移除时长过长或过短的音频。
阶段4:文本单元生成。本阶段对数据集的文本进行处理,首先进行文本正则化,然后对文本进行转换。ESPnet对常见的语言,如英中日韩等语言都有对应可用的文本前端支持。如中文,以“卡尔普陪外孙玩滑梯”为例,转换为拼音对应的是“ka3 er3 pu3 pei2 wai4 sun1 wan2 hua2 ti1”,转换为音素则是“k a3 er3 p u3 p ei2 uai4 s un1 uan2 h ua2 t i1”,ESPnet在中文数据集csmsc上默认使用该形式进行处理。
阶段5:特征提取。提取声学特征并进行归一化。
阶段6:TTS模型训练。
阶段7:TTS解码。即进行推理流程,合成语音。
ESPnet在数据集csmsc上的示例脚本在路径egs2/csmsc/tts1中。该脚本支持FastSpeech、FastSpeech2、VITS等模型的训练和推理流程,且已经完成了该数据集上的数据准备和特征提取的代码。
我们以VITS作为样例讲解如何利用ESPnet训练语音合成模型并进行推理。
egs2/csmsc/tts1/run.sh为运行的主脚本。
#包含了特征提取的超参数
fs=24000
n_fft=2048
n_shift=300
win_length=1200
#指定训练、验证、 测试数据目录
train_set=tr_no_dev
valid_set=dev
test_sets="dev eval1"
#指定训练和推理的设置文件
train_config=conf/train.yaml
inference_config=conf/decode.yaml
#指定文本前端
g2p=pypinyin_g2p_phone
#从阶段1开始执行语音合成训练、推理脚本
./tts.sh
--lang zh
--feats_type raw
--fs "${fs}"
--n_fft "${n_fft}"
--n_shift "${n_shift}"
--win_length "${win_length}"
--token_type phn
--cleaner none
--g2p "${g2p}"
--train_config "${train_config}"
--inference_config "${inference_config}"
--train_set "${train_set}"
--valid_set "${valid_set}"
--test_sets "${test_sets}"
--srctexts "data/${train_set}/text"
${opts} "$@"
我们查看conf/train.yaml中默认的设置文件为tuning/train_tacotron2.yaml,conf/decode.yaml中默认的设置文件为tuning/decode_tacotron2.yaml,而conf/tuning文件夹中包含多种声学模型和完全端到端模型的训练和推理设置文件,如果想要设置为VITS,我们只需要将conf/train.yaml内容改为tuning/train_ vits.yaml,conf/decode.yaml内容改为tuning/decode_vits.yaml。
该脚本不支持合成任意的文本。如果我们想随便合成一条文本的话,ESPnet对推理过程进行了封装。
#导入推理封装的接口
from espnet2.bin.tts_inference import Text2Speech
#导入本地训练好的模型
tts = Text2Speech.from_pretrained(model_file="/path/to/model.pth")
#如果我们不希望自己进行训练模型的步骤,我们可以导入ESPnet官方训练好的模型
tts = Text2Speech.from_pretrained(model_tag="kan-bayashi/csmsc_vits
", vocoder_tag="none")
#推理
wav = tts("卡尔普陪外孙玩滑梯")["wav"]
参考文献:
1.https://baike.baidu.com/item/Siri/32248?fr=aladdin
2.Dudley H, Riesz R R, Watkins S S. A synthetic speaker [J]. Journal of the Franklin Institute,1939, 227(6): 739-76
3.Ladefoged P, Broadbent D E. Information conveyed by vowels [J]. The Journal of the acoustical society of America, 1957, 29(1): 98-1
4.Iwahashi N, Kaiki N, Sagisaka Y. Concatenative speech synthesis by minimum distortion criteria [C]//Acoustics, Speech, and Signal Processing, IEEE International Conference on: volume 2. IEEE Computer Society, 1992: 65-68.
5.Campbell N, Black A W. Prosody and the selection of source units for concatenative synthesis
[M]//Progress in speech synthesis. Springer, 1997: 279-292
6.Rabiner L R. A tutorial on hidden markov models and selected applications in speech recognition [J]. Proceedings of the IEEE, 1989, 77(2): 257-286.
7.Zen H, Toda T, Nakamura M, et al. Details of the nitech hmm-based speech synthesis system for the blizzard challenge 2005 [J]. IEICE transactions on information and systems, 2007, 90 (1): 325-333.
8.Tokuda K, Yoshimura T, Masuko T, et al. Speech parameter generation algorithms for hmm-based speech synthesis [C]//2000 IEEE International Conference on Acoustics, Speech, and Signal Processing. Proceedings (Cat. No. 00CH37100): volume 3. IEEE, 2000: 1315-1318.
9.Wang Y, Skerry-Ryan R J, Stanton D, et al. Tacotron: Towards end-to-end speech synthesis[J]. arXiv preprint arXiv:1703.10135, 2017.
10.Tan X, Qin T, Soong F, et al. A survey on neural speech synthesis[J]. arXiv preprint arXiv:2106.15561, 2021.
11.https://espnet.github.io/espnet/index.html
12.https://www.data-baker.com/open_source.html
关于我们
21dB声学人是中国科学院声学研究所苏州电声产业化基地旗下科技媒体,专注于声学新技术、音频测试与分析、声学市场调研、声学学习社群建设等。