重要提示

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

NeMo Forced Aligner (NFA)#

NFA 托管在此处:NVIDIA/NeMo

NFA 是一款使用 NeMo 基于 CTC 的自动语音识别模型生成音频中语音的 token、单词和分段级别时间戳的工具。您可以提供自己的参考文本,或使用 ASR 生成的转录。您可以开箱即用地在 14+ 种语言中使用 NeMo 的 ASR 模型检查点,或训练您自己的模型。NFA 可用于 1 小时以上的长音频文件(取决于您的硬件和使用的 ASR 模型)。

演示和教程#

  • HuggingFace Space demo,用于快速试用各种语言的 NFA。

  • NFA “操作方法”笔记本 tutorial

  • “强制对齐如何工作”NeMo 博客 tutorial

快速入门#

  1. 安装 NeMo

  2. 准备一个 NeMo 风格的 manifest,其中包含您要处理的音频文件的路径以及(可选)它们的文本。

  3. 使用所需的配置运行 NFA 的 align.py 脚本,例如

python <path_to_NeMo>/tools/nemo_forced_aligner/align.py \
        pretrained_name="stt_en_fastconformer_hybrid_large_pc" \
        manifest_filepath=<path to manifest of utterances you want to align> \
        output_dir=<path to where your output files will be saved>
https://github.com/NVIDIA/NeMo/releases/download/v1.20.0/nfa_run.png

如何使用 NeMo Forced Aligner?#

要使用 NFA,您只需提供正确的 NeMo manifest(带有 "audio_filepath" 和可选的 "text" 字段)。

调用 align.py 脚本,并按如下方式指定参数

  • pretrained_name:字符串,用于指定 CTC NeMo ASR 模型的名称,该模型将自动从 NGC 下载并用于生成我们将用于进行对齐的 log-probs。任何 Quartznet、Citrinet、Conformer CTC 模型都应有效,在任何语言中(到目前为止仅测试过英语)。如果指定了 model_path,则不得指定 pretrained_name

    注意:目前 NFA 只能使用 CTC 模型或混合 CTC-Transducer 模型(在 CTC 模式下)。纯 Transducer 模型无法使用。

  • model_path:字符串,用于指定 CTC NeMo ASR 模型的本地文件路径,该模型将用于生成我们将用于进行对齐的 log-probs。如果指定了 pretrained_name,则不得指定 model_path

    注意

    目前 NFA 只能使用 CTC 模型或混合 CTC-Transducer 模型(在 CTC 模式下)。纯 Transducer 模型无法使用。

  • manifest_filepath:您要对齐的数据的 manifest 路径,其中包含 'audio_filepath''text' 字段。音频文件路径需要是绝对路径。

  • output_dir:用于保存输出文件的文件夹(例如 CTM、ASS),其中包含生成的对齐方式和新的 JSON manifest,其中包含指向这些 CTM/ASS 文件的路径。CTM 文件将被称为 <output_dir>/ctm/{tokens,words,segments}/<utt_id>.ctm,并且每个文件中的每一行都将以 <utt_id> 开头。默认情况下,utt_id 将是 audio_filepath 的词干。可以通过覆盖 audio_filepath_parts_in_utt_id 来更改此设置。新的 JSON manifest 将位于 <output_dir>/<original manifest file name>_with_ctm_paths.json。ASS 文件将位于 <output_dir>/ass/{tokens,words}/<utt_id>.ass。您可以通过调整参数 save_output_file_formats 来调整应保存哪些文件。

可选参数:#

  • align_using_pred_text:如果为 True,将使用 ASR 模型(由 pretrained_namemodel_path 指定)转录音频,然后使用该转录作为强制对齐的参考文本。"pred_text" 将保存在输出 JSON manifest 中,位于 <output_dir>/{original manifest name}_with_ctm_paths.json。为避免覆盖其他转录文本,如果原始 manifest 中已存在 "pred_text" 条目,程序将退出,而不会尝试生成对齐方式。(默认值:False)。

  • transcribe_device:将用于生成 log-probs(即转录)的设备。如果为 None,NFA 将其设置为 ‘cuda’(如果可用)(否则将其设置为 ‘cpu’)。如果指定了 transcribe_device,则需要是一个可以输入到 torch.device() 方法的字符串。(默认值:None)。

  • viterbi_device:将用于执行 Viterbi 解码的设备。如果为 None,NFA 将其设置为 ‘cuda’(如果可用)(否则将其设置为 ‘cpu’)。如果指定了 transcribe_device,则需要是一个可以输入到 torch.device() 方法的字符串。(默认值:None)。

  • batch_size:将用于生成 log-probs 和执行 Viterbi 解码的 batch_size。(默认值:1)。

  • use_local_attention:布尔标志,用于指定是否尝试对 ASR 模型使用本地注意力(仅当 ASR 模型是 Conformer 模型时才有效)。如果使用本地注意力,我们将本地注意力上下文大小设置为 [64,64]。

  • additional_segment_grouping_separator:一个可选字符串,用于将文本分隔成更小的段。如果未指定,则整个文本将被视为一个段。(默认值:None。不能是空字符串或空格(” “),因为 NFA 将自动生成由空格分隔的子字符串的单词级时间戳)。

    注意

    additional_segment_grouping_separator 将从参考文本和所有输出文件中删除,即它被视为不是参考文本一部分的标记。分隔符基本上将被视为空格,并且其周围的任何额外空格都将合并为一个,即,如果 additional_segment_grouping_separator="|",则以下文本将被等效对待:“abc|def”“abc |def”“abc| def”“abc | def"

  • remove_blank_tokens_from_ctm:一个布尔值,表示是否从 token 级输出 CTM 中删除 <blank> token。(默认值:False)。

  • audio_filepath_parts_in_utt_id:这指定我们将使用 audio_filepath 的多少‘部分’(从 audio_filepath 的最后一部分开始)来确定将在 CTM 文件中使用的 utt_id。(默认值:1,即 utt_id 将是 audio_filepath 的基本名称的词干)。另请注意,audio_filepath 中存在的任何空格都将替换为破折号,以便不更改 CTM 文件中以空格分隔的元素的数量。

  • minimum_timestamp_duration:一个浮点数,指示 CTM 中时间戳的最小持续时间(以秒为单位)。如果 CTM 中的任何行的持续时间低于 minimum_timestamp_duration,它将从中间向外扩大,直到达到 minimum_timestamp_duration,或到达音频文件的开头或结尾。请注意,这可能会导致时间戳重叠。(默认值:0,即不对预测持续时间进行修改)。

  • use_buffered_chunked_streaming:一个标志,指示是否执行缓冲分块流式传输。请注意,仅支持带有 per_feature 预处理器的 CTC 模型(例如,stt_en_citrinet_1024_gamma_0_25)。如果此选项设置为 True,则需要以下两个参数。

  • chunk_len_in_secs:缓冲分块流式推理的块大小。默认为 1.6 秒。

  • total_buffer_in_secs:缓冲分块流式推理的缓冲区大小。默认为 4.0 秒。

  • simulate_cache_aware_streaming:一个标志,指示是否使用缓存感知流式传输来获取用于对齐的 logits。默认值:False

  • save_output_file_formats:用于保存输出的文件格式列表。默认值:["ctm", "ass"](这些是当前所有可用的)。

  • ctm_file_configCTMFileConfig,用于指定输出 CTM 文件的配置。

  • ass_file_configASSFileConfig,用于指定输出 ASS 文件的配置。

输入 manifest 文件格式#

默认情况下,NFA 需要提供一个 ‘manifest’ 文件,其中每一行指定您希望为其生成对齐方式的每个 utterance 的绝对 “audio_filepath” 和 “text”,格式如下

{"audio_filepath": "/absolute/path/to/audio.wav", "text": "the transcription of the utterance"}

如果您指定 align_using_pred_text=true,则可以从 manifest 中省略 "text" 字段。在这种情况下,manifest 中的任何 "text" 字段都将被忽略:pretrained_namemodel_path 处的 ASR 模型将用于转录音频并获取 "pred_text",这将用作强制对齐过程的参考文本。"pred_text" 也将保存在输出 manifest JSON 文件中,位于 <output_dir>/<original manifest file name>_with_output_file_paths.json。为了消除覆盖 "pred_text" 的可能性,如果 align_using_pred_text=true 并且原始 manifest 中存在现有的 "pred_text" 字段,NFA 将引发错误。

注意

NFA 不需要 manifest 中的 "duration" 字段,并且可以对齐长音频文件而不会耗尽内存。您可以对齐的音频文件的持续时间将取决于您机器上的内存量。参考文本 "text" 中的文本越准确,NFA 生成的对齐方式也越好。

输出 CTM 文件格式#

对于 manifest_filepath 的一行中指定的每个 utterance,将生成多个 CTM 文件

  • 一个包含 token 级对齐方式的 CTM 文件,位于 <output_dir>/ctm/tokens/<utt_id>.ctm

  • 一个包含单词级对齐方式的 CTM 文件,位于 <output_dir>/ctm/words/<utt_id>.ctm

  • 一个包含分段级对齐方式的 CTM 文件,位于 <output_dir>/ctm/segments/<utt_id>.ctm。如果指定了 additional_segment_grouping_separator,则段将是由 additonal_segment_grouping_separator 分隔的文本部分。如果未指定,则整个文本将被视为一个段。

每个 CTM 文件都将包含格式为 <utt_id> 1 <start time in seconds> <duration in seconds> <text, ie token/word/segment> 的行。请注意,行中的第二个项目(‘通道 ID’,CTM 文件格式需要)始终为 1,因为 NFA 在单通道音频上运行。

CTMFileConfig 参数#

CTMFileConfig(已传入主 NFA 配置)具有以下参数

  • remove_blank_tokens:布尔值(默认值 False),用于指定 token 级 CTM 文件是否应删除 blank token 的时间戳。

  • minimum_timestamp_duration:浮点数(默认值 0),用于指定将应用于所有时间戳的最小持续时间。如果 CTM 中的任何行的持续时间低于此值,它将从中间向外扩大,直到达到 minimum_timestamp_duration,或到达音频文件的开头或结尾。请注意,使用非零值可能会导致时间戳重叠。

输出 ASS 文件格式#

NFA 将生成以下 ASS 文件,您可以使用这些文件生成字幕视频

  • 带有 token 级突出显示的 ASS 文件将位于 <output_dir>/ass/tokens/<utt_id>.ass,

  • 带有单词级突出显示的 ASS 文件将位于 <output_dir>/ass/words/<utt_id>.ass

属于同一段 ‘segments’ 的所有单词将在使用 ASS 文件生成的字幕中同时出现。如果您发现段大小不合适,可以使用 set ass_file_config.resegment_text_to_fill_space=true 并指定一些 ass_file_config.max_lines_per_segment 的数字。

ASSFileConfig 参数#

ASSFileConfig(已传入主 NFA 配置)具有以下参数

  • fontsize:int(默认值 20),它将是文本的字体大小

  • vertical_alignment:字符串(默认值 center),用于指定文本的垂直对齐方式。可以是 centertopbottom 之一。

  • resegment_text_to_fill_space:布尔值(默认值 False)。如果为 True,则将重新分段文本,以便当 ASS 文件应用于视频时,每个段不会占用超过(大约)max_lines_per_segment 的空间。

  • max_lines_per_segment:int(默认值 2),用于指定每个段要显示的行数。仅当 resegment_text_to_fill_spaceTrue 时才使用此参数。

  • text_already_spoken_rgb:3 个整数的列表(默认值为 [49, 46, 61],使其成为深灰色)。将用于突出显示已说出的文本的颜色的 RGB 值。

  • text_being_spoken_rgb:3 个整数的列表(默认值为 [57, 171, 9],使其成为深绿色)。将用于突出显示正在说出的文本的颜色的 RGB 值。

  • text_not_yet_spoken_rgb:3 个整数的列表(默认值为 [194, 193, 199],使其成为深绿色)。将用于突出显示尚未说出的文本的颜色的 RGB 值。

输出 JSON manifest 文件格式#

新的 manifest 文件将保存在 <output_dir>/<original manifest file name>_with_output_file_paths.json。它将包含与原始 manifest 相同的字段,以及额外的

  • "token_level_ctm_filepath"(如果 save_output_file_formats 包含 ctm

  • "word_level_ctm_filepath"(如果 save_output_file_formats 包含 ctm

  • "segment_level_ctm_filepath"(如果 save_output_file_formats 包含 ctm

  • "token_level_ass_filepath"(如果 save_output_file_formats 包含 ass

  • "word_level_ass_filepath"(如果 save_output_file_formats 包含 ass

  • "pred_text"(如果 align_using_pred_text=true

如何评估对齐准确度?#

理想情况下,您应该有一些 ‘true’ CTM 文件来与您生成的 CTM 文件进行比较。使用这些文件,您可以获得指标,例如预测的开始/结束时间和段的 ‘true’ 开始/结束时间之间的平均(绝对)误差。

或者(或另外),您可以使用 Gecko 等工具可视化对齐质量,这些工具可以播放您的音频文件并同时显示预测的对齐方式。Gecko 工具需要您上传一个音频文件和至少一个 CTM 文件。Gecko 工具可在此处访问:https://gong-io.github.io/gecko/。有关 Gecko 工具的更多信息,请访问其 Github 页面:gong-io/gecko

注意

以下内容可能有助于改善您在 Gecko 中查看 CTM 的体验

  • minimum_timestamp_duration 设置为更大的数字,因为如果时间戳太短,Gecko 可能无法正确显示某些 token/单词/段。

  • 如果您正在分析 token 级 CTM,则设置 remove_blank_tokens_from_ctm=true,因为它将使 Gecko 可视化效果不那么混乱。