update at 2020-10-3 添加微调分支adaptive
- 开源中文语音数据集标贝(女声)训练中文TacotronV2,实现中文到声学特征(Mel)转换的声学模型。在GTA模式下,利用训练好的TacotronV2合成标贝语音数据集中中文对应的Mel特征,作为声码器WaveRNN的训练数据。在合成阶段,利用TactornV2和WaveRNN合成高质量、高自然度的中文语音。
- 从THCHS-30任选一个speaker的语音数据集,微调TacotronV2中的部分参数,实现说话人转换branch adaptive。
- Tensorflow serving + Flask 部署TacotronV2中文语音合成服务。
由于TacotronV2TacotronV2中采用Location sensitive attention,对长句字的建模能力不好(漏读、重复),尝试了GMM attention、Discrete Graves Attentionissue、Forward attention,能有效地解决对长句的建模能力,加快模型收敛速度。
tensorflow-gpu的版本为1.14.0
**参照requirements.txt**安装相应的库
git clone https://github.com/lturing/tacotronv2_wavernn_chinese.git
cd tacotronv2_wavernn_chinese
python tacotron_synthesize.py --text '现在是凌晨零点二十七分,帮您订好上午八点的闹钟。'
#合成的wav、attention align等在./tacotron_inference_output下
#由于在inference阶段,模型中的dropout没有关闭,相同的输入text,合成的wav的韵律等有轻微的不同
对于中文标点符号,只保留',。?!'四种符号,其余符号按照相应规则转换到这四个符号之一。
中文到拼音转换code
利用字拼音文件和词拼音文件,实现中文到拼音转换,能有效消除多音字的干扰。具体步骤如下:
- 对于每个句子中汉字从左到右的顺序,优先从词拼音库中查找是否存在以该汉字开头的词并检查该汉字后面的汉字是否与该词匹配,若满足条件,直接从词库中获取拼音,若不满足条件,从字拼音库中获取该汉字的拼音。
- 对于数字(整数、小数)、ip地址等,首先根据规则转化成文字,比如整数2345转化为二千三百四十五,再转化为拼音。
- 由于输入是文字转化而来的拼音序列,所以在合成阶段,允许部分或全部的拼音输入。
注优先从词文件中寻找拼音,也会带来错误的拼音(也许先分词能解决),所以本项目支持中文和拼音混合输入
修改hparams.py中标贝数据集的路径
dataset = '/home/spurs/tts/dataset/bznsyp', #标贝数据集的根目录,其wav文件在 dataset/bznsyp下
base_dir = '/home/spurs/tts/dataset',
feat_out_dir = 'training_data_v1',
tacotron_input = '/home/spurs/tts/dataset/bznsyp/training_data_v1/train.txt',
执行如下脚本,生成TacotronV2的训练数据集
python tacotron_preprocess.py
执行如下脚本,训练TacotronV2模型
python tacotron_train.py
TacotronV2生成Mel文件,利用griffin lim算法恢复语音,修改脚本 tacotron_synthesize.py 中text
python tacotron_synthesize.py
或命令行输入
python tacotron_synthesize.py --text '国内知名的视频弹幕网站,这里有最及时的动漫新番。'
由于TacotornV2中采用的注意力机制是Location sensitive attention,对长句子的建模能力不太好,尝试了以下注意力机制:
由于语音合成中的音素(拼音)到声学参数(Mel频谱)是从左到右的单调递增的对应关系,特别地,在合成阶段,对forward attention中的alignments的计算过程的特殊处理,能进一步提高模型对长句子的语音合成效果,以及控制语速。
TactronV2支持finetune,固定decoder层前的参数(embedding层、CHBG、encoder层等),用新数据集(数据量很少)训练从checkpoint中恢复的模型,达到speaker adpative的目的。
利用训练好的TacotronV2对标贝语音数据集在GTA(global teacher alignment)模式下,生成对应的Mel特征。需要注意的如下:
- TacotronV2中的mel输出的范围为[-hparmas.max_abs_value, hparams.max_abs_value],而WaveRNN中的mel的范围[0, 1],故需要将TacotronV2输出mel特征变为[0, 1]范围内。
- TacotronV2中的hop_size为275,需要将WaveRNN中的voc_upsample_factors的值改为(5, 5, 11)(注上采样的比例, 或者(x, y, z),并且x * y * z = hop_size)。
- Wavernn中voc_mode设为RAW,bits为10,故需要将wav文件转换到相应格式。
python wavernn_preprocess.py #利用训练好的TacotronV2生成Wavernn的训练数据
训练前需要切换到pytorch conda环境,例如:
conda activate torch1.0 #切换到pytorch分支
训练模型
python wavernn_train.py
python wavernn_gen.py --file path_to_mel_generated_by_tacotronv2
website
采用Tensorflow Serving + Docker 来部署训练好的TacotronV2语音服务,由于需要对文本进行处理,还搭建了Flask后台框架,最终的语音合成的请求过程如下:
请求过程:页面 -> Flask后台 -> Tensorflow serving
响应过程:Tensorflow serving -> Flask后台 -> 页面