训练
训练页:建立并预处理数据集,再用实验逐阶段运行各引擎自己的微调流程,查看损失曲线与试听,导出为音色权重或新模型。
训练 页用你自己的录音微调模型。它分两步:
- 数据集:同一个音色的若干片段及其文本。
- 实验:选一个起始模型和训练方式,在数据集上逐阶段运行该引擎自己的微调流程(由 Mizuoto 实现)。结果是音色的专属权重(加到音色库中的某个音色上)或一个新模型(出现在 模型 页)。
页面顶部的标签页在 实验 和 数据集 之间切换,右侧是 新建实验 或 新建数据集。
能训练什么
| 引擎 | 训练方式 | 结果 | 设备 |
|---|---|---|---|
| GPT-SoVITS | Fine-tune a voice | 音色的 GPT 与 SoVITS 权重 | GPU,CPU 可做小规模试验 |
| F5-TTS | Fine-tune the model | 新模型 | GPU,CPU 可做小规模试验 |
| Qwen3-TTS(Base 模型) | Teach it a speaker | 新模型(以这个音色为预置说话人的 CustomVoice 模型) | GPU,CPU 可做小规模试验 |
| OmniVoice | Fine-tune the model、Fine-tune with LoRA | 新模型 | GPU,CPU 可做小规模试验 |
| VoxCPM | Fine-tune the model、Fine-tune with LoRA | 新模型(LoRA 的适配器与基础权重放在一起) | GPU,CPU 可做小规模试验(VoxCPM2 全量微调约需 40 GB) |
| CosyVoice(300M、2、3) | Fine-tune the language model、Fine-tune the LLM and the flow | 新模型 | GPU,CPU 可做小规模试验 |
| Fish Speech | Fine-tune with LoRA | 新模型(仍受 Fish Audio 研究许可约束) | 建议 24 GB 显存的 GPU |
训练方式的名称和阶段名称来自引擎的说明文件,界面中显示为英文。
训练不需要 Mizuoto 和 torch 之外的任何东西:所有训练方式都在 Mizuoto 自己的 Python 中运行,每个阶段一个单独的进程。有的方式需要只在训练时用到的共享文件,例如 GPT-SoVITS 的预训练判别器(mizuoto asset download gptsovits/s2d-v2pro)。缺少什么时,新建实验对话框会把这种方式标为 不可用,并写明要运行的命令。
训练在本机进行
训练始终在本机运行,不会使用远程主机;引擎设为远程设备时,它的训练方式不可用。微调运行时会独占所用的设备。训练用哪个设备在 设置 › 训练 › 训练设备 中选择,默认使用 引擎所用设备。
数据集
新建数据集
- 在 数据集 标签页点 新建数据集。
- 填写 数据集名称、选择 语言,可选填写 描述。
- 点 创建,打开数据集页。
数据集保存在数据文件夹的 datasets/<名称>/ 中:dataset.json、每行一个片段的 manifest.jsonl,以及 audio/ 中的 FLAC 片段。
添加片段
数据集页的 添加片段 部分提供几种来源:
- 音频文件或录音:拖放、选择文件、录音,或 服务器文件。可以在 说话人 中写明这些片段是谁说的(可选),然后点 添加(N)。
- 某个音色的片段:选择音色库中的一个音色,点 添加,加入它的参考音频及文本。
- 之前的结果:从合成结果中挑选。结果会带着它的许可标记加入;许可不允许用来训练其他引擎的结果(例如 Fish Speech 的结果),训练时会被拒绝。
- 添加服务器文件夹(只在服务器本机的浏览器中出现):先选择 文件夹格式,再选择文件夹:
| 文件夹格式 | 内容 |
|---|---|
| 自动识别 | 按文件夹内容判断 |
| 音频文件(旁边可有同名 .lab 或 .txt) | 普通的音频文件 |
| GPT-SoVITS .list | GPT-SoVITS 的标注文件 |
| LJSpeech(metadata.csv) | LJSpeech 格式 |
| CSV(audio_file|text) | 每行一个音频文件名和文本 |
预处理
在停顿处切分长录音,用语音识别补全缺失的文本,并统一音量。添加片段后运行。
| 设置 | 默认 | 作用 |
|---|---|---|
| 切分长片段 | 开 | 在静音处切分,同 GPT-SoVITS 的切分工具 |
| 转写 | 开 | 用语音识别为没有文本的片段生成文本(需要已安装语音识别) |
| 统一音量 | 开 | 每个片段的峰值调到 -1 dBFS |
| 最长片段(秒) | 12 | 比它长的片段才会被切分 |
| 保留的最短片段(秒) | 1 | 更短的片段被丢弃 |
| 静音阈值(dB) | -34 | 低于它算作静音 |
| 所说语言 | — | 转写时使用的语言 |
点 开始预处理,它作为一个任务运行,进度显示在下方。
检查报告
预处理后(或有片段时)显示 检查报告:
- 可用片段:可用数/总数 · 时长;
- 片段时长 的直方图;
- 问题列表:过短、过长、缺少文本、削波,每一项旁的 查看 会只列出这些片段;
- 其他提示,以及 片段的许可证。
编辑片段
片段 列表每页 50 条,可以搜索文本或按问题筛选。每条片段:
- 播放按钮和时长;
- 文本框(标签为说话人名,没有文本时提示 没有文本:请转写或手动输入),改完点保存按钮或按回车;
- 用于训练 / 不用于训练:排除的片段保留在数据集中但不参与训练;
- 删除按钮。
详情 中可以修改名称、语言和描述。页面底部有 删除(移到回收站;用它建立的实验将无法再运行)和 用它训练(以这个数据集新建实验)。
实验
新建实验
- 在 实验 标签页点 新建实验(或在数据集页点 用它训练)。
- 起始模型:只列出可以训练的已安装模型。没有时提示安装可训练的模型。
- 训练方式:这个模型可用的方式;不可用的带有 (不可用) 并写明原因(缺少共享文件、引擎不可用或在远程主机上等)。下方显示这种方式的说明、阶段、结果类型(生成音色专属权重 或 生成新模型)和所需的最少语音时长。
- 数据集;数据集中可用的语音时长不足时,创建会失败,并说明现有与所需的时长。
- 实验名称:默认是“数据集-模型”,只能用字母、数字、
-、_和.。 - 结果是音色权重时,还有 权重所属音色:选音色库中的一个音色,或 新建音色(用数据集中三段 3 到 10 秒的片段新建一个)。
- 主要设置(轮数、学习率等)可以在这里修改,更多设置(包括高级设置)在实验页面中。
- 点 创建。
实验保存在 experiments/<引擎>/<名称>/ 中。
阶段
实验页上方显示起始模型、数据集、结果类型和语言。阶段 部分是一排步骤,每个阶段的状态为 未运行、运行中、已完成、已过期 或 失败。
| 按钮 | 作用 |
|---|---|
| 运行 | 从第一个未完成(或已过期)的阶段运行到最后;全部完成后显示 已完成 |
| 运行此阶段 | 只运行选中的阶段;它之前的阶段必须已完成 |
| 从头开始 | 确认后从第一个阶段起重新运行所有阶段 |
点一个阶段查看它的说明、完成时间和结果;失败时显示错误。
一次运行是一个 训练 任务,它的步骤就是各个阶段,任务卡片显示在阶段下方。
已过期:每个完成的阶段都记录了它读取的内容——数据集、起始模型的版本和它用到的设置,以及之前阶段的结果。这些内容变化后,这个阶段及其后的阶段都标为 已过期(此阶段运行后,它读取的内容(数据集、模型或它用到的设置)已改变:请重新运行。)。重新运行某个阶段时,它之后已完成的阶段也会过期,因为它们读的是这个阶段的旧文件。
损失曲线
损失 部分在训练阶段运行时实时显示曲线;有多个训练阶段时可以切换,有多条曲线时可以用标签逐条开关。还没有数据时显示 训练阶段运行时,损失曲线显示在这里。
设置
设置 中是这种训练方式的超参数(数字输入框),高级 中是其余的。修改设置会使用到它的阶段及其后的阶段过期。 改完点 保存。
试听与导出
- 试听:导出阶段会用训练结果朗读一段(设置 › 训练 › 训练后合成试听 打开时),结果列在这里。
- 已导出:导出的 音色(可以 打开 或 在合成中使用)或 模型(点 模型 跳到模型页)。导出的权重会加到所选音色上;导出的新模型以
引擎/名称出现在模型列表中。
页面底部的 删除 把实验及其工作文件移到回收站,已导出的内容保留。
CPU 与 GPU
- 微调实际上需要 GPU。按 内存 设置,各微调在其配方默认批大小下能运行的最小显卡如下(峰值在 RTX 3090 上测得,加上估算的余量:多一成再加 512 MB):
| 微调 | 标准 | 低 | 最低 |
|---|---|---|---|
CosyVoice 2 / 3, llm (2 的 llm_flow 相同) | 12 GB | 12 GB | 12 GB |
F5-TTS full | 12 GB | 12 GB | 8 GB |
| Fish Speech S2 Pro LoRA, 批大小 1 / 2 | 16 GB / 24 GB | 16 GB / 24 GB | 16 GB / 24 GB |
GPT-SoVITS speaker (批大小 4) | 6 GB | 6 GB | 6 GB |
OmniVoice full | 16 GB | 16 GB | 6 GB |
| OmniVoice LoRA | 12 GB | 4 GB | 4 GB |
Qwen3-TTS 1.7B speaker | 24 GB | 24 GB | 12 GB |
VoxCPM 0.5B full | 24 GB | 16 GB | 16 GB |
| VoxCPM 0.5B / 1.5 / 2 LoRA (批大小 16) | 12 GB / 12 GB / 24 GB | 4 GB / 6 GB / 12 GB | 4 GB / 6 GB / 12 GB |
- 所有引擎也都能在 CPU 上训练,适合用很少的数据和步数确认流程能走通。
- 设置 › 训练 中还有 训练精度、每次运行保留的检查点数 和 内存:标准 按各配方训练;低 加上梯度检查点(反向传播时重新运行模型的每个块,而不保留其激活值),并把用不到的部分移出 GPU,结果相同,每步慢几个百分点到一倍(在 RTX 3090 上测得:F5-TTS +6 %、VoxCPM +51 %、Qwen3-TTS +80 %、OmniVoice +104 %);最低 还把优化器状态放在内存中,并从内存流式加载 LoRA 的冻结权重,结果略有不同。方法自己的 gradient_checkpointing 超参数优先。
- 在 GPU 上精确复现微调(
training.deterministic,默认关闭):在 GPU 上,同一个实验运行两次得到的权重略有不同,因为用原子操作求和的内核(许多反向传播中都有,还有 SDPA 融合注意力的反向传播)每次相加的顺序不同。GPT-SoVITS 的损失在几步之后就会分开;Fish Speech 的 LoRA 在最后几位上不同。开启后,每个阶段都使用 torch 的确定性内核,并且除非 注意力 指定了某个后端,否则使用 math 注意力内核:两次运行完全相同(两者都在 RTX 3090 上验证过)。代价是一些时间(测试用的微调,预热后:GPT-SoVITS 30.6 → 34.7 s,Fish Speech 41.1 → 43.0 s),以及长序列上 math 内核所需的显存。在 CPU 上,微调总能复现。 - 为新实验选择方法时,对话框会显示每种内存设置下一次运行大约需要多少显存;估计超过 GPU 空闲显存的运行会在日志中说明,并给出放得下的设置;没有设置能解决时,给出更小的
batch_size(Fish Speech 的 LoRA 在默认批量 4 下需要超过 24 GB 显存;3 可以放下)。在 GPU 上,每个记录的步骤还会报告 memory/peak_mb,即实际用量。
命令行
mizuoto dataset create Narrator --lang zh
mizuoto dataset add narrator recordings/ # 与音频同名的 .lab 或 .txt 即其文本
mizuoto dataset import narrator ljspeech/ --layout ljspeech
mizuoto dataset prepare narrator # 切分、转写、统一音量
mizuoto dataset check narrator
mizuoto asset download gptsovits/s2d-v2pro # v2Pro 的预训练判别器
mizuoto train methods gptsovits/v2pro-base # 可用的训练方式及其设置
mizuoto train new narrator --base gptsovits/v2pro-base --dataset narrator --hp sovits_epochs=8
mizuoto train run narrator # 从第一个未完成的阶段继续
mizuoto train run narrator --stage <阶段id> # 只运行某个阶段
mizuoto train metrics narrator