我是kantts群里的老友了,群里有很多热心肠的人安念、马静等很多老哥,还有群主格真、渡航等开源作者的支持。在里面摸爬滚打了3天,现在才能出这个教程。
因为kantts多年没维护了,只有简单的运行教程,很多深入的,比如底膜训练这些,目前没有教程。这些就得靠问。经过我测试,以及问,最终得到了以下完整的教程。
为什么训练底膜?
因为kantts的英文效果不好,是底膜数据量太少导致的。
下面给不懂的网友解释一下几个概念
底膜:是多个人大量数据训练而成的模型,主要是来识别人声和语言的发音
预训练模型:在底膜基础上进行再次少量训练,用于后面推理合成新声音的模型
声码器和声学模型是什么?
在kantts中
声码器是voc---也叫HifiGAN
声学模型是am---也叫Sambert
你在tts里面以及教程里面看到都是这个意思,一定要熟记。
am就是人的发音,voc就是把发音转成梅尔图。
解释:梅尔图就是一张图,里面就是声波的高低,如果和原声生成的图越像则说明声音越像。
基本概念
哪些配置很重要,如何替换?
预训练微调代码里有个model_id,这个指向的就是你训练好的底膜。
声码器训练的教程
training_sambert · alibaba-damo-academy/KAN-TTS Wiki · GitHub
训练出来的结果就是
你只有ckpt,config.yml这些东西。
预训练weitiao(basemodel_weitiao.py)的逻辑得知道,这样你才能改。
底膜就是model_id,所以只用改model_id就行
执行weitiao后, 代码中的model_id指向目录,里面只有configuration.json和resource.zip有用,他会根据configuration.json去找。
resouce.zip是固定的,假设你选择的配置文件是16k.yml训练,那么就去对应的modelscopoe的模型文件里面下载就行了
configuration.json的修改地方
如果你用他的,那就是F7,用自己的改成voice_name,注意想用他的声码器,他就必须F7
否则就要自己练个声码器,声码器参考HifiGAN模型
config.yml的修改地方
因为你用了别人的声码器,你就必须保持一致也用F7
然后就没啥注意的了。
模型是ckpt
另外没有保存的模型默认是-,如果启动可能报错ckpt,最好不要用没有自动保存的,这种直接删除就行。ckpt没有保存的里面是缺东西的,合成和再次训练都会报错。
正式操作
前提是你环境已经安装好了,环境就拉镜像
克隆音-自用教程-CSDN博客
SambertHifigan个性化语音合成-中文-预训练-16k
底膜训练
我们合成用的是多人预训练个性化模型,他对应的参数是
config要选择含se的
1.上传多人(底膜训练数据)音频,进行切分,切分成8秒以下的
给定输入目录,和输出目录
执行python run.py(这是我自己的改的脚本)
地址:对音频切分成小音频(机器学习用)_我要用代码向我喜欢的女孩表白的博客-CSDN博客
2.对切分好的音频进行标注
给定输入目录(这层的输入目录是上一层的输出目录),给定输入目录
执行python run_auto_label.py (这个是modelsope的脚本,我已经放到容器里了)
3.执行数据处理(这一步用源码执行)
给定输入目录,输出目录
这里要修改源码.否则会报错no import sys,还有一个是没有se.model
改KAN-TTS/kantts/preprocess/data_process.py
加一个import sys
改KAN-TTS/kantts/preprocess/se_processor/se_processor.py
se_processor.py
defalut="speaker_embedding/se.model" ---改成这个
这个文件的地址要自己下载下来,去官网的模型文件里下载,如下图
运行
python kantts/preprocess/data_process.py --voice_input_dir YOUR_DATA_PATH --voice_output_dir OUTPUT_DATA_FEATURE_PATH --audio_config AUDIO_CONFIG_PATH --speaker YOUR_SPEKER_NAME
AUDIO_CONFIG_PATH用目录中的audio_config_se_16k.yaml 代表的是个性化多人底膜,否则后面用多人模型推理的时候会出线宽度不一致的问题。
这个YOUR_SPEAKER_NAME我写的是F7,就不用改,你也可以改成别的,默认modelscopoe里面合成的代码是F7,改完之后,你合成的时候记得也要改成对应的。
4.执行训练(也是用源码)
因为我们这个底膜训练是训练的声学模型,声学模型是am,也就是sambert
配置文件选择sambert_se_nsf_global_16k.yaml(改一下这个)
建议修改一下这个配置文件,因为这个保存的太频繁了,100step就保存一次模型,等训练几百万部磁盘肯定是不够的。我们设置每20000次保存一次模型。弄好之后建议把其他旧的模型给删掉,否则每训练一个人他会复制之前保存过的旧模型,就会指数级增大。
CUDA_VISIBLE_DEVICES=0 python kantts/bin/train_sambert.py --model_config YOUR_MODEL_CONFIG --root_dir OUTPUT_DATA_FEATURE_PATH --stage_dir TRAINING_STAGE_PATH
然后等待个2天.... 把训练停止
5.修改底膜文件夹
经过我们的训练后,DiMoSe里面的声学模型训练好了,这里面只有声学相关的,此时还不能用,我们要把训练好的声码器模型也放进来,并且把格式变成和从网上下载来的(speech_personal_sambert-hifigan_nsf_tts_zh-cn_pretrain_16k)类似文件夹层级,这样就可以不用改modelscpoe合成的代码,等会可以直接推理。
复制speech_personal_sambert-hifigan_nsf_tts_zh-cn_pretrain_16k的
resource.zip、configuration.json、basemodel_16k到这个目录下。
如果你修改了名称的话,configuration.json中的名称你也要修改。没有修改的话就默认F7
然后将你训练好的ckpt替换basemodel_16/sambert目录的ckpt,并且替换config.yml文件
(本质就是替换底膜的am模型)
说明:
resource.zip
configuration.json 是后面以此为底膜而训练的模型的model_id的指向位置
basemodel_16就是底膜相关的模型,要替换的部分。
测试声学模型底膜
1.上传单人要训练的数据,切分成8秒以下的
2.音频标注
和上面一样
3.用modelscope的预训练进行训练
修改微调的代码basemodel_weitiao.py(modelscope)
将pretrained_model_id的地址指向你刚刚合成好的底膜文件夹
改你要训练人的输入目录和输出目录
然后用执行
python basemodel_weitiao.py
然后得到了一个模型,将这个模型文件夹放过去(这里已经在底膜训练中,把底膜格式封装好了,所以不用改代码)
微调后合成就行了,model_dir改成预训练后就行了