speechbrain.alignment.ctc_segmentation 模块
执行CTC分割以对齐音频文件中的话语。
这使用了ctc-segmentation Python包。 使用pip安装它或查看安装说明在 https://github.com/lumaku/ctc-segmentation
- Authors
路德维希·库尔辛格 2021
摘要
类:
使用CTC分割将文本与音频对齐。 |
|
用于CTC分割的任务对象。 |
参考
- class speechbrain.alignment.ctc_segmentation.CTCSegmentationTask[source]
基础类:
SimpleNamespaceCTC 分割的任务对象。
此对象是自动生成的,并作为CTCSegmentation对象结果的容器。
当使用str(·)格式化时,此对象返回的结果以kaldi风格的段文件格式显示。 可读性输出可以通过打印选项进行配置。
- ground_truth_mat
真实矩阵(CTC分割)。
- Type:
数组
- utt_begin_indices
用于真实值矩阵的话语分隔符。
- Type:
np.ndarray
- timings
对应字符的时间标记。
- Type:
np.ndarray
- config
CTC 分割配置对象。
- Type:
CtcSegmentation参数
- lpz
CTC后验对数概率(可选)。
- Type:
np.ndarray
- 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
- 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秒的音频。
- estimate_samples_to_frames_ratio(speech_len=215040)[source]
确定编码帧与采样点的比率。
此方法有助于确定单个编码帧所占用的时间。 由于采样率已经给出了样本数量,因此只需要每个编码CTC帧的样本比例。 此函数通过进行一次推断来估计它们,这只需要进行一次。
- 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:
- Returns:
可以传递给
CTCSegmentation.get_segments()的任务对象,以获取对齐结果。- Return type:
- static get_segments(task: CTCSegmentationTask)[source]
获取给定话语文本和CTC对数后验的分段。
- Parameters:
任务 (CTCSegmentationTask) – 包含真实值和CTC后验概率的任务对象。
- Returns:
带有对齐的字典。将此与任务对象结合以获得人类可读的片段表示。
- Return type: