重要

您正在查看 NeMo 2.0 文档。此版本引入了对 API 和新库 NeMo Run 的重大更改。我们目前正在将所有功能从 NeMo 1.0 移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

数据预处理#

NeMo TTS 配方支持大多数公共 TTS 数据集,这些数据集包含多种语言、多种情感和多个说话人。当前配方涵盖英语 (en-US)、德语 (de-DE)、西班牙语 (es-ES) 和普通话 (zh-CN),同时计划支持更多其他语言。NeMo 提供了特定于语料库的数据预处理脚本,如 scripts/data_processing/tts/ 目录中所示,以将常见的公共 TTS 数据集转换为 nemo/collections/tts/data/dataset.py 中定义的数据加载器所期望的格式。nemo_tts 集合期望每个数据集都包含一组单独音频文件中的话语,以及一个 JSON 清单,该清单描述数据集,每行包含一个话语的信息。音频文件可以是 Pydub 支持的任何格式,尽管我们建议使用 WAV 文件,因为它们是默认格式并且已经过最全面的测试。NeMo 支持音频的任何原始采样率,尽管我们提取补充数据和模型训练的脚本都将常见的目标采样率指定为 44100 Hz 或 22050 Hz。如果原始采样率与目标采样率不匹配,则 feature preprocess 可以自动将原始采样率重采样为目标采样率。

每个将要传入的数据集都应该有一个 JSON 清单文件,因此,如果用户想要单独的训练和验证数据集,他们也应该有单独的清单。否则,他们将使用训练数据加载验证数据,反之亦然。清单的每一行应采用以下格式

{
  "audio_filepath": "/path/to/audio.wav",
  "text": "the transcription of the utterance",
  "normalized_text": "the normalized transcription of the utterance",
  "speaker": 5,
  "duration": 15.4
}

其中 "audio_filepath" 提供 .wav 文件(对应于话语)的绝对路径,以便音频文件可以位于任何位置,而不受组织在与清单本身相同的目录中的约束;"text" 包含话语的完整文本记录(字素或音素或它们的混合);"normalized_text" 包含规范化的 "text",这有助于绕过规范化步骤,但它是完全可选的;"speaker" 指的是整数说话人 ID;"duration" 描述了话语的持续时间,以秒为单位。

清单中的每个条目(描述一个音频文件)都应以 "{""}" 括起来,并且必须放在一行上。"key": value 键值对应用逗号分隔,如上所示。NeMo 在清单中不强制执行空行,以便总行数指示数据集中的音频文件总数。

一旦存在描述数据集中每个音频文件的清单,请在实验配置文件中分配 JSON 清单文件路径,例如,training_ds.manifest_filepath=<path/to/manifest.json>

按照下面的说明运行特定于语料库的脚本,您可以开始直接处理这些公共数据集,或创建自定义脚本来预处理您的自定义数据集脚本。

公共 TTS 数据集#

下表总结了 NeMo TTS 使用的一系列高质量公共数据集的统计信息。我们建议开始为您具有相近采样率和说话人数的自定义数据集定制脚本。

语言

区域设置

数据集名称

#spk-总计

#spk-F

#spk-M

#hours-总计

#hour-F

#hour-M

采样率

网址

英语

en-US

LJSpeech

1

1

0

23.92

23.92

0.00

22,050Hz

https://keithito.com/LJ-Speech-Dataset/

英语

en-US

LibriTTS (clean)

1230

592

638

262.62

133.97

128.65

24,000Hz

https://www.openslr.org/60/

英语

en-US

HiFiTTS

10

6

4

291.60

158.30

133.30

44,100Hz

http://www.openslr.org/109/

德语

de-DE

Thorsten Müller Neutral 21.02 数据集

1

0

1

20.91

0.00

20.91

22,050Hz

https://zenodo.org/record/5525342/files/thorsten-neutral_v03.tgz?download=1

德语

de-DE

Thorsten Müller Neutral 22.10 数据集

1

0

1

11.21

0.00

11.21

22,050Hz

https://zenodo.org/record/7265581/files/ThorstenVoice-Dataset_2022.10.zip?download=1

德语

de-DE

HUI-Audio-Corpus-German (clean)

118

不适用

不适用

253.85

0.00

0.00

44,100Hz

https://opendata.iisys.de/datasets.html

西班牙语

es-AR

众包高质量阿根廷西班牙语

44

31

13

8.03

5.61

2.42

48,000Hz

https://www.openslr.org/61/

西班牙语

es-CL

众包高质量智利西班牙语

31

13

18

7.15

2.84

4.31

48,000Hz

https://www.openslr.org/71/

西班牙语

es-CO

众包高质量哥伦比亚西班牙语

33

16

17

7.58

3.74

3.84

48,000Hz

https://www.openslr.org/72/

西班牙语

es-PE

众包高质量秘鲁西班牙语

38

18

20

9.22

4.35

4.87

48,000Hz

https://www.openslr.org/73/

西班牙语

es-PR

众包高质量波多黎各西班牙语

5

5

0

1.00

1.00

0.00

48,000Hz

https://www.openslr.org/74/

西班牙语

es-VE

众包高质量委内瑞拉西班牙语

23

11

12

4.81

2.41

2.40

48,000Hz

https://www.openslr.org/75/

中文

zh-CN

SFSpeech 中文/英文双语语音

1

1

0

4.50

4.50

0.00

22,050Hz

https://catalog.ngc.nvidia.com/orgs/nvidia/resources/sf_bilingual_speech_zh_en

特定语料库的数据预处理#

NeMo 实现了模型无关的数据预处理脚本,这些脚本封装了下载原始数据集、提取文件和/或规范化原始文本以及生成数据清单文件的步骤。大多数脚本都能够重复用于任何数据集,只需进行少量调整。大多数 TTS 模型都可以开箱即用地与 LJSpeech 数据集一起使用,因此从 LJSpeech 脚本开始调整您的自定义脚本将非常简单。对于某些可能需要补充数据进行训练和验证的模型,例如语音/文本对齐先验、音高、说话人 ID、情感 ID、能量等,您可能需要通过调用 script/dataset_processing/tts/extract_sup_data.py 补充数据提取的额外步骤。以下小节演示了运行数据预处理脚本的详细说明。

LJSpeech#

$ python scripts/dataset_processing/tts/ljspeech/get_data.py \
    --data-root <your_local_dataset_root>

$ python scripts/dataset_processing/tts/extract_sup_data.py \
    --config-path ljspeech/ds_conf \
    --config-name ds_for_fastpitch_align.yaml \
    manifest_filepath=<your_path_to_train_manifest> \
    sup_data_path=<your_path_to_where_to_save_supplementary_data>

LibriTTS#

$ python scripts/dataset_processing/tts/libritts/get_data.py \
    --data-root <your_local_dataset_root> \
    --data-sets "ALL"
    --num-workers 4

$ python scripts/dataset_processing/tts/extract_sup_data.py \
    --config-path ljspeech/ds_conf \
    --config-name ds_for_fastpitch_align.yaml \
    manifest_filepath=<your_path_to_train_manifest> \
    sup_data_path=<your_path_to_where_to_save_supplementary_data>

注意

LibriTTS 原始采样率为 24000 Hz,我们重用 LJSpeech 的配置将其降采样到 22050 Hz

HiFiTTS#

此数据集的文本已规范化。因此无需再次预处理数据。但我们仍然需要一个下载脚本并将其拆分为清单。

Thorsten Müller 的德语 Neutral-TTS 数据集#

Thorsten Müller 现在发布了两个德语 neutral 数据集,分别是 21.02 和 22.10。版本 22.10 是使用更好的录音设置(例如录音室和更好的麦克风)录制的。因此,建议在 22.10 版本上训练模型,因为其音频质量更好,并且具有更自然的语音流和更高的每秒语音字符速率。以下描述了这两个数据集,并在 scripts/dataset_processing/tts/thorsten_neutral/get_data.py:THORSTEN_NEUTRAL 中定义。

# Thorsten Müller published two neural voice datasets, 21.02 and 22.10.
THORSTEN_NEUTRAL = {
    "21_02": {
        "url": "https://zenodo.org/record/5525342/files/thorsten-neutral_v03.tgz?download=1",
        "dir_name": "thorsten-de_v03",
        "metadata": ["metadata.csv"],
    },
    "22_10": {
        "url": "https://zenodo.org/record/7265581/files/ThorstenVoice-Dataset_2022.10.zip?download=1",
        "dir_name": "ThorstenVoice-Dataset_2022.10",
        "metadata": ["metadata_train.csv", "metadata_dev.csv", "metadata_test.csv"],
    },
}
# Version 22.10
$ python scripts/dataset_processing/tts/thorsten_neutral/get_data.py \
    --data-root <your_local_dataset_root> \
    --manifests-root <your_local_manifest_root> \
    --data-version "22_10" \
    --val-size 100 \
    --test-size 100 \
    --seed-for-ds-split 100 \
    --normalize-text

# Version 21.02
$ python scripts/dataset_processing/tts/thorsten_neutral/get_data.py \
    --data-root <your_local_dataset_root> \
    --manifests-root <your_local_manifest_root> \
    --data-version "21_02" \
    --val-size 100 \
    --test-size 100 \
    --seed-for-ds-split 100 \
    --normalize-text

# extract pitch and compute pitch normalization params for each version.
$ python scripts/dataset_processing/tts/extract_sup_data.py \
    --config-path thorsten_neutral/ds_conf \
    --config-name ds_for_fastpitch_align.yaml \
    manifest_filepath=<your_path_to_train_manifest> \
    sup_data_path=<your_path_to_where_to_save_supplementary_data>

HUI Audio Corpus German#

$ python scripts/dataset_processing/tts/hui_acg/get_data.py \
    --data-root <your_local_dataset_root> \
    --manifests-root <your_local_manifest_root> \
    --set-type clean \
    --min-duration 0.1 \
    --max-duration 15 \
    --val-num-utts-per-speaker 1 \
    --test-num-utts-per-speaker 1 \
    --seed-for-ds-split 100

$ python scripts/dataset_processing/tts/hui_acg/phonemizer.py \
    --json-manifests <your_path_to_train_manifest> <your_path_to_val_manifest> <your_path_to_test_manifest> \
    --preserve-punctuation

$ python scripts/dataset_processing/tts/extract_sup_data.py \
    --config-path hui_acg/ds_conf \
    --config-name ds_for_fastpitch_align.yaml \
    manifest_filepath=<your_path_to_train_manifest> \
    sup_data_path=<your_path_to_where_to_save_supplementary_data>

SFSpeech 中文/英文双语语音#

# [prerequisite] Install and setup 'ngc' cli tool by following document https://docs.ngc.nvidia.com/cli/cmd.html

$ ngc registry resource download-version "nvidia/sf_bilingual_speech_zh_en:v1"

$ unzip sf_bilingual_speech_zh_en_vv1/SF_bilingual.zip -d <your_local_dataset_root>

$ python scripts/dataset_processing/tts/sfbilingual/get_data.py \
    --data-root <your_local_dataset_root>/SF_bilingual \
    --val-size 0.005 \
    --test-size 0.01 \
    --seed-for-ds-split 100

$ python scripts/dataset_processing/tts/extract_sup_data.py \
    --config-path sfbilingual/ds_conf \
    --config-name ds_for_fastpitch_align.yaml \
    manifest_filepath=<your_path_to_train_manifest> \
    sup_data_path=<your_path_to_where_to_save_supplementary_data>