ONNX 模型库
返回模型

说明文档

目录

  1. GLaDOS 语音模型,基于德语 Portal 1 和 Portal 2 游戏文件训练
    1. 模型描述
    2. 数据集与训练
      1. 构建训练数据集
      2. 训练
      3. 推理最终模型

<a id="orgf1ffe5a"></a>

GLaDOS 语音模型,基于德语 Portal 1 和 Portal 2 游戏文件训练

<a id="orgb8e0867"></a>

模型描述

本模型使用 Torsten High 模型的检查点作为基础,并通过直接来自 Portal 1 和 Portal 2 游戏文件的语音台词进行微调,以在 piper 中复现德语 GLaDOS 的声音。

训练在 RTX 4000 上进行了超过 3000 个 epoch。

您将在此找到两个语音模型:

  • de_DE-glados-high.onnxde_DE-glados-high.onnx.json:GLaDOS 本人的声音
  • de_DE-glados-turret-high.onnxde_DE-glados-turret-high.onnx.json:在上述模型基础上微调,使其听起来像炮塔的声音。

<a id="orgdebb47e"></a>

数据集与训练

我还在此仓库中添加了关于如何构建训练数据集的提示以及用于准备和训练模型的工具链。 原因如下:

  • 训练数据是 Valve 的知识产权并受版权保护(出于显而易见的原因,我无法在此包含它)
  • 为 piper 训练模型(截至 2025 年初)依赖于 2021 年的旧/过时工具,让一切正常运行可能会非常令人沮丧

要求

  • 一台配备 nVidia GPU 的 PC,并安装了专有 nVidia 驱动程序、CUDA、Docker + Docker 以及 nvidia-container-toolkit
  • 理想情况下使用 Linux 系统(WSL 未测试但可能可以工作)
  • 基本的 Linux 和 Python 知识

<a id="org793fef7"></a>

构建训练数据集

  1. 从游戏中提取文件

    训练数据集已从 Portal 1 和 Portal 2 游戏文件中提取。 由于法律原因,它们不包含在此仓库中。但您可以通过 VPKEdit 轻松从游戏文件中提取它们 Portal 1

    • 通过 Steam 将游戏切换到所需语言(此处:德语)
    • 导航到 <steam>/steamapps/common/Portal/portal 并使用 VPKEdit 打开 portal_pak_dir.vpk
    • portal_pak_dir.vpk 内部,导航到 sound/vo/aperture_ai 并将所有 *.wav 文件提取到此 git 仓库内的 raw 文件夹中

    Portal 2:

    • 通过 Steam 将游戏切换到所需语言(此处:德语)
    • 导航到 <steam>/steamapps/common/portal 2。选择与语言匹配的子文件夹(此处为 portal2_german)并通过 VPKEdit 打开 pak01_dir.vpk
    • pak01_dir.vpk 内部,导航到 sound/vo/glados 并将所有 *.wav 文件(但不包括子文件夹)提取到此 git 仓库内的 raw 文件夹中

    Portal 2 DLC 1

    • 对上面的 Portal 2 重复步骤 1,但现在选择 portal2_dlc1_<your language> 文件夹(如果存在)。此处 portal2_dlc1_german 确实存在。使用 VPKEdit 打开 pak01_dir.vpk
    • 对上面的 Portal 2 重复步骤 3,但将文件复制到此 git 仓库的 raw
  2. 转码文件

    我们需要对文件进行转码。Portal 1 文件的采样率为 44.1 kHz WAV,而 Portal 2 文件为 MP3。 对于训练,我们需要 WAV、16 位(LE)、单声道 PCM,采样率如下所示,具体取决于我们要训练的模型质量。

    • x-low, low: 16000 kHz
    • medium, high: 22050 Hz

    注意:原则上,我们也可以在 44100 Hz 上训练,但是 piper-train 需要针对训练推理进行修改,因为它只支持 运行以下命令(需要安装 ffmpeg

    # 在运行脚本之前,首先编辑您想要的比特率
    ./0_transcode.sh
    
  3. 按好/坏样本分类

    <span class="underline">现在是烦人的部分</span>:逐一收听所有语音样本,并按好(相同的语音风格,质量没有下降,没有额外的非语音部分或含糊不清等)和坏(相反)进行分类 我为此目的编写了一个辅助脚本:1<sub>sort</sub><sub>good</sub><sub>bad.py</sub>(阅读其中的注释)。 <span class="underline">但请稍等</span>:在您执行这项可能需要数小时的烦人工作之前:我希望各语言的语音台词质量相似。所以您可以使用我的脚本 1_from_good.py,它使用 good.txt 文件根据我自己收听 GLaDOS 时做出的决定将语音样本标记为。 运行以下命令

    ./1_from_good.py
    
  4. 转录

    现在我们需要转录文件。为此,我们需要 faster-whisper。安装和使用它的最简单方法是通过 Docker。 但在执行此操作之前,您应该编辑文件 2_transcribe.py 并选择您想要使用的语言和模型。

    运行以下命令以构建 Docker 容器

    docker compose up --build -d
    docker exec -it transcribe bash
    

    您现在应该在 transcribe Docker 容器中。运行

    ./2_transcribe.py
    

    这将生成一个新文件 metadata.csv。<span class="underline">转录完成后,将此文件复制到 raw_good</span>

<a id="org2be9bb4"></a>

训练

为此,您应该使用此仓库提供的 Docker 容器。 但在执行此操作之前,您需要配置新文件:

  • 3<sub>gen</sub><sub>traindata.sh</sub>:编辑采样率(x-low 和 low 为 16000,medium、high 模型为 22050)和语言代码(en、de、ru、fr、…)
  • 4<sub>train.sh</sub>:编辑适合您训练硬件的 QUALITY、BATCHSIZE、PHONEME<sub>MAX</sub> 参数。 还要选择要从中开始的 CHKPOINT:理想情况下,您不想从头开始训练,而是从现有的检查点开始。 从 piper 人员那里获取一个,它适合您想要训练的模型(x-low、low、medium、high)和语言。 将其复制到此仓库内的 checkpoints 中。

现在在此仓库内运行以下命令(如果您还没有为转录执行此操作)

docker compose up --build -d
docker exec -it training bash

这将构建并进入训练容器,并通过 tensorboard 在 http://127.0.0.1:6006 导出训练指标

从容器内部,您现在需要为训练过程生成训练数据

./3_gen_traindata.sh

现在您已经准备好进行训练了。只需运行

./4_train.sh

在容器内。

如果您需要停止训练,只需通过在 ./4_train.sh 中设置 CHCKPOINT 变量来更改检查点的路径。

<a id="org192c2b8"></a>

推理最终模型

训练完成后(无论是已经收敛还是您达到了最大 epoch 限制),您需要将模型导出为 onnx 格式。 首先,编辑 5_export.sh 并设置名称以及您要从中导出模型的检查点(通常是 4_train.sh 训练的最后一个检查点 从仍在训练 Docker 容器内运行此命令

./5_export.sh

这将生成一个 <model_name>.onnx<model_name>.onnx.json 文件。后者需要进行调整:在文件编辑器中打开它并导航到读取以下内容的行

"dataset": "",

并将 "" 替换为此模型的名称(此处:"<model<sub>name</sub>>")

"dataset": "de_DE-glados-high"

这两个文件现在可以被 piper 使用

systemofapwne/piper-de-glados

作者 systemofapwne

text-to-speech
↓ 0 ♥ 8

创建时间: 2025-03-01 17:59:16+00:00

更新时间: 2025-09-18 13:25:53+00:00

在 Hugging Face 上查看

文件 (46)

.gitattributes
.gitignore
0_transcode.sh
1_from_good.py
1_sort_good_bad.py
2_transcribe.py
3_gen_traindata.sh
4_train.sh
5_export.sh
Dockerfile
README.md
README.org
checkpoints/.gitignore
checkpoints/glados-high-epoch=5999-step=1838414.ckpt
checkpoints/glados-low-epoch=5999-step=3206120.ckpt
checkpoints/glados-medium-epoch=5958-step=3198904.ckpt
checkpoints/turret-high-epoch=8999-step=1862414.ckpt
checkpoints/turret-low-epoch=8999-step=3230120.ckpt
checkpoints/turret-medium-epoch=8999-step=3223232.ckpt
compose.yml
cudnn_fix
de/de_DE/glados-turret/high/MODEL_CARD
de/de_DE/glados-turret/high/de_DE-glados-turret-high.onnx ONNX
de/de_DE/glados-turret/high/de_DE-glados-turret-high.onnx.json
de/de_DE/glados-turret/low/MODEL_CARD
de/de_DE/glados-turret/low/de_DE-glados-turret-low.onnx ONNX
de/de_DE/glados-turret/low/de_DE-glados-turret-low.onnx.json
de/de_DE/glados-turret/medium/MODEL_CARD
de/de_DE/glados-turret/medium/de_DE-glados-turret-medium.onnx ONNX
de/de_DE/glados-turret/medium/de_DE-glados-turret-medium.onnx.json
de/de_DE/glados/high/MODEL_CARD
de/de_DE/glados/high/de_DE-glados-high.onnx ONNX
de/de_DE/glados/high/de_DE-glados-high.onnx.json
de/de_DE/glados/low/MODEL_CARD
de/de_DE/glados/low/de_DE-glados-low.onnx ONNX
de/de_DE/glados/low/de_DE-glados-low.onnx.json
de/de_DE/glados/medium/MODEL_CARD
de/de_DE/glados/medium/de_DE-glados-medium.onnx ONNX
de/de_DE/glados/medium/de_DE-glados-medium.onnx.json
good.txt
metadata_glados_DE.csv
metadata_turret_DE.csv
raw/.gitignore
raw_bad/.gitignore
raw_good/.gitignore
voices.json