重要

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

检查点#

在 NeMo 中加载预训练检查点主要有两种方法

  • 使用 restore_from() 方法加载本地检查点文件 (.nemo),或者

  • 使用 from_pretrained() 方法从 NGC 下载并设置检查点。

有关每种方法的说明和示例,请参阅以下章节。

请注意,这些说明适用于加载完全训练的检查点以进行评估或微调。要恢复未完成的训练实验,请使用实验管理器,方法是将 resume_if_exists 标志设置为 True

加载本地检查点#

NeMo 会自动保存以 .nemo 格式训练的模型的检查点。或者,要在任何时候手动保存模型,请执行 model.save_to(<checkpoint_path>.nemo)

如果存在您想要加载的本地 .nemo 检查点,请使用 restore_from() 方法

import nemo.collections.asr as nemo_asr
model = nemo_asr.models.<MODEL_BASE_CLASS>.restore_from(restore_path="<path/to/checkpoint/file.nemo>")

其中模型基类是原始检查点的 ASR 模型类,或通用的 ASRModel 类。

混合 ASR-TTS 模型检查点#

混合 ASR-TTS 模型 是 ASR 模型、文本到梅尔频谱图生成器和可选增强器的透明包装器。该模型保存为包含所有这些部分的完整 .nemo 检查点。由于透明性,ASR 模型可以在训练/微调后单独提取,方法是使用 asr_model 属性(NeMo 子模型) hybrid_model.asr_model.save_to(<asr_checkpoint_path>.nemo),或者使用为方便起见而制作的包装器 hybrid_model.save_asr_model_to(<asr_checkpoint_path>.nemo)

预训练检查点#

ASR 集合包含在各种数据集上针对各种任务训练的多个模型的检查点。这些检查点可通过 NGC NeMo 自动语音识别集合Huggingface 获取。这些网站上的模型卡片包含有关每个可用检查点的更多信息。

下表列出了从上述数据源获得的顶级 ASR 模型。可以通过 ASR 模型类中的 from_pretrained() 方法访问这些模型。通常,您可以使用以下格式的代码加载这些模型中的任何一个

import nemo.collections.asr as nemo_asr
model = nemo_asr.models.ASRModel.from_pretrained(model_name="<MODEL_NAME>")

其中模型名称是下表中“模型名称”条目下的值。

例如,要加载用于语音识别的基础英语 QuartzNet 模型,请运行

model = nemo_asr.models.ASRModel.from_pretrained(model_name="QuartzNet15x5Base-En")

如果您需要访问特定的模型功能,也可以从特定模型类(例如 QuartzNet 的 EncDecCTCModel)调用 from_pretrained()

如果您想以编程方式列出特定基类可用的模型,可以使用 list_available_models() 方法。

nemo_asr.models.<MODEL_BASE_CLASS>.list_available_models()

转录/推理#

要在加载模型后执行推理并转录语音样本,请使用 transcribe() 方法

model.transcribe(audio=[list of audio files], batch_size=BATCH_SIZE)

audio 可以是文件的字符串路径,多个文件的字符串路径列表,通过 soundfile 或其他库加载的音频文件的 numpy 或 PyTorch 张量,甚至此类张量的列表。这种扩展的转录输入支持应有助于用户轻松地将 NeMo 集成到他们的管道中。


您可以在表示音频信号的 numpy 数组上进行推理,如下所示。请注意,您有责任在将音频传递给模型之前将其处理为单声道和 16KHz 采样率。

import torch
import soundfile as sf

from nemo.collections.asr.models import ASRModel
model = ASRModel.from_pretrained(<Model Name>)
model.eval()

# Load audio files
audio_file = os.path.join(test_data_dir, "asr", "train", "an4", "wav", "an46-mmap-b.wav")
audio, sr = sf.read(audio_file, dtype='float32')

audio_file_2 = os.path.join(test_data_dir, "asr", "train", "an4", "wav", "an104-mrcb-b.wav")
audio_2, sr = sf.read(audio_file_2, dtype='float32')

# Mix one numpy array audio segment with torch audio tensor
audio_2 = torch.from_numpy(audio_2)

# Numpy array + torch tensor mixed tensor input (for batched inference)
outputs = model.transcribe([audio, audio_2], batch_size=2)

为了从 CTC 或 RNNT 模型(以前称为 logprobs)获得对齐,您可以使用以下代码

hyps = model.transcribe(audio=[list of audio files], batch_size=BATCH_SIZE, return_hypotheses=True)
logprobs = hyps[0].alignments  # or hyps[0][0].alignments for RNNT

通常,我们希望一次转录大量文件(例如,可能来自清单)。在这种情况下,直接使用 transcribe() 可能不正确,因为它会延迟结果的返回,直到处理完输入中的每个样本。一种解决方法是多次调用 transcribe(),每次都使用数据的一小部分子集。现在通过 transcribe_generator() 支持此工作流程。

import nemo.collections.asr as nemo_asr
model = nemo_asr.models.ASRModel.from_pretrained(<Model Name>)

config = model.get_transcribe_config()
config.batch_size = 32
generator = model.transcribe_generator(audio, config)

for processed_outputs in generator:
    # process a batch of 32 results (or less if last batch does not contain 32 elements)
    ....

有关更多信息,请参阅 nemo.collections.asr.modules。有关通用 Transcription API 的更多信息,请查看 TranscriptionMixin。音频文件应为 16KHz 单声道 wav 文件。


长音频推理#

在某些情况下,音频对于标准推理来说太长,特别是如果您使用的是 Conformer 等模型,其中注意力层的时间和内存成本与持续时间成二次方比例。

在 NeMo 中对长音频文件执行推理主要有两种方法

第一种方法是使用缓冲推理,其中音频被分成块来运行,然后合并输出。相关的脚本包含在 此文件夹 中。

第二种方法,特别是对于具有 Conformer/Fast Conformer 编码器的模型,是使用局部注意力,这会将成本更改为线性。您可以使用以下配置之一训练具有 Longformer 风格 (https://arxiv.org/abs/2004.05150) 局部+全局注意力的 Fast Conformer 模型:<NeMo_git_root>/examples/asr/conf/fastconformer/fast-conformer-long_ctc_bpe.yaml 的 CTC 配置和 <NeMo_git_root>/examples/asr/conf/fastconformer/fast-conformer-long_transducer_bpe.yaml 的 transducer 配置。您还可以将任何使用完整上下文注意力训练的模型转换为局部注意力,但这在某些情况下可能会导致较低的 WER。您可以在运行 transcribeevaluation 脚本时切换到局部注意力,方法如下

python speech_to_text_eval.py \
    (...other parameters...)  \
    ++model_change.conformer.self_attention_model="rel_pos_local_attn" \
    ++model_change.conformer.att_context_size=[128, 128]

或者,您可以在加载检查点后更改注意力模型

asr_model = ASRModel.from_pretrained('stt_en_conformer_ctc_large')
asr_model.change_attention_model(
    self_attention_model="rel_pos_local_attn",
    att_context_size=[128, 128]
)

有时,模型最早阶段的下采样模块可能比实际的前向传递占用更多内存,因为它直接对音频序列进行操作,而音频序列可能无法容纳非常长的音频文件的内存。为了减少子采样模块的内存消耗,您可以要求模型对输入序列执行自动分块并逐片处理,这会花费更多时间,但可以避免 OutOfMemoryError。

asr_model = ASRModel.from_pretrained('stt_en_fastconformer_ctc_large')
# Speedup conv subsampling factor to speed up the subsampling module.
asr_model.change_subsampling_conv_chunking_factor(1)  # 1 = auto select

注意

只有在下采样层中使用深度可分离卷积的某些模型支持此操作。请在您的模型上试用,看看是否支持。

多任务模型推理#

使用结构化提示的多任务模型需要额外的任务令牌作为输入,在这种情况下,建议使用清单作为输入。以下是使用 nvidia/canary-1b 模型的示例

from nemo.collections.asr.models import EncDecMultiTaskModel

# load model
canary_model = EncDecMultiTaskModel.from_pretrained('nvidia/canary-1b')

# update dcode params
decode_cfg = canary_model.cfg.decoding
decode_cfg.beam.beam_size = 1
canary_model.change_decoding_strategy(decode_cfg)

# run transcribe
predicted_text = canary_model.transcribe(
      "<path to input manifest file>",
      batch_size=16,  # batch size to run the inference with
)

这里的清单文件应该是一个 json 文件,其中每行具有以下格式

{
   "audio_filepath": "/path/to/audio.wav",  # path to the audio file
   "duration": None,  # duration of the audio in seconds, set to `None` to use full audio
   "taskname": "asr",  # use "ast" for speech-to-text translation
   "source_lang": "en",  # language of the audio input, set `source_lang`==`target_lang` for ASR
   "target_lang": "en",  # language of the text output
   "pnc": "yes",  # whether to have PnC output, choices=['yes', 'no']
   "answer": "na", # set to non-dummy strings to calculate WER/BLEU scores
}

请注意,使用清单允许为每个音频单独指定任务配置。如果我们想为所有音频文件使用相同的任务配置,则可以直接在 transcribe 方法中指定。

canary_model.transcribe(
        audio=[list of audio files],
        batch_size=4,  # batch size to run the inference with
        task="asr",  # use "ast" for speech-to-text translation
        source_lang="en",  # language of the audio input, set `source_lang`==`target_lang` for ASR
        target_lang="en",  # language of the text output
        pnc=True,  # whether to have PnC output, choices=[True, False]
)

在 Apple M 系列 GPU 上进行推理#

要在 Apple Mac M 系列 GPU (mps PyTorch 设备) 上执行推理,请使用 PyTorch 2.0 或更高版本(请参阅 mac-installation <https://github.com/NVIDIA/NeMo/blob/stable/README.rst#mac-computers-with-apple-silicon> 部分)。应设置环境变量 PYTORCH_ENABLE_MPS_FALLBACK=1,因为并非 PyTorch 中的所有操作当前都在 mps 设备上实现。

如果将 allow_mps=true 标志传递给 speech_to_text_eval.py,则会自动选择 mps 设备。

PYTORCH_ENABLE_MPS_FALLBACK=1 python speech_to_text_eval.py \
  (...other parameters...)  \
  allow_mps=true

在不同数据集上微调#

教程 部分提供了多个 ASR 教程。其中大多数教程解释了如何实例化预训练模型,以及如何准备模型以在某些数据集(使用相同语言)上进行微调作为演示。

推理执行流程图#

在准备您自己的推理脚本时,请遵循执行流程图顺序以进行正确的推理,该顺序可在 ASR 集合的示例目录 中找到。

自动语音识别模型#

语音识别#

以下是 NeMo 中可用于特定语言的高质量 ASR 模型列表,所有 ASR 模型都可以在 所有检查点 中找到。

多语言多任务#

模型

语言

canary-1b

英语、法语、德语、西班牙语

Parakeet#

Fast Conformer 混合#

代码切换#

模型

语言

stt_enes_conformer_ctc_large_codesw

英语、西班牙语

stt_enes_conformer_transducer_large_codesw

英语、西班牙语