介绍
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
-
--mixed_precision=fp16:覆盖 accelerate 的默认环境配置(对应 default_config.yaml 中的混合精度设置)- 作用:临时启用 fp16 混合精度训练,无需重新执行 accelerate config 更新配置文件;
- 效果:降低显存占用(约 50%)、提升训练速度,兼容绝大多数 NVIDIA GPU;
- 补充:若原始配置已启用 fp16,该参数会覆盖原始配置;若未启用,该参数会临时开启。
-
++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 手动指定」。
- Hydra 通过 @hydra.main() 中的 config_path 找到 src/f5_tts/configs/ 目录;
- 通过命令行中的 --config-name 参数找到 F5TTS_v1_Base.yaml 文件;
- 解析该 .yaml 文件的内容,生成配置对象 model_cfg;
- 调用被装饰的 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_Base、E2TTS_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:梅尔频谱类型,适配对应的声码器(vocos或bigvgan)
(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:指定使用本地回环接口进行通信,避免网络接口冲突。