使用F5-TTS训练自己的数据

介绍

F5-TTS是一个基于流匹配(Flow Matching)技术的语音合成模型,能够生成流畅自然的语音。本文将详细介绍如何使用F5-TTS训练自己的语音合成模型,包括环境准备、数据预处理、模型训练和微调等步骤。

环境准备

1. 创建单独的环境

复制代码
conda create -n f5-tts python=3.11
conda activate f5-tts

2. PyTorch

复制代码
# Install pytorch with your CUDA version, e.g.
pip install torch==2.8.0+cu128 torchaudio==2.8.0+cu128 --extra-index-url https://download.pytorch.org/whl/cu128

3. 克隆项目仓库

复制代码
git clone https://gitcode.com/gh_mirrors/f5/F5-TTS

4. 安装依赖

复制代码
cd F5-TTS
pip install -e .

5. 安装 FFmpeg

复制代码
conda install ffmpeg
  • 可以配置环境变量 HF_ENDPOINT=https://hf-mirror.com 来使用 Hugging Face 的国内镜像。

6. 下载预训练模型 首次启动时,F5-TTS 会尝试从 Hugging Face 下载所需的预训练模型。确保您的网络环境可以访问 Hugging Face。议手动下载模型到本地指定路径,以避免启动时报错。

复制代码
# 编辑 ~/.bashrc
vim ~/.bashrc

# 配置 Hugging Face 国内镜像源(永久生效)
# 按 i 键进入 vim 编辑模式;
# 移动到文件末尾,添加以下内容:
export HF_ENDPOINT=https://hf-mirror.com
export HF_HOME=~/.cache/huggingface

# 使配置立即生效
source ~/.bashrc

数据预处理

1. 数据集的格式:

复制代码
your_dataset
|-- metadata.csv
|-- wavs/
|   |-- audio_0001.wav
|   |-- audio_0002.wav
|   `-- ...

metadata.csv 内容:
<relative_path_to_wav>|<transcript>

复制代码
audio_file|text
wavs/00001.wav|这是第一条语音的文字
wavs/00002.wav|这是第二条语音的文字

如果你的数据集不符合,需要编写脚本将text格式文件或者其他标注文件转化成上文格式的形式

2. 调用脚本准备数据集

脚本位置src/f5_tts/train/datasets/prepare_csv_wavs.py

复制代码
Examples:
    # For fine-tuning (default):
    python prepare_csv_wavs.py /input/dataset/path /output/dataset/path
    
    # For pre-training:
    python prepare_csv_wavs.py /input/dataset/path /output/dataset/path --pretrain
    
    # With custom worker count:
    python prepare_csv_wavs.py /input/dataset/path /output/dataset/path --workers 4
示例 1:微调模式预处理
复制代码
python prepare_csv_wavs.py /input/dataset/path /output/dataset/path
  • 脚本会默认以「微调」为目标处理数据,对音频的裁剪、特征提取、文本编码都采用更轻量化的配置,适配小数据集(比如你的几百 / 几千条自定义数据);
  • 会自动生成 raw.arrow(音频特征 + 文本编码)、duration.json(音频时长)、vocab.txt(词汇表),且数据格式完全匹配微调训练的要求;
示例 2:预训练模式预处理(指定 --pretrain 参数)
复制代码
python prepare_csv_wavs.py /input/dataset/path /output/dataset/path --pretrain
  • 脚本会以「大规模预训练」为目标处理数据,配置更严格:比如保留更长的音频片段、更精细地提取梅尔频谱、对文本标注做更全面的校验;
  • 生成的 raw.arrow 数据量更大,包含的音频特征信息更完整,适配大规模数据集(通常几十万 / 几百万条数据);
示例 3:指定自定义工作进程数(指定 --workers 4 参数)
复制代码
python prepare_csv_wavs.py /input/dataset/path /output/dataset/path --workers 4
  • --workers 用于指定「并行处理数据的进程数」,默认值通常是 1(单进程处理);
  • 这里指定 4,表示脚本会启动 4 个进程同时处理音频和文本数据,大幅提升预处理速度(比如原本 1 小时处理完,4 进程可能 20 分钟完成)

入口函数

命令行接口(CLI)入口函数cli() → 核心预处理函数prepare_and_save_set()

预处理的「第一步:处理原始 wav / 文本,生成中间数据」prepare_csv_wavs_dir()函数

预处理的「第二步:将中间数据保存为 raw.arrow 等最终文件」 save_prepped_dataset() 函数

复制代码
sub_result, durations, vocab_set = prepare_csv_wavs_dir(inp_dir, num_workers=num_workers)
  • 函数参数:inp_dir(原始数据目录)、num_workers=num_workers(并行进程数)

  • sub_result:处理后的核心数据(包含音频的梅尔频谱、文本标注编码等核心信息,是生成 raw.arrow 的原材料);

  • durations:所有音频的时长信息字典(键通常是音频文件名,值是音频时长,是生成 duration.json 的原材料);

  • vocab_set:从原始文本标注中提取的词汇集合(一个集合对象,包含所有出现过的字符 / 拼音,是生成 vocab.txt 的原材料)。

    save_prepped_dataset(out_dir, sub_result, durations, vocab_set, is_finetune)

传递 5 个参数:

  • out_dir:输出目录(保存最终文件的路径);
  • sub_result、durations、vocab_set:上一步生成的 3 个中间数据;
  • is_finetune:是否为微调模式(决定保存文件的格式,比如微调模式会沿用预训练词汇表,预训练模式会生成新的词汇表)。
  • 核心作用:这个函数会在 out_dir 目录下,生成我们熟悉的 raw.arrow(核心训练数据)、duration.json(音频时长)、vocab.txt(词汇表),完成整个预处理流程。

正是这个函数的执行,让后续训练时能直接读取 raw.arrow,无需再处理原始 wav 文件。

convert_char_to_pinyin() 中文拼音转换函数

复制代码
# text_list:待转换的文本列表(输入参数);
# polyphone:是否处理多音字,默认 True(开启)。
def convert_char_to_pinyin(text_list, polyphone=True):
    final_text_list = [] # 初始化最终结果列表,用于存放所有文本转换后的结果。
     # 创建一个「字符转换映射表」,用于批量替换特殊标点
     # 目的是统一标点格式,避免出现模型无法识别的稀有标点
    custom_trans = str.maketrans( 
        {";": ",", """: '"', """: '"', "'": "'", "'": "'"} 
    )  # add custom trans here, to address oov 
	# OOV:Out Of Vocabulary,词汇表外内容

    def is_chinese(c): # 中文汉字的 Unicode 编码范围大致是 \u3100 到 \u9fff
        return (
            "\u3100" <= c <= "\u9fff"  # common chinese characters
        )

    for text in text_list:
        char_list = []
        text = text.translate(custom_trans)  # 应用之前创建的字符转换映射表,批量替换特殊标点(如把 "我爱你" 转为 "我爱你")
        
        # rjieba.cut(text):对当前文本进行中文分词(如 "我爱中国" 被切分为 ["我", "爱", "中国"]);
        # 目的是更好地处理多音字(分词后结合上下文,拼音转换更准确),同时方便区分中英文混合片段。
        for seg in rjieba.cut(text): 
            seg_byte_len = len(bytes(seg, "UTF-8")) # 计算当前分词片段 seg 的 UTF-8 编码字节长度
            
            # 场景 1:处理「纯英文、数字、普通符号」片段(如 "Hello"、"123"、",")
            if seg_byte_len == len(seg):  # 字节长度 = 字符长度,说明无中文
                if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"":
                    char_list.append(" ")
                    # 如果当前结果列表 char_list 非空、片段长度大于 1、且列表最后一个元素不是空格 / 冒号 / 引号,
                    # 就添加一个空格(用于分隔中文和非中文,提升可读性,如 "中国Hello" → 拼音后不会变成 "zhōngguóHello",而是 "zhōng guó Hello");
                char_list.extend(seg)
               
             # 场景 2:处理「纯中文汉字」片段(且开启多音字处理),这是核心转换逻辑;
            elif polyphone and seg_byte_len == 3 * len(seg):  # 开启多音字处理 + 字节长度 = 3× 字符长度,说明是纯中文
                seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) # 调用 pypinyin 库的转拼音方法,将分词片段转为拼音
                # style=Style.TONE3:拼音格式为「字母 + 数字声调」(如 wǒ → wo3,这是 TTS 常用格式)
                # tone_sandhi=True:开启声调变调处理(如「一」在不同语境下的声调变化,提升拼音准确性);
                
                for i, c in enumerate(seg):
                    if is_chinese(c):
                        char_list.append(" ")
                    char_list.append(seg_[i])
                 # 若当前字符是中文,先添加一个空格(分隔不同拼音),再添加对应的拼音
                 # 最终效果:如 "中国" → 转为 [" ", "zhong1", " ", "guo2"]
            
            # 场景 3:处理「混合片段」(如 "a我123"、"世界abc"),无法归为前两种纯片段的情况
            else:  # if mixed characters, alphabets and symbols
                for c in seg:  
                    if ord(c) < 256:  # 判断是否为 ASCII 字符(英文、数字、普通符号,ASCII 码范围 0-255),若是则直接保留;
                        char_list.extend(c)
                    elif is_chinese(c): # 若是中文字符,先加空格,再转为对应拼音
                        char_list.append(" ")
                        char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True))
                    else: # 其他字符(非 ASCII、非中文),直接保留(如特殊符号、其他语言字符)
                        char_list.append(c)
        final_text_list.append(char_list)

    return final_text_list

训练模型

命令1:配置训练环境(生成配置文件)

复制代码
accelerate config

交互式配置训练环境,生成一个默认的配置文件(保存到 ~/.cache/huggingface/accelerate/default_config.yaml),后续执行 accelerate launch 时会自动读取这个配置文件。

若想跳过交互式问答,直接生成默认配置(单卡、无混合精度),可执行 accelerate config default

复制代码
# 第1步:选择训练环境 → 选「This machine」
In which compute environment are you running?
Please select a choice using the arrow or number keys, and selecting with enter
 ➔  This machine
    AWS (Amazon SageMaker)
This machine 对应「本地 / 当前服务器环境」
AWS (Amazon SageMaker) 是 亚马逊云科技 提供的一套云端机器学习平台服务

# 第2步:选择使用的「设备部署模式」
Which type of machine are you using?                                                                                                                                                      
Please select a choice using the arrow or number keys, and selecting with enter
 ➔  No distributed training
    multi-CPU
    multi-XPU
    multi-HPU
    multi-GPU
    multi-NPU
    multi-MLU
    multi-SDAA
    multi-MUSA
    TPU
No distributed training(无分布式训练):只在 一张显卡(或一个 CPU)上运行,不尝试和其他设备协同工作。

multi-GPU:多显卡分布式训练;
multi-CPU:多 CPU 分布式训练(适合无 GPU 的场景,训练速度很慢);
其他 multi-HPU/NPU 等:是其他厂商的专用 AI 硬件,日常场景很少用到。
TPU:谷歌提供的专用机器学习加速硬件,主要用于云端大规模训练

# 第3步:即使你的设备上有 GPU、苹果硅芯片等加速硬件可用,你是否仍然要强制只使用 CPU 来进行训练?→ 选「No」                                                                                                                                                   
Do you want to run your training on CPU only (even if a GPU / Apple Silicon / Ascend NPU device is available)? [yes/NO]:  

# 第4步:是否希望使用 torch dynamo 来优化你的训练脚本,提升训练速度?
Do you wish to optimize your script with torch dynamo?[yes/NO]:  → 选「No」   

torch dynamo 是 PyTorch 内置的一个代码优化工具,核心作用是「动态编译」训练代码,减少冗余计算,从而提升 GPU 的训练吞吐量(简单说就是让训练更快一点)。
为什么不选「yes」:优化效果对新手场景不明显,F5-TTS 的核心瓶颈是显存和数据,不是代码执行效率;torch dynamo 对一些自定义代码(比如你的少数民族拼音分词器、8bit 优化器)支持不够完善,可能会触发新的报错,打乱当前的单卡训练部署;

# 第5步:是否希望使用 DeepSpeed 这个分布式训练优化框架来辅助训练?
Do you want to use DeepSpeed? [yes/NO]:  → 选「No」   

DeepSpeed 是微软推出的一款深度学习训练优化框架,主要用于大规模多卡分布式训练,能有效优化显存占用、提升大模型训练速度,常见于千亿级参数模型的训练场景。
不建议选择「yes」
多卡训练的显存分配、进程通信逻辑,会和后续要用到的 bnb_optimizer(8bit 优化)产生兼容性冲突,增加额外的排错成本

# 第6步:指定要用于训练的 GPU 编号(以英文逗号分隔),默认值all代表使用所有可用 GPU。
What GPU(s) (by id) should be used for training on this machine as a comma-separated list? [all]: 

# 第7步:是否希望启用「NUMA 效率优化」(该优化目前仅支持 NVIDIA 硬件)?
Would you like to enable numa efficiency? (Currently only supported on NVIDIA hardware). [yes/NO]: 

NUMA 是「非统一内存访问」的缩写,是一种服务器硬件架构优化技术。启用这个选项后,会让多 CPU、多 GPU 的服务器更合理地分配内存资源,减少不同硬件之间的内存访问延迟,仅对「多卡分布式训练 + 多 CPU 节点」的场景有收益。


# 第8步:是否希望启用「混合精度训练」,以及如果启用,要选择哪种精度模式?
Do you wish to use mixed precision?  → 选「No」                                                                                                                     
Please select a choice using the arrow or number keys, and selecting with enter                                                                                                           
 ➔  no                                                                                                                                                                                    
    fp16                                                                                                                                                                                  
    bf16
    fp8

「混合精度训练」的核心作用是:在不损失过多训练效果的前提下,进一步降低 GPU 显存占用、提升训练速度(通过将模型部分参数从 32 位浮点(fp32)转为更低位的浮点格式)。

1. no:不启用混合精度,全程使用 32 位浮点(fp32)训练,显存占用最高,但稳定性最好,兼容性无风险。
2. fp16:半精度训练,最常用的混合精度模式,显存占用比 fp32 降低约 50%,支持绝大多数 NVIDIA GPU,优化效果明显。
3. bf16:脑浮点数精度,效果和 fp16 接近,主要支持 NVIDIA 高端 GPU(如 A100、H100)和 AMD GPU,低端 GPU 可能不兼容。
4. fp8:8 位浮点,极致压缩显存,目前还不成熟,兼容性差,仅用于超大模型训练,日常场景几乎不用。

当前默认选择「➔ no」可行:不启用混合精度(no),可以避免和bnb_optimizer产生兼容性冲突,也能避免部分 GPU 不支持 fp16/bf16 导致的报错,保障训练流程最稳定。

命令2:默认启动训练

复制代码
accelerate launch src/f5_tts/train/train.py --config-name F5TTS_v1_Base.yaml

根据 accelerate config 生成的默认配置文件,启动 F5-TTS 训练,同时加载 Hydra 配置文件 F5TTS_v1_Base.yaml

  • accelerate launch:启动训练的核心命令,作用是「按照之前生成的 default_config.yaml 配置,启动后续的训练脚本」,自动适配你的训练环境(单卡 / 多卡、混合精度等)。
  • src/f5_tts/train/train.py:F5-TTS 的核心训练脚本(真正执行训练逻辑的文件),替代了直接用 python 运行脚本的方式(python src/f5_tts/train/train.py)。
  • --config-name F5TTS_v1_Base.yaml:传递给 train.py 的 Hydra 配置参数,作用是:
    • 指定训练使用的核心配置文件 F5TTS_v1_Base.yaml(该文件存放在 src/f5_tts/configs/ 目录下,对应命令中的注释);
    • 这个配置文件包含了模型参数、数据集参数、训练超参(学习率、批次大小等),是训练的「业务配置依据」。

命令 3: 覆盖配置启动训练

复制代码
accelerate launch --mixed_precision=fp16 src/f5_tts/train/train.py --config-name F5TTS_v1_Base.yaml ++datasets.batch_size_per_gpu=19200
  1. --mixed_precision=fp16:覆盖 accelerate 的默认环境配置(对应 default_config.yaml 中的混合精度设置)

    • 作用:临时启用 fp16 混合精度训练,无需重新执行 accelerate config 更新配置文件;
    • 效果:降低显存占用(约 50%)、提升训练速度,兼容绝大多数 NVIDIA GPU;
    • 补充:若原始配置已启用 fp16,该参数会覆盖原始配置;若未启用,该参数会临时开启。
  2. ++datasets.batch_size_per_gpu=19200:覆盖 Hydra 的业务配置(对应 F5TTS_v1_Base.yaml 中的批次大小参数)。

    • Hydra 中,++ 是「强制覆盖配置参数」的语法,用于修改配置文件中的嵌套参数;
    • datasets.batch_size_per_gpu 是配置文件中的嵌套参数(对应 F5TTS_v1_Base.yaml 中 datasets 节点下的 batch_size_per_gpu);
    • 作用:将每卡批次大小临时改为 19200,无需手动修改 F5TTS_v1_Base.yaml 文件,灵活适配不同的显存环境。

Hydra 管理配置文件

目录:src/f5_tts/configs/F5TTS_v1_Base.yaml

复制代码
@hydra.main(version_base="1.3", config_path=str(files("f5_tts").joinpath("configs")), config_name=None)
  • config_name=None
    核心作用:指定「默认加载的配置文件名」(不带 .yaml 后缀),这里设置为 None,表示「不指定默认配置文件,需要通过命令行参数 --config-name 手动指定」。
  1. Hydra 通过 @hydra.main() 中的 config_path 找到 src/f5_tts/configs/ 目录;
  2. 通过命令行中的 --config-name 参数找到 F5TTS_v1_Base.yaml 文件;
  3. 解析该 .yaml 文件的内容,生成配置对象 model_cfg;
  4. 调用被装饰的 main() 函数,将 model_cfg 作为参数传入,后续训练逻辑基于 cfg 中的参数执行。

具体的配置参数

复制代码
hydra:
  run:
    dir: ckpts/${model.name}_${model.mel_spec.mel_spec_type}_${model.tokenizer}_${datasets.name}/${now:%Y-%m-%d}/${now:%H-%M-%S}

datasets:
  name: Emilia_ZH_EN  # dataset name
  batch_size_per_gpu: 38400  # 8 GPUs, 8 * 38400 = 307200
  batch_size_type: frame  # frame | sample
  max_samples: 64  # max sequences per batch if use frame-wise batch_size. we set 32 for small models, 64 for base models
  num_workers: 16

optim:
  epochs: 11
  learning_rate: 7.5e-5
  num_warmup_updates: 20000  # warmup updates
  grad_accumulation_steps: 1  # note: updates = steps / grad_accumulation_steps
  max_grad_norm: 1.0  # gradient clipping
  bnb_optimizer: False  # use bnb 8bit AdamW optimizer or not

model:
  name: F5TTS_v1_Base  # model name
  tokenizer: pinyin  # tokenizer type
  tokenizer_path: null  # if 'custom' tokenizer, define the path want to use (should be vocab.txt)
  backbone: DiT
  arch:
    dim: 1024
    depth: 22
    heads: 16
    ff_mult: 2
    text_dim: 512
    text_mask_padding: True
    qk_norm: null  # null | rms_norm
    conv_layers: 4
    pe_attn_head: null
    attn_backend: torch  # torch | flash_attn
    attn_mask_enabled: False
    checkpoint_activations: False  # recompute activations and save memory for extra compute
  mel_spec:
    target_sample_rate: 24000
    n_mel_channels: 100
    hop_length: 256
    win_length: 1024
    n_fft: 1024
    mel_spec_type: vocos  # vocos | bigvgan
  vocoder:
    is_local: False  # use local offline ckpt or not
    local_path: null  # local vocoder path

ckpts:
  logger: wandb  # wandb | tensorboard | null
  log_samples: True  # infer random sample per save checkpoint. wip, normal to fail with extra long samples
  save_per_updates: 50000  # save checkpoint per updates
  keep_last_n_checkpoints: -1  # -1 to keep all, 0 to not save intermediate, > 0 to keep last N checkpoints
  last_per_updates: 5000  # save last checkpoint per updates
  save_dir: ckpts/${model.name}_${model.mel_spec.mel_spec_type}_${model.tokenizer}_${datasets.name}
1. hydra 节点:Hydra 框架自身配置
复制代码
hydra:
  run:
    dir: ckpts/${model.name}_${model.mel_spec.mel_spec_type}_${model.tokenizer}_${datasets.name}/${now:%Y-%m-%d}/${now:%H-%M-%S}
  • 核心作用:指定本次训练运行结果(日志、临时文件)的保存目录。
  • ${model.name}:模型名称(如 F5TTS_v1_Base
  • ${model.mel_spec.mel_spec_type}:梅尔频谱类型(如 vocos)
  • ${model.tokenizer}:分词器类型(如 pinyin)
  • ${datasets.name}:数据集名称(如 Emilia_ZH_EN)

最终示例路径:ckpts/F5TTS_v1_Base_vocos_pinyin_Emilia_ZH_EN/2026-01-25/21-30-00

2. datasets 节点:数据集相关配置
复制代码
datasets:
  name: Emilia_ZH_EN  # dataset name
  batch_size_per_gpu: 38400  # 8 GPUs, 8 * 38400 = 307200
  batch_size_type: frame  # frame | sample
  max_samples: 64  # max sequences per batch if use frame-wise batch_size. we set 32 for small models, 64 for base models
  num_workers: 16
  • name: Emilia_ZH_EN:数据集名称,脚本会据此去 data/ 目录下查找对应数据集

  • batch_size_per_gpu: 38400:每块 GPU 的批次大小(按「帧」计算,对应 batch_size_type: frame),8 卡总批次大小为 8*38400=307200

  • batch_size_type: frame:批次划分类型,可选 frame(按音频帧数量)或 sample(按样本数量);

    • frame:适合大规模数据集,按音频帧总数划分批次,训练更稳定;
    • sample:适合小数据集,按样本个数划分批次(如每批次 8 个样本),不易出现被零除错误
  • max_samples: 64:使用 frame 类型批次时,每批次的最大样本数限制(防止单批次样本过多导致显存溢出),小模型设 32,基础模型设 64;

  • num_workers: 16:加载数据集的并行工作进程数,数值越大,数据集加载速度越快(不宜超过 CPU 核心数,否则会占用过多资源)。

3. optim 节点:优化器与训练流程配置
复制代码
optim:
  epochs: 11  # 训练轮数
  learning_rate: 7.5e-5  # 学习率
  num_warmup_updates: 20000  # warmup updates
  grad_accumulation_steps: 1  # note: updates = steps / grad_accumulation_steps
  max_grad_norm: 1.0  # gradient clipping
  bnb_optimizer: False  # use bnb 8bit AdamW optimizer or not
  • epochs: 11:训练总轮数(每轮会遍历一次完整数据集);
  • learning_rate: 7.5e-5:初始学习率(过小训练收敛慢,过大容易震荡不收敛);
  • num_warmup_updates: 20000:学习率暖更新步数,即前 20000 步学习率从 0 线性增长到 learning_rate,之后按需衰减;
    • 作用:避免训练初期学习率过大导致模型不稳定;
  • grad_accumulation_steps: 1:梯度累积步数,即累计 N 步的梯度后再进行一次参数更新;
    • 作用:显存不足时,可调大该值(如 16),等效于增大批次大小(总批次大小 = 每卡批次大小 * GPU 数 * 梯度累积步数);
    • 公式:updates(更新步数)= steps(训练步数)/ grad_accumulation_steps
  • max_grad_norm: 1.0:梯度裁剪的最大范数,防止训练过程中梯度爆炸(梯度超过该值时,会按比例缩放梯度);
  • bnb_optimizer: False:是否使用 bitsandbytes 库的 8 位量化 AdamW 优化器;
    • 作用:开启后(True)可大幅降低显存占用(约 50%),适合显存不足的场景,不影响训练效果。
4. model 节点:模型核心配置
复制代码
model:
  name: F5TTS_v1_Base  # model name
  tokenizer: pinyin  # tokenizer type
  tokenizer_path: null  # if 'custom' tokenizer, define the path want to use (should be vocab.txt)
  backbone: DiT
  arch:
    dim: 1024
    depth: 22
    heads: 16
    ff_mult: 2
    text_dim: 512
    text_mask_padding: True
    qk_norm: null  # null | rms_norm
    conv_layers: 4
    pe_attn_head: null
    attn_backend: torch  # torch | flash_attn
    attn_mask_enabled: False
    checkpoint_activations: False  # recompute activations and save memory for extra compute
  mel_spec:
    target_sample_rate: 24000
    n_mel_channels: 100
    hop_length: 256
    win_length: 1024
    n_fft: 1024
    mel_spec_type: vocos  # vocos | bigvgan
  vocoder:
    is_local: False  # use local offline ckpt or not
    local_path: null  # local vocoder path

(1)基础参数

  • name: F5TTS_v1_Base:模型名称,用于区分不同模型结构(如 F5TTS_BaseE2TTS_Base
  • tokenizer: pinyin:分词器类型,可选 pinyin(拼音)、char(汉字)、custom(自定义)
  • tokenizer_path: null:自定义分词器的 vocab.txt 路径,tokenizer: custom 时必须指定(如 ./data/nongye/vocab.txt),否则为 null。

(2)arch:模型骨干网络(DiT)结构参数

  • backbone: DiT:模型骨干网络为 DiT(Diffusion Transformer),是 F5-TTS 的核心网络结构
  • dim: 1024:模型隐藏层维度(越大模型容量越强,显存占用也越高);
  • depth: 22:Transformer 编码器的层数;
  • heads: 16:多头注意力机制的头数;
  • attn_backend: torch:注意力机制的实现后端,可选 torch(PyTorch 原生)或 flash_attn(FlashAttention,更快更省显存,需额外安装)

(3)mel_spec:梅尔频谱提取参数

  • 核心作用:配置音频转梅尔频谱的相关参数,声码器(Vocos/BigVGAN)依赖该参数生成音频
  • target_sample_rate: 24000:音频目标采样率(24kHz,Vocos 模型适配的采样率);
  • n_mel_channels: 100:梅尔频谱的通道数(特征维度);
  • mel_spec_type: vocos:梅尔频谱类型,适配对应的声码器(vocosbigvgan

(4)vocoder:声码器配置(音频生成)

  • is_local: False:是否使用本地离线声码器权重,False 表示从 Hugging Face 自动下载,True 表示使用本地路径;
  • local_path: null:本地声码器权重路径,is_local: True 时必须指定(如 ./cache/vocos-mel-24khz)
5. ckpts 节点:模型权重(checkpoint)保存配置
复制代码
ckpts:
  logger: wandb  # wandb | tensorboard | null
  log_samples: True  # infer random sample per save checkpoint. wip, normal to fail with extra long samples
  save_per_updates: 50000  # save checkpoint per updates
  keep_last_n_checkpoints: -1  # -1 to keep all, 0 to not save intermediate, > 0 to keep last N checkpoints
  last_per_updates: 5000  # save last checkpoint per updates
  save_dir: ckpts/${model.name}_${model.mel_spec.mel_spec_type}_${model.tokenizer}_${datasets.name}
  • 核心作用:配置模型权重的保存策略、日志工具,方便后续恢复训练和查看训练效果。
  • logger: wandb:训练日志工具,可选 wandb(Weights & Biases,云端日志)、tensorboard(本地日志)、null(不记录日志)
  • log_samples: True:每次保存权重时,随机抽取样本进行推理并记录音频结果(长音频可能推理失败,属于正常现象)
  • save_per_updates: 50000:每经过 50000 步更新,保存一次中间权重( checkpoint)
  • keep_last_n_checkpoints: -1:保留中间权重的数量,-1 保留所有,0 不保存中间权重,>0 保留最后 N 个
  • last_per_updates: 5000:每经过 5000 步更新,保存一次「最新权重」(覆盖之前的最新权重,用于快速恢复训练)
  • save_dir: ...:模型权重保存目录(最终路径和 hydra.run.dir 前缀一致),权重文件会存放在该目录下

强制禁用 NCCL P2P 并启用主机内存中转(更彻底的通信配置

复制代码
export NCCL_P2P_DISABLE=1 && \
export NCCL_IB_DISABLE=1 && \
export NCCL_SOCKET_IFNAME=lo && \
export NCCL_IGNORE_DISABLED_P2P=1 && \
export NCCL_TIMEOUT=1800000 && \
accelerate launch src/f5_tts/train/train.py --config-name F5TTS_v1_Base.yaml

环境变量解读:

  • NCCL_P2P_DISABLE=1:强制禁用所有 GPU 之间的 P2P 通信(比 IGNORE 更彻底);
  • NCCL_IB_DISABLE=1:禁用 InfiniBand 通信(若无该硬件,强制禁用避免探测超时);
  • NCCL_SOCKET_IFNAME=lo:指定使用本地回环接口进行通信,避免网络接口冲突。
相关推荐
喝拿铁写前端19 小时前
Dify 构建 FE 工作流:前端团队可复用 AI 工作流实战
前端·人工智能
阿里云大数据AI技术20 小时前
阿里云 EMR Serverless Spark + DataWorks 技术实践:引领企业 Data+AI 一体化转型
人工智能
billhan201620 小时前
MCP 深入理解:协议原理与自定义开发
人工智能
Jahzo20 小时前
openclaw桌面端体验--ClawX
人工智能·github
billhan201620 小时前
Agent 开发全流程:从概念到生产
人工智能
threerocks21 小时前
过了个年,AI 圈变天了?但没人告诉你为什么
人工智能
threerocks21 小时前
Anthropic CEO Dario Amodei:海啸已在地平线上,但没人在看
人工智能
用户51914958484521 小时前
Adrenaline GPU 漏洞利用框架:突破 Android 内核内存读写限制
人工智能·aigc
hulkie21 小时前
从 AI 对话应用理解 SSE 流式传输:一项 "老技术" 的新生
前端·人工智能
鞋带松了21 小时前
openclaw + ollama本地模型 + 飞书平台 windows平台部署教程
人工智能