本文介绍 一篇文章教你语音合成入门,训练一个中文语音tts

一篇文章教你语音合成入门,训练一个中文语音tts

我是熬着夜写完了这篇教程,并且眼泪充满了泪水。因为坑实在是太深了。如果你觉得文章对你有用,请点个赞在做,顺便评论一下,要讲武德.

话说,我一直有一个小目标,就是自己动手做一个tts合成AI,虽然我也算是CV的杠把子吧,但是真的跨行如隔山啊,没办法,语音合成AI还是要搞。于是我了一下要做一个这样的tts需要哪些东西,首先要掌握就是信号处理的一些知识点,比如声音频谱编码解码,各种频谱怎么看,信号分离与合成,声音频谱的合成与播放,如何构建tacotron,如何用melgan润色声音,如何对中文进行分词,如何添加停用词,如何在cuda11上安装tensorflow2.0等等,这的那的一大堆。这些坑一路才下来,我就想吧这个流程记录一下,给后来想入门训练一个类似的中文语音合成器的朋友提供一个前人之路以供导向。

首先请大家做好心理准备,如果你是一位初学者,也就是语音方面的小白,我建议你不要再去百度网上一些乱七八糟的过了时的教程了,放到现在基本上不work了。比如librosa保存wav无法用pyaudio播放?比如你的wave无法读取你保存的wav波形?比如你的tacotron训练出来的声音有杂音等等,这些问题网上几乎没有什么答案。当你看完我这个教程,应该这些坑都会遇到,而我会给你一一解答,因为我已经成功的训练了一个语音AI,效果还不错. 相关代码包含训练和demo预测的(就是你输入txt文本,你的电脑就发出声音的端到端的程序)都会在文末提供。大家可以先收藏后面再仔细查看。

语音合成效果

先展示一下我们的合成效果:

image-20201128205016447

这是基于baker数据集训练的中文语音合成AI。

我把音频也上传了Bilibili,感兴趣的朋友可以打开下面的哔哩哔哩链接听听。

效果还是蛮不错的,我们可以做到这么几点:

  • 给定文字,只会生成这些文字的语音,不会具有杂音;
  • 自动给文字添加停用词,分词,和注音。
  • 使用了MelGAN来做润色,整个生成的声音是通过Mel频谱进一步通过GAN生成最终音频,效果更为逼真。
  • 支持tflite部署

好了,接下来把整个训练过程记录下来,大家可以按照教程一步一步来准备数据,训练,以及合成。当然如果你不想训练,你想直接尝试,我也把训练好的tacotron2的中文模型,和Melgan的模型上传到了百度云,感兴趣的朋友可以直接下载跑一跑尝试。

应广大群友所求,我把跑了五天的模型下载链接放这里,有需要的朋友可以下载inference了一波:

链接: https://pan.baidu.com/s/150yFRWpKTcwwMuXVnT_Svg 提取码: 6kux 复制这段内容后打开百度网盘手机App,操作更方便哦

数据准备

我们需要用到的数据集为baker,可以从这里下载:https://www.data-baker.com/ 不过现在官网好像没有直接的下载链接,大家可以多百度一下看看有没有云盘链接,应该很好找。

这个数据集长啥样呢?它大概这样:

image-20201129155342325

其中PhoneLabeling里面包含就是标注,不过这部分标注我们不会用,我们需要的是这个标注文件:ProsodyLabeling:

000001	卡尔普#2陪外孙#1玩滑梯#4。
	ka2 er2 pu3 pei2 wai4 sun1 wan2 hua2 ti1
000002	假语村言#2别再#1拥抱我#4。
	jia2 yu3 cun1 yan2 bie2 zai4 yong1 bao4 wo3
000003	宝马#1配挂#1跛骡鞍#3,貂蝉#1怨枕#2董翁榻#4。
	bao2 ma3 pei4 gua4 bo3 luo2 an1 diao1 chan2 yuan4 zhen3 dong3 weng1 ta4
000004	邓小平#2与#1撒切尔#2会晤#4。
	deng4 xiao3 ping2 yu3 sa4 qie4 er3 hui4 wu4

可以看到,这个标注的意义很简单,就是文本的发音标注,很多人肯定不知道这个 #1 #2是啥意思,这个就是Prosody。什么?你不认识这个单词?去百度一下吧,其实我也不知道韵律到底是个啥玩意。大概就是和平仄差不多吧?

我们不深究这个韵律对于最终合成效果会产生什么样的影响,反正就知道有这么个东西就行了。

假设你已经准备好了数据集,接下来我们要进行下一步的操作。开始写代码。

我们需要将这个仓库克隆下来:

git clone https://github.com/TensorSpeech/TensorFlowTTS.git

是的,没错,我们这篇教程将会基于这个开源的tts来构建,但是需要注意的是,并不是意味着我们直接那开源的来用,因为英文和中文是两码事,训练中文要复杂的多,其中需要踏过的坑也不少。

不过没关系,我们继续接着一步一步的走。

数据处理

你已经把代码clone下来了,接下来请安装一下。你还需要两个步骤:

  • 你需要把数据处理成训练需要的格式;
  • 你需要配置用于训练的config文件。

你安装完后,就可以运行这条命令:

tensorflow-tts-preprocess --dataset baker --rootdir /media/samsung/datasets/voice/Biaobei --outdir dump --config ./preprocess/baker_preprocess.yaml 

然后你就可以看到dump生成的东西。这便是我们训练所需要的资料。

image-20201129155626133

然后接着要做什么?

对了,别忘了很重要的一步:对数据进行标准化:

tensorflow-tts-normalize --rootdir ./dump --outdir ./dump --dataset baker --config preprocess/baker_preprocess.yaml

这一步运行完成之后,你就会得到你需要的标准化的内容。事实上我们上面的截图是我已经跑完这条命令的结果。

很好,这一步我们已经完成了。接下来大家可能比较好奇,这个步骤里面,那个yaml到底是提供了一些什么东西?

直接把baker.yml拿过来看看:

###########################################################
#                FEATURE EXTRACTION SETTING               #
###########################################################
sampling_rate: 24000     # Sampling rate.
fft_size: 2048           # FFT size.
hop_size: 300            # Hop size. (fixed value, don't change)
win_length: 1200         # Window length.
                         # If set to null, it will be the same as fft_size.
window: "hann"           # Window function.
num_mels: 80             # Number of mel basis.
fmin: 80                 # Minimum freq in mel basis calculation.
fmax: 7600               # Maximum frequency in mel basis calculation.
global_gain_scale: 1.0   # Will be multiplied to all of waveform.
trim_silence: true       # Whether to trim the start and end of silence.
trim_threshold_in_db: 60 # Need to tune carefully if the recording is not good.
trim_frame_size: 2048    # Frame size in trimming.
trim_hop_size: 512       # Hop size in trimming.
format: "npy"            # Feature file format. Only "npy" is supported.

这里的一些配置,诸如采样率,FFT的窗口大小,霍普大小,梅尔频谱的数目等等,就都在这里面设置了。当然你无需关心这些东西,你大概只需要知道,这就好像是你在cv里面,需要对图片进行去均值归一化一样。

不过请记住采样率,因为后面我们将声波还原为声音信号的时候会用到它。

开始训练

那么接下来就是开始训练了。

如果你上面步骤都没有出错,那么请接着开始训练。这是训练的命令:

python examples/tacotron2/train_tacotron2.py --train-dir ./dump/train/ \
  --dev-dir ./dump/valid/ \
  --outdir ./examples/tacotron2/exp/train.tacotron2.baker.v1/ \
  --config ./examples/tacotron2/conf/tacotron2.baker.v1.yaml \
  --use-norm 1 \
  --mixed_precision 0 \
  --resume examples/tacotron2/exp/train.tacotron2.baker.v1/checkpoints/

请注意,这里面的config文件,请使用官方的文件,不要任意修改。最后一行是如果你跑了一半显卡lost了,就resume,如果是第一次kick off,可以不加。

训练跑起来大概是这个样子:

image-20201129160400042

剩下,就是等它跑完了。此时我们可以下楼去买杯咖啡了。。。

接着训练MelGAN模型

你已经把tacotron2训练完了?别着急,还有MelGAN模型训练。

MelGAN是什么?有什么用?

简单来说,tacotron2生成的mel频谱,并不能直接生成音频,它需要再重构才能生成声波,进而生成音频,而这一步就是通过Melgan来完成的。

image-20201129161041334

image-20201129161028059

感兴趣的朋友,也可以查看一下原始论文学习一波。

训练Melgan的命令为:

python examples/multiband_melgan/train_multiband_melgan.py --train-dir ./dump/train/ \
  --dev-dir ./dump/valid/ \
  --outdir ./examples/multiband_melgan/exp/train.multiband_melgan.baker.v1/ \
  --config ./examples/multiband_melgan/conf/multiband_melgan.baker.v1.yaml \
  --use-norm 1 \
  --generator_mixed_precision 1 \
  --resume ""

训练完之后,就可以。。。开始demo啦!!

合成

合成这部分代码比较复杂,而且tensorflowTTS这个仓库里面没有现成的代码,简单来说就是我们需要拿到中文句子,然后分词,加上停用词,注音,加上音律,再map成id,load模型,生成mel图谱,再送入MelGAN中生成音频。

最后将声音发出来。

image-20201129161450758

我把所有的代码都会放在神力平台,感兴趣的朋友可以去下载。不过我个人是非常拒绝反感伸手党的,你如果不需要可以出门左拐github,不需要来diss我们这些辛苦写代码,写文章得人,我们永远只向新手传播知识。

http://manaai.cn/

预告

有了语音合成器,我们还差什么?差一个聊天机器人!!!

我们很久很久以前,有实现一个基于中文语料的transformer的聊天机器人,但是听说最近GPT3比较牛叉,不知道再中文下是一个什么样的效果,有时间我们将会就这个写一篇入门教程。

更多

image-20200820181257044

如果你想学习人工智能,对前沿的AI技术比较感兴趣,可以加入我们的知识星球,获取第一时间资讯,前沿学术动态,业界新闻等等!你的支持将会鼓励我们更频繁的创作,我们也会帮助你开启更深入的深度学习之旅!

image-20200515153654923

往期文章

https://zhuanlan.zhihu.com/p/165009477

https://zhuanlan.zhihu.com/p/149398749

https://zhuanlan.zhihu.com/p/147622974

https://zhuanlan.zhihu.com/p/144727162