• 项目主要是fork了paddlespeech官方的这个项目↓↓↓
  • 使用PaddleSpeech快速训练自定义音色
  • 本人制作了光与夜之恋男主相关的数据集,在原先基础上进行了部分修改。
  • 本项目最大的难度在制作数据集上,如果你希望能通过这个项目克隆自己需要的声音,只需要制作数据集再按部就班地运行本程序就好。
  • 关于数据集的制作,我自己编写了一些能够快速制作数据集的程序,并总结了一些经验↓↓↓
  • csmsc数据集制作快捷工具
  • 炼丹群QQ 692798715
  • 【因为模仿太像视频挂了,后面会补发】

更新日志:

  • 【11.1报错已修复】
  • 解决了因数据集音频采样率不同导致MFA失败的报错
  • 修复了由于paddle版本与cuda版本不符导致GPU爆满
  • 请选择【喜欢】本项目,能够直接查看项目更新情况
    在这里插入图片描述

请保证您的paddle版本为2.3.2,如果不是请在项目详情页点击【修改】修改后重新进入项目,否则会报错

1. 配置 PaddleSpeech 开发环境

安装 PaddleSpeech 并在 PaddleSpeech/examples/other/tts_finetune/tts3 路径下配置 tools,下载预训练模型

# 配置 PaddleSpeech 开发环境
!git clone https://gitee.com/paddlepaddle/PaddleSpeech.git
# 【当你的程序缺少某个模块时重新运行这个代码】【重启后必须运行】
%cd PaddleSpeech
!pip install . -i https://mirror.baidu.com/pypi/simple --upgrade pip
# 下载 NLTK
%cd /home/aistudio
!wget -P data https://paddlespeech.bj.bcebos.com/Parakeet/tools/nltk_data.tar.gz
!tar zxvf data/nltk_data.tar.gz
# 删除软链接
# aistudio会报错: paddlespeech 的 repo中存在失效软链接
# 执行下面这行命令!!
!find -L /home/aistudio -type l -delete
# 配置 MFA & 下载预训练模型
%cd /home/aistudio
!bash env.sh

2. 上传数据集并配置路径信息

建议放在 work 目录下,放在 data 目录下次打开会不见

2.1 音频文件 + 标注文件

csmsc_mini(数据文件夹)
   ├── 000001.wav
   ├── 000002.wav
   ├── 000003.wav
   ├── ...
   ├── 000200.wav
   └── labels.txt

上传数据说明:

  • 音频数据

音频文件为单声道wav格式,采样率24000

  • label.txt

音频文件名|拼音

示例

000001|ka2 er2 pu3 pei2 wai4 sun1 wan2 hua2 ti1
000002|jia2 yu3 cun1 yan2 bie2 zai4 yong1 bao4 wo3
000003|bao2 ma3 pei4 gua4 bo3 luo2 an1 diao1 chan2 yuan4 zhen3 dong3 weng1 ta4
000004|deng4 xiao3 ping2 yu3 sa4 qie4 er3 hui4 wu4
000005|lao2 hu3 you4 zai3 yu2 chong3 wu4 quan3 wan2 shua3

2.2 上传本地已对齐的 TextGrid 文件

如果你在本地使用MFA进行对齐的话,目录形式

mfa_result
    └── newdir
       ├── 000001.TextGrid
       ├── 000002.TextGrid
       ├── 000003.TextGrid
       ├── ...
       └── 000200.TextGrid    
# !unzip 【压缩包路径】 -d 【解压到的路径】
# 【解压过就不用再运行了,会卡住】
!unzip /home/aistudio/data/data174100/1-xy.zip -d work/1-xy
# !unzip /home/aistudio/data/data174100/2-lc.zip -d work/2-lc
# !unzip /home/aistudio/data/data174100/3-qsl.zip -d work/3-qsl
# !unzip /home/aistudio/data/data174100/4-xmx.zip -d work/4-xmx
# !unzip /home/aistudio/data/data174100/5-zls.zip -d work/5-zls
# 【重启后必须运行】
import subprocess
import os

# 命令行执行函数,可以进入指定路径下执行
def run_cmd(cmd, cwd_path):
    p = subprocess.Popen(cmd, shell=True, cwd=cwd_path)
    res = p.wait()
    print(cmd)
    print("运行结果:", res)
    if res == 0:
        # 运行成功
        print("运行成功")
        return True
    else:
        # 运行失败
        print("运行失败")
        return False
# 【重启后必须运行】
# 输入数据集路径
# data_dir = "/home/aistudio/work/1-xy" #只要修改数据集路径即可
data_dir = "/home/aistudio/work/2-lc" 
# data_dir = "/home/aistudio/work/3-qsl" 
# data_dir = "/home/aistudio/work/4-xmx" 
# data_dir = "/home/aistudio/work/5-zls" 
# 试验路径
# exp_dir = "/home/aistudio/work/exp"
exp_dir = "/home/aistudio/work/exp2"
# exp_dir = "/home/aistudio/work/exp3"
# exp_dir = "/home/aistudio/work/exp4"
# exp_dir = "/home/aistudio/work/exp5"
# 如果没有上传MFA
mfa_dir = os.path.join(exp_dir, 'mfa_result')
# 【重启后必须运行】【重启后运行到此就可以再次合成了】
# 配置试验相关路径信息
cwd_path = "/home/aistudio/PaddleSpeech/examples/other/tts_finetune/tts3"
# 可以参考 env.sh 文件,查看模型下载信息
pretrained_model_dir = "models/fastspeech2_mix_ckpt_1.2.0"
newdir_name = "newdir"
new_dir = os.path.join(exp_dir, newdir_name)
dump_dir = os.path.join(exp_dir, 'dump')
output_dir = os.path.join(exp_dir, 'exp')
lang = "zh"

# 输出文件路径
wav_output_dir = os.path.join(exp_dir, "output")
os.makedirs(wav_output_dir, exist_ok=True)

3. 检查数据集是否合法

# check oov
cmd = f"""
    python3 local/check_oov.py \
        --input_dir={data_dir} \
        --pretrained_model_dir={pretrained_model_dir} \
        --newdir_name={new_dir} \
        --lang={lang}
"""
# 执行该步骤
run_cmd(cmd, cwd_path)

4. 生成 MFA 对齐文件

如果上传了 MFA 对齐文件,则可以跳过这步,确保 MFA 文件路径配置正确

# 如果没有上传 MFA 对齐文件,则执行这步,重新生成MFA对齐文件
# 上传了 TextGrid 的话请务必跳过,否则会引起错误
cmd = f"""
python3 local/get_mfa_result.py \
    --input_dir={new_dir} \
    --mfa_dir={mfa_dir} \
    --lang={lang}
"""
# 执行该步骤 5400条数据大概25分钟
run_cmd(cmd, cwd_path)

5. 生成 Duration 时长信息

cmd = f"""
python3 local/generate_duration.py \
    --mfa_dir={mfa_dir}
"""
# 执行该步骤
run_cmd(cmd, cwd_path)

6. 数据预处理

训练数据预处理

cmd = f"""
python3 local/extract_feature.py \
    --duration_file="./durations.txt" \
    --input_dir={data_dir} \
    --dump_dir={dump_dir}\
    --pretrained_model_dir={pretrained_model_dir}
"""
# 执行该步骤 15—45分钟
run_cmd(cmd, cwd_path)

7. 准备微调环境

cmd = f"""
python3 local/prepare_env.py \
    --pretrained_model_dir={pretrained_model_dir} \
    --output_dir={output_dir}
"""
# 执行该步骤
run_cmd(cmd, cwd_path)

8. 微调训练

不同的数据集是不好给出统一的训练参数,因此在这一步,开发者可以根据自己训练的实际情况调整参数,重要参数说明:

  • 训练轮次: epoch
  1. epoch 决定了训练的轮次,可以结合 VisualDL 服务,在 AIstudio 中查看训练数据是否已经收敛,当数据集数量增加时,预设的训练轮次(100)不一定可以达到收敛状态
  2. 当训练轮次过多(epoch > 200)时,建议新建终端,进入/home/aistudio/PaddleSpeech/examples/other/tts_finetune/tts3 路径下, 执行 cmd 命令,AIStudio 在打印特别多的训练信息时,会产生错误
  • 配置文件:finetune.yaml
batch_size: -1
learning_rate: 0.0001     # learning rate
num_snapshots: -1

# frozen_layers should be a list
# if you don't need to freeze, set frozen_layers to []
# fastspeech2 layers can be found on conf/fastspeech2_layers.txt
# example: frozen_layers: ["encoder", "duration_predictor"]
frozen_layers: ["encoder"]

微调试验中几个重要修改参数:

  1. batch_size: 当 batch_size 为 -1 时,batch_size 大小等同于/home/aistudio/PaddleSpeech/examples/other/tts_finetune/tts3/conf/finetune.yaml 中 batch_size 大小,即 64, 如果上传的数据量 < 64,则会产生报错。当数据量 < 64 时,请更改 batch_size 大小,使其小于微调数据集的数据量
  2. learning_rate: 通过 VisualDL 观察训练迭代情况,调整 learning_rate 大小
  3. frozen_layers: 选择在微调训练过程中冻结的数据层
# 将默认的 yaml 拷贝一份到 exp_dir 下,方便修改
import shutil
in_label = "/home/aistudio/PaddleSpeech/examples/other/tts_finetune/tts3/conf/finetune.yaml"
shutil.copy(in_label, exp_dir)

训练过程中如果有需要修改的参数,就修改 /home/aistudio/work/exp/finetune.yaml

epoch = 100
config_path = os.path.join(exp_dir, "finetune.yaml")

cmd = f"""
python3 local/finetune.py \
    --pretrained_model_dir={pretrained_model_dir} \
    --dump_dir={dump_dir} \
    --output_dir={output_dir} \
    --ngpu=1 \
    --epoch={epoch} \
    --finetune_config={config_path}
"""
print(cmd)
# 执行该步骤 5400条数据我花了3个小时QWQ
# 如果训练轮次过多,则复制上面的cmd到终端中运行
# 如果GPU爆满请调整work/exp/finetune.yaml中的batch_size从32开始上下浮动,直到显存占比百分之80性价比最高
run_cmd(cmd, cwd_path)

9. 使用该音色合成特定句子

text_dict = {
    "01":"大家好我是萧小逸",
    "02":"很高兴认识你"
}
import os
# 生成 sentence.txt
text_file = os.path.join(exp_dir, "sentence.txt")
with open(text_file, "w", encoding="utf8") as f:
    for k,v in sorted(text_dict.items(), key=lambda x:x[0]):
        f.write(f"{k} {v}\n")
# 找到最新生成的模型
def find_max_ckpt(model_path):
    max_ckpt = 0
    for filename in os.listdir(model_path):
        if filename.endswith('.pdz'):
            files = filename[:-4]
            a1, a2, it = files.split("_")
            if int(it) > max_ckpt:
                max_ckpt = int(it)
    return max_ckpt
# 配置一下参数信息
model_path = os.path.join(output_dir, "checkpoints")
ckpt = find_max_ckpt(model_path)

cmd = f"""
python3 /home/aistudio/PaddleSpeech/paddlespeech/t2s/exps/fastspeech2/../synthesize_e2e.py \
                --am=fastspeech2_mix \
                --am_config=models/fastspeech2_mix_ckpt_1.2.0/default.yaml \
                --am_ckpt={output_dir}/checkpoints/snapshot_iter_{ckpt}.pdz \
                --am_stat=models/fastspeech2_mix_ckpt_1.2.0/speech_stats.npy \
                --voc="hifigan_aishell3" \
                --voc_config=models/hifigan_aishell3_ckpt_0.2.0/default.yaml \
                --voc_ckpt=models/hifigan_aishell3_ckpt_0.2.0/snapshot_iter_2500000.pdz \
                --voc_stat=models/hifigan_aishell3_ckpt_0.2.0/feats_stats.npy \
                --lang=mix \
                --text={text_file} \
                --output_dir={wav_output_dir} \
                --phones_dict={dump_dir}/phone_id_map.txt \
                --speaker_dict={dump_dir}/speaker_id_map.txt \
                --spk_id=0 \
                --ngpu=1
"""
print(cmd)
run_cmd(cmd, cwd_path)
# 音频生成了,在文件夹work/exp/output下能够找到
import IPython.display as ipd
ipd.Audio(os.path.join(wav_output_dir, "2.wav"))

重启后再运行以下代码才能正常合成

运行标有【重启后必须运行】的代码即可

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐