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 沿维度 dim 分割成大小为 chunk_size 的分块张量列表。对于将固定大小的序列分割成块很有用。

如果维度 dim 不能被 chunk_size 整除,则最后一个块将小于 chunk_size

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

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

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

返回:

一个块张量列表,参见描述和示例。保证 .size(dim) <= chunk_size

返回类型:

List[Tensor]

示例

>>> 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 表示批次中每个音频的相对长度,通常用于掩码。此函数计算块级别的相对长度。

参数:
  • chunk_lens (List[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 帧的音频。

返回:

一个分块的 wav_lens 列表,参见描述和示例。

返回类型:

List[Tensor]

示例

>>> 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]

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

这有助于检查模型在流式上下文中的行为是否正确,并且不包含对未来帧的意外依赖,因为这些依赖在流式场景中是不可知的。

请注意,对于非常长的序列,这可能会非常耗费计算资源。

此外,这要求推理是完全确定性的,否则可能会发现错误的依赖关系。这也意味着模型必须处于 eval 模式,以抑制 dropout 层等。

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

  • seq_shape (tuple) – 该函数尝试通过随机化输入序列的部分来检测不想要的依赖关系。形状应类似于 [batch_size, seq_len, num_feats],其中 batch_size 可以是 1

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

返回:

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

返回类型:

BoolTensor

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

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

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

例如,全红图像意味着所有输出帧都依赖于所有历史数据。例如,双向 RNN 或 Transformer 模型可能就是这种情况。

参数:

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

返回类型:

依赖矩阵的 matplotlib 图。