重要提示
您正在查看 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 模型)。
演示和教程#
快速入门#
安装 NeMo。
准备一个 NeMo 风格的 manifest,其中包含您要处理的音频文件的路径以及(可选)它们的文本。
使用所需的配置运行 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>

如何使用 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_name
或model_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_config
:CTMFileConfig
,用于指定输出 CTM 文件的配置。ass_file_config
:ASSFileConfig
,用于指定输出 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_name
或 model_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
),用于指定文本的垂直对齐方式。可以是center
、top
、bottom
之一。resegment_text_to_fill_space
:布尔值(默认值False
)。如果为True
,则将重新分段文本,以便当 ASS 文件应用于视频时,每个段不会占用超过(大约)max_lines_per_segment
的空间。max_lines_per_segment
:int(默认值2
),用于指定每个段要显示的行数。仅当resegment_text_to_fill_space
为True
时才使用此参数。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 可视化效果不那么混乱。