重要提示

您正在查看 NeMo 2.0 文档。此版本对 API 进行了重大更改,并引入了一个新的库 NeMo Run。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚未提供的功能的文档,请参阅 NeMo 24.07 文档

字素音素模型#

字素到音素转换 (G2P) 是将字素(即,正字法符号)转换为音素(即,语言声音系统的单位)的任务。例如,对于 国际音标 (IPA): "Swifts, flushed from chimneys …" "ˈswɪfts, ˈfɫəʃt ˈfɹəm ˈtʃɪmniz …"

现代文本到语音 (TTS) 合成模型可以从原始文本输入及其对应的音频数据中学习发音,但是通过在训练期间依赖字素输入,此类模型无法提供纠正错误发音的可靠方法。因此,许多 TTS 系统在训练期间使用音标输入,以便在推理时直接访问和纠正发音。G2P 系统允许用户通过提供输入的音标转录来强制执行所需的发音。

G2P 模型将词汇表外词 (OOV)(例如专有名词和外来词)以及同形异音异义词转换为其音标形式,以提高合成文本的质量。

同形异音异义词 表示拼写相同但发音不同的词,例如,“read” 在 “I will read the book.” 与 “She read her project last week.” 中的发音不同。一个可以处理 OOV 词和同形异音异义词并替换字典查找的单个模型可以显着简化并提高合成语音的质量。

我们支持以下 G2P 模型

  • ByT5 G2P 一种基于 ByT5 的文本到文本模型 [[g2p-4]] 神经网络模型,最初在 [[g2p-6]][[g2p-5]] 中提出。

  • G2P-Conformer CTC 模型 - 使用 Conformer 编码器 [[g2p-3]],后跟一个线性解码器;该模型使用 CTC 损失进行训练。G2P-Conformer 模型的参数比 ByT5 模型少约 20 倍,并且是非自回归模型,这使其在推理期间更快。

这些模型可以使用单词或句子作为输入进行训练。如果使用句子级输入进行训练,则模型可以在单个通道中处理词汇表外词 (OOV) 和同形异音异义词以及无歧义词。请参阅 句子级数据集准备流程,了解如何标记用于 G2P 模型训练的数据。

此外,我们还支持用于同形异音异义词消歧的专用 BERT 基础分类模型,请参阅 此处 了解详细信息。

模型训练、评估和推理#

本节涵盖 ByT5 和 G2P-Conformer 模型。

这些模型采用 .json 清单格式的输入数据,并且应该有单独的训练和验证清单。清单的每一行都应采用以下格式

{"text_graphemes": "Swifts, flushed from chimneys.", "text": "ˈswɪfts, ˈfɫəʃt ˈfɹəm ˈtʃɪmniz."}

清单字段

  • text - manifest_filepath 中真值音素的字段名称

  • text_graphemes - manifest_filepath 中输入字素文本的字段名称

这些模型可以处理带有和不带有标点符号的输入。

要训练 ByT5 G2P 模型并在训练结束时对其进行评估,请运行

python examples/text_processing/g2p/g2p_train_and_evaluate.py \
    # (Optional: --config-path=<Path to dir of configs> --config-name=<name of config without .yaml>) \
    model.train_ds.manifest_filepath="<Path to manifest file>" \
    model.validation_ds.manifest_filepath="<Path to manifest file>" \
    model.test_ds.manifest_filepath="<Path to manifest file>" \
    trainer.devices=1 \
    do_training=True \
    do_testing=True

配置文件示例:NeMo/examples/tts/g2p/conf/g2p_t5.yaml

要训练 G2P-Conformer 模型并在训练结束时对其进行评估,请运行

python examples/text_processing/g2p/g2p_train_and_evaluate.py \
    # (Optional: --config-path=<Path to dir of configs> --config-name=<name of config without .yaml>) \
    model.train_ds.manifest_filepath="<Path to manifest file>" \
    model.validation_ds.manifest_filepath="<Path to manifest file>" \
    model.test_ds.manifest_filepath="<Path to manifest file>" \
    model.tokenizer.dir=<Path to pretrained tokenizer> \
    model.tokenizer_grapheme.do_lower=False \
    model.tokenizer_grapheme.add_punctuation=True \
    trainer.devices=1 \
    do_training=True \
    do_testing=True

配置文件示例:NeMo/examples/text_processing/g2p/conf/g2p_conformer_ctc.yaml

要评估预训练的 G2P 模型,请运行

python examples/text_processing/g2p/g2p_train_and_evaluate.py \
    # (Optional: --config-path=<Path to dir of configs> --config-name=<name of config without .yaml>) \
    pretrained_model="<Path to .nemo file or pretrained model name from list_available_models()>" \
    model.test_ds.manifest_filepath="<Path to manifest file>" \
    trainer.devices=1 \
    do_training=False \
    do_testing=True

要使用预训练的 G2P 模型运行推理,请运行

python g2p_inference.py \
    pretrained_model=<Path to .nemo file or pretrained model name for G2PModel from list_available_models()>" \
    manifest_filepath="<Path to .json manifest>" \
    output_file="<Path to .json manifest to save prediction>" \
    batch_size=32 \
    num_workers=4 \
    pred_field="pred_text"

模型的预测将保存在 output_filepred_field 中。

句子级数据集准备流程#

以下是句子级 G2P 模型训练的数据标记流程的总体概述

在这里,我们描述了用于生成增强数据的自动音素标记过程。下图显示了为句子级 G2P 模型训练准备数据的音素标记步骤。我们首先使用字典查找(例如 CMU 词典)将已知的无歧义词转换为其音标发音。接下来,我们使用 RAD-TTS 对齐器 [[g2p-1]] 自动标记同形异音异义词。有关如何使用预训练的对齐器模型消除同形异音异义词歧义的更多详细信息,请参阅 NeMo/tutorials/tts/Aligner_Inference_Examples.ipynb,位于 Google Colab 中。最后,我们使用特殊的掩码标记 “<unk>” 屏蔽 OOV 词,如下图所示(注意,我们在 G2P 模型训练期间使用 model.tokenizer_grapheme.unk_token=”҂” 符号。)使用此未知标记强制 G2P 模型在训练期间生成相同的掩码标记作为音标表示。在推理期间,只要 grapheme 输入中不包含此标记,模型就会生成 OOV 词的音素预测,而不会发出掩码标记。

用于同形异音异义词消歧的专用 BERT 基础分类模型#

HeteronymClassificationModel 是一个基于 BERT 的 [] 模型,表示 token 分类模型,可以一次处理多个同形异音异义词。该模型以句子作为输入,然后对于每个单词,它从可用形式中选择一个同形异音异义词选项。我们屏蔽无关形式以忽略模型对非歧义词的预测。例如,给定输入 “The Poems are simple to read and easy to comprehend.”,模型为单词 “read” 的可能选项 {READ_PRESENT 和 READ_PAST} 评分。可能的同形异音异义词形式从 WikipediaHomographData [[g2p-2]] 中提取。

该模型期望输入为 .json 清单格式,其中每行至少包含以下字段

{"text_graphemes": "Oxygen is less able to diffuse into the blood, leading to hypoxia.", "start_end": [23, 30], "homograph_span": "diffuse", "word_id": "diffuse_vrb"}

清单字段

  • text_graphemes - 输入句子

  • start_end - 输入句子中同形异音异义词跨度的开始和结束

  • homograph_span - 句子中的同形异音异义词

  • word_id - 同形异音异义词标签,例如,单词 diffuse 具有以下可能的标签:diffuse_vrbdiffuse_adj。有关更多详细信息,请参阅 google-research-datasets/WikipediaHomographData

要将 WikipediaHomographData 转换为适合 HeteronymClassificationModel 训练的 .json 格式,请运行

# WikipediaHomographData could be downloaded from `https://github.com/google-research-datasets/WikipediaHomographData <https://github.com/google-research-datasets/WikipediaHomographData>`__.

python NeMo/scripts/dataset_processing/g2p/export_wikihomograph_data_to_manifest.py \
        --data_folder=<Path to WikipediaHomographData>/WikipediaHomographData-master/data/eval/
        --output=eval.json
python NeMo/scripts/dataset_processing/g2p/export_wikihomograph_data_to_manifest.py \
        --data_folder=<Path to WikipediaHomographData>/WikipediaHomographData-master/data/train/
        --output=train.json

要训练模型,请运行

python g2p_heteronym_classification_train_and_evaluate.py \
    train_manifest=<Path to train manifest file>" \
    validation_manifest=<Path to validation manifest file>" \
    model.wordids=<Path to wordids.tsv file, similar to https://github.com/google-research-datasets/WikipediaHomographData/blob/master/data/wordids.tsv> \
    do_training=True \
    do_testing=False

要在训练完成时训练模型并对其进行评估,请运行

python g2p_heteronym_classification_train_and_evaluate.py \
    train_manifest=<Path to train manifest file>" \
    validation_manifest=<Path to validation manifest file>" \
    model.test_ds.dataset.manifest=<Path to test manifest file>" \
    model.wordids="<Path to wordids.tsv file>" \
    do_training=True \
    do_testing=True

要评估预训练模型,请运行

python g2p_heteronym_classification_train_and_evaluate.py \
    do_training=False \
    do_testing=True \
    model.test_ds.dataset.manifest=<Path to test manifest file>"  \
    pretrained_model=<Path to pretrained .nemo model or from list_available_models()>

要使用预训练的 HeteronymClassificationModel 运行推理,请运行

python g2p_heteronym_classification_inference.py \
    manifest="<Path to .json manifest>" \
    pretrained_model="<Path to .nemo file or pretrained model name from list_available_models()>" \
    output_file="<Path to .json manifest to save prediction>"

注意,如果输入清单包含目标 “word_id”,也将执行评估。在推理期间,模型预测同形异音异义词 word_id 并将预测保存在 output_file“pred_text” 字段中

{"text_graphemes": "Oxygen is less able to diffuse into the blood, leading to hypoxia.", "pred_text": "diffuse_vrb", "start_end": [23, 30], "homograph_span": "diffuse", "word_id": "diffuse_vrb"}

要使用 带有拼音的中文多音字 (CPP) 数据集训练模型,请运行

# prepare CPP manifest
mkdir -p ./cpp_manifest
git clone https://github.com/kakaobrain/g2pM.git
python3 export_zh_cpp_data_to_manifest.py --data_folder g2pM/data/ --output_folder ./cpp_manifest

# model training and evaluation
python3 heteronym_classification_train_and_evaluate.py \
    --config-name "heteronym_classification_zh.yaml" \
    train_manifest="./cpp_manifest/train.json" \
    validation_manifest="./cpp_manifest/dev.json" \
    model.test_ds.dataset.manifest="./cpp_manifest/test.json" \
    model.wordids="./cpp_manifest/wordid.tsv" \
    do_training=False \
    do_testing=True

要求#

G2P 需要安装 NeMo NLP 和 ASR 集合。有关更多详细信息,请参阅 安装说明

参考文献#

[[g2p-1]]

Rohan Badlani, Adrian Łańcucki, Kevin J Shih, Rafael Valle, Wei Ping 和 Bryan Catanzaro. One TTS alignment to rule them all. 在 ICASSP 2022-2022 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 6092–6096. IEEE, 2022.

[[g2p-2]]

Kyle Gorman, Gleb Mazovetskiy 和 Vitaly Nikolaev. Improving homograph disambiguation with supervised machine learning. 在 Proceedings of the Eleventh International Conference on Language Resources and Evaluation (LREC 2018). 2018.

[[g2p-3]]

Anmol Gulati, James Qin, Chung-Cheng Chiu, Niki Parmar, Yu Zhang, Jiahui Yu, Wei Han, Shibo Wang, Zhengdong Zhang, Yonghui Wu, 以及其他人。Conformer: convolution-augmented transformer for speech recognition. arXiv preprint arXiv:2005.08100, 2020.

[[g2p-4]]

Linting Xue, Aditya Barua, Noah Constant, Rami Al-Rfou, Sharan Narang, Mihir Kale, Adam Roberts 和 Colin Raffel. Byt5: towards a token-free future with pre-trained byte-to-byte models 2021. arXiv preprint arXiv:2105.13626, 2021.

[[g2p-5]]

Jian Zhu, Cong Zhang 和 David Jurgens. Byt5 model for massively multilingual grapheme-to-phoneme conversion. arXiv preprint arXiv:2204.03067, 2022.

[[g2p-6]]

Markéta Řezáčková, Jan Švec 和 Daniel Tihelka. T5g2p: using text-to-text transfer transformer for grapheme-to-phoneme conversion. International Speech Communication Association, 2021.