speechbrain.utils.streaming 模块

用于辅助设计和训练流式模型的实用工具。

作者 * Sylvain de Langen 2023

摘要

函数:

infer_dependency_matrix

随机化输入序列的部分内容多次,以检测输入帧和输出帧之间的依赖关系,即某个输出帧是否依赖于某个输入帧。

plot_dependency_matrix

返回由infer_dependency_matrix生成的依赖矩阵的matplotlib图形。

split_fixed_chunks

将输入张量 x 沿着维度 dim 分割成大小为 chunk_size 的块张量列表。

split_wav_lens

将单个wav_lens张量转换为chunk_count个张量的列表,通常在用split_fixed_chunks分块信号时非常有用。

参考

speechbrain.utils.streaming.split_fixed_chunks(x, chunk_size, dim=-1)[source]

将输入张量 x 分割成大小为 chunk_size 的块张量列表,沿着维度 dim 进行分割。适用于将序列分割成固定大小的块。

如果维度 dim 不能被 chunk_size 均匀分割,那么最后一个块将小于 chunk_size

Parameters:
  • x (torch.Tensor) – 要分割成块的张量,通常是一个序列或音频信号。

  • chunk_size (int) – 每个块的大小,即在维度dim上每个块的最大大小。

  • dim (int) – 要沿其拆分的维度,通常是时间维度。

Returns:

张量的块列表,请参阅描述和示例。 保证 .size(dim) <= chunk_size

Return type:

列表[张量]

Example

>>> import torch
>>> from speechbrain.utils.streaming import split_fixed_chunks
>>> x = torch.zeros((16, 10000, 80))
>>> chunks = split_fixed_chunks(x, 128, dim=1)
>>> len(chunks)
79
>>> chunks[0].shape
torch.Size([16, 128, 80])
>>> chunks[-1].shape
torch.Size([16, 16, 80])
speechbrain.utils.streaming.split_wav_lens(chunk_lens, wav_lens)[source]

将单个wav_lens张量转换为chunk_count张量的列表, 通常在用split_fixed_chunks分块信号时非常有用。

wav_lens 表示批次中每个音频的相对长度,通常用于掩码。此函数在块级别计算相对长度。

Parameters:
  • chunk_lens (列表[int]) – 每个块的序列长度。例如,如果 chunks 是从 split_fixed_chunks(x, chunk_size, dim=1) 返回的,那么这应该是 [chk.size(1) for chk in chunks]

  • wav_lens (torch.Tensor) – 批次中音频的相对长度。例如,对于一个100帧的输入信号和一个包含3个元素的批次,(1.0, 0.5, 0.25) 意味着该批次分别包含100帧、50帧和25帧的音频。

Returns:

一组分块的wav_lens列表,请参阅描述和示例。

Return type:

列表[张量]

Example

>>> import torch
>>> from speechbrain.utils.streaming import split_wav_lens, split_fixed_chunks
>>> x = torch.zeros((3, 20, 80))
>>> chunks = split_fixed_chunks(x, 8, dim=1)
>>> len(chunks)
3
>>> # 20 frames, 13 frames, 17 frames
>>> wav_lens = torch.tensor([1.0, 0.65, 0.85])
>>> chunked_wav_lens = split_wav_lens([c.size(1) for c in chunks], wav_lens)
>>> chunked_wav_lens
[tensor([1., 1., 1.]), tensor([1.0000, 0.6250, 1.0000]), tensor([1.0000, 0.0000, 0.2500])]
>>> # wav 1 covers 62.5% (5/8) of the second chunk's frames
speechbrain.utils.streaming.infer_dependency_matrix(model: Callable, seq_shape: tuple, in_stride: int = 1)[source]

随机化输入序列的部分内容多次,以检测输入帧和输出帧之间的依赖关系,即给定的输出帧是否依赖于给定的输入帧。

这对于检查模型在流式上下文中是否表现正确以及是否不包含对流式场景中无法预知的未来帧的意外依赖非常有用。

请注意,对于非常长的序列,这可能会变得非常计算昂贵。

此外,这期望推理是完全确定性的,否则可能会发现错误的依赖关系。这也意味着模型必须处于评估模式,以抑制诸如dropout层之类的东西。

Parameters:
  • model (Callable) – 可以是一个模型或一个函数(可能模拟流式功能)。不需要是训练好的模型,随机权重通常就足够了。

  • seq_shape (元组) – 该函数通过随机化输入序列的部分内容来推断,以检测不需要的依赖关系。 期望的形状看起来像 [batch_size, seq_len, num_feats], 其中 batch_size 可能是 1

  • in_stride (int) – 仅考虑第N个输入,适用于输入序列非常长(例如原始音频)且输出较短(子采样、滤波器等)的情况。

Returns:

dependencies – 表示输出是否依赖于输入的矩阵;使用[in_frame_idx, out_frame_idx]进行索引。True表示检测到的依赖关系。

Return type:

布尔张量

speechbrain.utils.streaming.plot_dependency_matrix(deps)[source]

返回由infer_dependency_matrix生成的依赖矩阵的matplotlib图形。

在给定点,红色方块表示给定的输出帧(y轴)依赖于给定的输入帧(x轴)。

例如,一个完全红色的图像意味着所有输出帧都依赖于所有的历史。这可能是双向RNN或transformer模型的情况。

Parameters:

deps (BoolTensor) – 由 infer_dependency_matrix 返回的矩阵或兼容格式的矩阵。

Return type:

matplotlib 依赖矩阵的图形。