speechbrain.alignment.ctc_segmentation 模块

执行CTC分割以对齐音频文件中的话语。

这使用了ctc-segmentation Python包。 使用pip安装它或查看安装说明在 https://github.com/lumaku/ctc-segmentation

Authors
  • 路德维希·库尔辛格 2021

摘要

类:

CTCSegmentation

使用CTC分割将文本与音频对齐。

CTCSegmentationTask

用于CTC分割的任务对象。

参考

class speechbrain.alignment.ctc_segmentation.CTCSegmentationTask[source]

基础类: SimpleNamespace

CTC 分割的任务对象。

此对象是自动生成的,并作为CTCSegmentation对象结果的容器。

当使用str(·)格式化时,此对象返回的结果以kaldi风格的段文件格式显示。 可读性输出可以通过打印选项进行配置。

text
Utterance texts, separated by line. But without the utterance

行首的名称(如kaldi风格的文本)。

Type:

list

ground_truth_mat

真实矩阵(CTC分割)。

Type:

数组

utt_begin_indices

用于真实值矩阵的话语分隔符。

Type:

np.ndarray

timings

对应字符的时间标记。

Type:

np.ndarray

state_list

估计字符/标记的对齐情况。

Type:

list

segments

计算出的分段为:(开始, 结束, 置信度分数)。

Type:

list

config

CTC 分割配置对象。

Type:

CtcSegmentation参数

name

对齐音频文件的名称(可选)。如果提供,生成文本时会考虑该名称。 默认值:“utt”。

Type:

str

utt_ids

话语名称列表(可选)。此列表应与话语数量具有相同的长度。

Type:

list

lpz

CTC后验对数概率(可选)。

Type:

np.ndarray

print_confidence_score

包含置信度分数。 默认值:True。

Type:

bool

print_utterance_text

包含话语文本。 默认值:True。

Type:

bool

text = None
ground_truth_mat = None
utt_begin_indices = None
timings = None
char_probs = None
state_list = None
segments = None
config = None
done = False
name = 'utt'
utt_ids = None
lpz = None
print_confidence_score = True
print_utterance_text = True
set(**kwargs)[source]

更新对象属性。

__str__()[source]

返回一个kaldi风格的segments文件(字符串)。

class speechbrain.alignment.ctc_segmentation.CTCSegmentation(asr_model: EncoderASR | EncoderDecoderASR, kaldi_style_text: bool = True, text_converter: str = 'tokenize', time_stamps: str = 'auto', **ctc_segmentation_args)[source]

基础类:object

使用CTC分割将文本与音频对齐。

用法

使用给定的ASR模型和参数进行初始化。 如果需要,可以使用set_config(·)设置CTC分割的参数。 然后将实例作为函数调用,以在音频文件中对齐文本。

param asr_model:

Speechbrain ASR 接口。这需要一个具有训练好的 CTC 层用于推理的模型。最好使用具有单字符标记的模型以获得更好的时间分辨率。 请注意,使用 Transformer 模型进行推理的复杂度通常随着音频长度的增加而呈二次方增长。 因此,如果有的话,建议使用基于 RNN 的模型。

type asr_model:

编码器解码器自动语音识别

param kaldi_style_text:

一个kaldi风格的文本文件在每行的开头包含话语的名称。如果为True,则每行的第一个单词应为话语名称。如果为False,则话语名称将自动生成。请根据您的输入数据设置此选项。默认值:True。

type kaldi_style_text:

布尔

param text_converter:

CTC分割如何处理文本。 “tokenize”:使用ASR模型的分词器对文本进行分词。 “classic”:文本被预处理为考虑标记长度的文本片段。如果ASR模型有较长的标记,此选项可能会产生更好的结果。默认值:“tokenize”。

type text_converter:

字符串

param time_stamps:

选择时间戳的计算方法。虽然“fixed”和“auto”都使用采样率,但样本与帧的比率要么自动确定为每个推理,要么固定在模块最初确定的某个比率,但可以通过参数samples_to_frames_ratio进行更改。推荐用于较长的音频文件:“auto”。

type time_stamps:

字符串

param **ctc_segmentation_args:

CTC分割的参数。 完整的参数列表可以在set_config中找到。

Example

>>> # using example file included in the SpeechBrain repository
>>> from speechbrain.inference.ASR import EncoderDecoderASR
>>> from speechbrain.alignment.ctc_segmentation import CTCSegmentation
>>> # load an ASR model
>>> pre_trained = "speechbrain/asr-transformer-transformerlm-librispeech"
>>> asr_model = EncoderDecoderASR.from_hparams(source=pre_trained)  
>>> aligner = CTCSegmentation(asr_model, kaldi_style_text=False)  
>>> # load data
>>> audio_path = "tests/samples/single-mic/example1.wav"
>>> text = ["THE BIRCH CANOE", "SLID ON THE", "SMOOTH PLANKS"]
>>> segments = aligner(audio_path, text, name="example1")  

关于多进程处理

为了使用多进程并行化计算,这三个步骤可以分开: (1) get_lpz: 获取lpz, (2) prepare_segmentation_task: 准备任务,以及 (3) get_segments: 执行CTC分割。 请注意,函数get_segments是一个静态方法,因此 独立于已经初始化的CTCSegmentation对象。

参考文献

德语端到端语音识别的大规模语料库CTC分割 2020年,Kürzinger, Winkelbauer, Li, Watzel, Rigoll https://arxiv.org/abs/2007.09127

更多参数描述在 https://github.com/lumaku/ctc-segmentation

fs = 16000
kaldi_style_text = True
samples_to_frames_ratio = None
time_stamps = 'auto'
choices_time_stamps = ['auto', 'fixed']
text_converter = 'tokenize'
choices_text_converter = ['tokenize', 'classic']
warned_about_misconfiguration = False
set_config(time_stamps: str | None = None, fs: int | None = None, samples_to_frames_ratio: float | None = None, set_blank: int | None = None, replace_spaces_with_blanks: bool | None = None, kaldi_style_text: bool | None = None, text_converter: str | None = None, gratis_blank: bool | None = None, min_window_size: int | None = None, max_window_size: int | None = None, scoring_length: int | None = None)[source]

设置CTC分割参数。

时间参数

time_stampsstr

选择如何估计CTC指数持续时间的方法,从而如何计算时间戳。

fsint

采样率。通常从ASR模型派生;使用此参数覆盖设置。

samples_to_frames_ratiofloat

如果你想直接确定样本与CTC帧的比例,请设置此参数,并将time_stamps设置为“fixed”。 注意:如果你想从具有固定子采样的模型中计算时间戳,请将此参数设置为: subsampling_factor * frame_duration / 1000

文本准备的参数

set_blankint

标记列表中空白的索引。默认值:0。

replace_spaces_with_blanksbool

在单词之间插入空格,这对于处理单词之间的长停顿非常有用。仅在text_converter="classic"预处理模式下使用。默认值:False。

kaldi_style_textbool

确定话语名称是否预期为话语的第一个词。在模块初始化时设置。

text_converterstr

CTC分割如何处理文本。 在模块初始化时设置。

对齐参数

min_window_sizeint

考虑用于单个话语的最小帧数。当前的默认值8000大约对应于4分钟(取决于ASR模型),在大多数情况下应该是可以的。如果你的话语间隔更远,增加这个值,或者对于较小的音频文件减少它。

max_window_sizeint

最大窗口大小。通常不需要更改此值。

gratis_blankbool

如果为True,空白的转换成本将设置为零。 对于长的前导部分或话语之间存在大量不相关段的情况非常有用。默认值:False。

计算置信度分数的参数

scoring_lengthint

用于计算置信度分数的块长度。在大多数情况下,默认值30应该是合适的。30大约对应1-2秒的音频。

get_timing_config(speech_len=None, lpz_len=None)[source]

获取参数以确定时间戳。

estimate_samples_to_frames_ratio(speech_len=215040)[source]

确定编码帧与采样点的比率。

此方法有助于确定单个编码帧所占用的时间。 由于采样率已经给出了样本数量,因此只需要每个编码CTC帧的样本比例。 此函数通过进行一次推断来估计它们,这只需要进行一次。

Parameters:

speech_len (int) – 单次推理时随机生成的语音向量的长度。默认值:215040。

Returns:

估计比例。

Return type:

int

get_lpz(speech: Tensor | ndarray)[source]

获取给定语音数据的CTC后验对数概率。

Parameters:

speech (Union[torch.Tensor, np.ndarray]) – 语音音频输入。

Returns:

带有CTC对数后验概率的Numpy向量。

Return type:

np.ndarray

prepare_segmentation_task(text, lpz, name=None, speech_len=None)[source]

预处理文本,并将文本和lpz收集到一个任务对象中。

文本根据配置进行预处理和分词。 如果提供了speech_len,则更新时间配置。 文本、lpz和配置被收集在一个CTCSegmentationTask对象中。生成的对象可以被序列化并传递到多进程计算中。

建议您事先对文本进行规范化处理,例如,将数字转换为对应的口语单词,删除特殊字符,并将UTF-8字符转换为与您的ASR模型字典相对应的字符。

文本根据text_converter设置进行分词:

“tokenize”方法更高效,对于基于拉丁或西里尔字母的模型来说是最简单的,这些模型只包含主要字符,如[“a”, “b”, …],或者对于包含约3000个短汉字/汉字的日语或中文ASR模型也是如此。

“经典”方法提高了包含较长标记的模型的对齐精度,但计算复杂度更高。该函数扫描可能提高时间分辨率的部分标记。 例如,单词“▁really”将被分解为 ['▁', '▁r', '▁re', '▁real', '▁really']。对齐将基于网络给出的最可能的激活序列。

Parameters:
  • 文本 (列表) – 包含话语真实值的列表或多行字符串。

  • lpz (np.ndarray) – 从CTC网络获得的Log CTC后验概率; numpy数组形状为( <时间步长>, <类别> )。

  • name (str) – 将包含在分段输出中的音频文件名。 选择一个唯一的名称,或原始音频文件名,以区分多个音频文件。默认值:无。

  • speech_len (int) – 样本点的数量。如果给出,时间配置将自动从fs的长度、语音的长度和lpz的长度中得出。如果未给出,请确保时间参数正确,请参考time_stamps!默认值:None。

Returns:

可以传递给CTCSegmentation.get_segments()的任务对象,以获取对齐结果。

Return type:

CTCSegmentationTask

static get_segments(task: CTCSegmentationTask)[source]

获取给定话语文本和CTC对数后验的分段。

Parameters:

任务 (CTCSegmentationTask) – 包含真实值和CTC后验概率的任务对象。

Returns:

带有对齐的字典。将此与任务对象结合以获得人类可读的片段表示。

Return type:

dict

__call__(speech: Tensor | ndarray | str | Path, text: List[str] | str, name: str | None = None) CTCSegmentationTask[source]

对齐话语。

Parameters:
  • speech (Union[torch.Tensor, np.ndarray, str, Path]) – 可以作为路径或数组提供的音频文件。

  • 文本 (联合[列表[字符串], 字符串]) – 包含话语真实值的列表或多行字符串。 所需的格式取决于设置 kaldi_style_text

  • name (str) – 文件的名称。话语名称由此派生。

Returns:

带有分段的任务对象。对其应用 str(·) 或 print(·) 以获取分段列表。

Return type:

CTCSegmentationTask