speechbrain.inference.VAD 模块

指定语音活动检测 (VAD) 模块的推理接口。

作者
  • Aku Rouhe 2021

  • Peter Plantinga 2021

  • Loren Lugosch 2020

  • Mirco Ravanelli 2020

  • Titouan Parcollet 2021

  • Abdel Heba 2021

  • Andreas Nautsch 2022, 2023

  • Pooneh Mousavi 2023

  • Sylvain de Langen 2023

  • Adel Moumen 2023

  • Pradnya Kandarkar 2023

摘要

VAD

一个使用预训练模型的现成语音活动检测 (VAD) 类。

参考

class speechbrain.inference.VAD.VAD(*args, **kwargs)[source]

基类: Pretrained

一个使用预训练模型的现成语音活动检测 (VAD) 类。

参数:
  • *args (tuple)

  • **kwargs (dict) – 参数转发给 Pretrained 父类。

示例

>>> import torchaudio
>>> from speechbrain.inference.VAD import VAD
>>> # Model is downloaded from the speechbrain HuggingFace repo
>>> tmpdir = getfixture("tmpdir")
>>> VAD = VAD.from_hparams(
...     source="speechbrain/vad-crdnn-libriparty",
...     savedir=tmpdir,
... )
>>> # Perform VAD
>>> boundaries = VAD.get_speech_segments("tests/samples/single-mic/example1.wav")
HPARAMS_NEEDED = ['sample_rate', 'time_resolution', 'device']
MODULES_NEEDED = ['compute_features', 'mean_var_norm', 'model']
get_speech_prob_file(audio_file, large_chunk_size=30, small_chunk_size=10, overlap_small_chunk=False)[source]

使用 hparam 文件中指定的神经网络模型输出输入音频文件的帧级语音概率。为了使这段代码既可并行又可扩展到长序列,它采用了双重窗口方法。首先,我们按顺序读取输入信号的非重叠大块。然后,我们将大块分割成小块并并行处理。

参数:
  • audio_file (path) – 包含录音的音频文件路径。该文件使用 torchaudio 读取。

  • large_chunk_size (float) – 从输入音频文件中按顺序读取的大块的大小(以秒为单位)。

  • small_chunk_size (float) – 从大块中提取的小块的大小(以秒为单位)。音频信号在小块内并行处理。注意 large_chunk_size/small_chunk_size 必须是整数。

  • overlap_small_chunk (bool) – True,创建重叠的小块。重叠块的概率使用 hamming 窗口组合。

返回:

prob_vad – 包含输入音频文件帧级语音概率的 torch.Tensor。

返回类型:

torch.Tensor

get_speech_prob_chunk(wavs, wav_lens=None)[source]

输出输入音频块的帧级后验概率。接近零的输出表示语音活动概率低的时间步,而接近一的输出可能包含语音。

参数:
  • wavs (torch.Tensor) – 波形批次 [batch, time, channels] 或 [batch, time],取决于模型。请确保采样率 fs=16000 Hz。

  • wav_lens (torch.Tensor) – 相对于批次中最长波形的波形长度,张量形状为 [batch]。最长的相对长度应为 1.0,其他为 len(waveform) / max_length。用于忽略填充。

返回:

编码后的批次

返回类型:

torch.Tensor

apply_threshold(vad_prob, activation_th=0.5, deactivation_th=0.25)[source]

扫描帧级语音概率并对其应用阈值。当检测到大于 activation_th 的值时开始语音,当观察到小于 deactivation_th 的值时结束语音。

参数:
  • vad_prob (torch.Tensor) – 帧级语音概率。

  • activation_th (float) – 开始语音片段的阈值。

  • deactivation_th (float) – 结束语音片段的阈值。

返回:

vad_th – 包含语音区域为 1、非语音区域为 0 的 torch.Tensor。

返回类型:

torch.BoolTensor

get_boundaries(prob_th, output_value='seconds')[source]

计算检测到语音活动的时间边界。它输入帧级二值决策(语音为 1,非语音为 0),并输出每个检测到的语音区域的开始/结束秒数(或样本数)。

参数:
  • prob_th (torch.Tensor) – 帧级二值决策(语音帧为 1,非语音帧为 0)。该张量可以通过 apply_threshold 获取。

  • output_value ('seconds' or 'samples') – 当设置为 'seconds' 选项时,返回的边界以秒为单位,否则以样本为单位。

返回:

boundaries – torch.Tensor,其中偶数位置包含语音片段的开始秒(或样本),奇数位置包含对应的结束秒(例如,[1.0, 1.5, 5.0, 6.0] 表示我们有两个语音片段;

一个从 1.0 到 1.5 秒,另一个从 5.0 到 6.0 秒)。

返回类型:

torch.Tensor

merge_close_segments(boundaries, close_th=0.25)[source]

合并短于给定阈值的片段。

参数:
  • boundaries (str) – 包含语音边界的 torch.Tensor。可以使用 get_boundaries 方法派生。

  • close_th (float) – 如果边界之间的距离小于 close_th,则片段将被合并。

返回:

合并片段后的新边界。

返回类型:

new_boundaries

remove_short_segments(boundaries, len_th=0.25)[source]

移除过短的片段。

参数:
  • boundaries (torch.Tensor) – 包含语音边界的 torch.Tensor。可以使用 get_boundaries 方法派生。

  • len_th (float) – 如果片段的长度小于 close_th,则片段将被合并。

返回:

移除了短片段的新边界。

返回类型:

new_boundaries

save_boundaries(boundaries, save_path=None, print_boundaries=True, audio_file=None)[source]

将边界保存到文件(和/或打印)为可读格式。

参数:
  • boundaries (torch.Tensor) – 包含语音边界的 torch.Tensor。可以使用 get_boundaries 方法派生。

  • save_path (path) – 存储包含语音/非语音区间的文本文件的位置。

  • print_boundaries (Bool) – 在标准输出中打印语音/非语音区间。

  • audio_file (path) – 包含录音的音频文件路径。该文件使用 torchaudio 读取。此处用于检测信号长度。

energy_VAD(audio_file, boundaries, activation_th=0.5, deactivation_th=0.0, eps=1e-06)[source]

在检测到的语音片段内应用基于能量的 VAD。神经网络 VAD 通常会创建更长的片段,并倾向于合并彼此靠近的片段。

能量 VAD 后处理对于进行细粒度的语音活动检测非常有用。

能量 VAD 计算小块内的能量。能量在片段内归一化,使其均值为 0.5,标准差为 +-0.5。这有助于设置能量阈值。

参数:
  • audio_file (path) – 包含录音的音频文件路径。该文件使用 torchaudio 读取。

  • boundaries (torch.Tensor) – 包含语音边界的 torch.Tensor。可以使用 get_boundaries 方法派生。

  • activation_th (float) – 如果能量高于 activation_th,则开始一个新的语音片段。

  • deactivation_th (float) – 当能量 <= deactivation_th 时,认为片段结束。

  • eps (float) – 用于数值稳定的小常数。

返回:

经过能量 VAD 后处理的新边界。

返回类型:

new_boundaries

create_chunks(x, chunk_size=16384, chunk_stride=16384)[source]

将输入分割成大小为 chunk_size,步长为 chunk_stride 的小块。这些块在批次轴上连接起来。

参数:
  • x (torch.Tensor) – 要分割成块的信号。

  • chunk_size (int) – 每个块的大小。

  • chunk_stride (int) – 每个块的步长(跳数)。

返回:

x – 从输入信号派生出的包含块的新张量。

返回类型:

torch.Tensor

upsample_VAD(vad_out, audio_file, time_resolution=0.01)[source]

对 vad 的输出进行上采样以帮助可视化。它创建一个信号,语音时为 1,非语音时为 0。vad 信号与输入信号具有相同的分辨率,并且可以与输入信号一起打开(例如,使用 audacity)以直观地确定 VAD 区域。

参数:
  • vad_out (torch.Tensor) – torch.Tensor,其中每个语音帧为 1,每个非语音帧为 0。

  • audio_file (path) – 用于计算 vad_out 的原始音频文件

  • time_resolution (float) – vad_out 信号的时间分辨率。

返回:

vad_out 张量的上采样版本。

返回类型:

vad_signal

upsample_boundaries(boundaries, audio_file)[source]

基于输入边界,此方法创建一个信号,语音时为 1,非语音时为 0。vad 信号与输入信号具有相同的分辨率,并且可以与输入信号一起打开(例如,使用 audacity)以直观地确定 VAD 区域。

参数:
  • boundaries (torch.Tensor) – 包含语音片段边界的 torch.Tensor。

  • audio_file (path) – 用于计算 vad_out 的原始音频文件

返回:

与输入信号分辨率相同的输出 vad 信号。

返回类型:

vad_signal

double_check_speech_segments(boundaries, audio_file, speech_th=0.5)[source]

输入检测到的语音片段的边界,并(使用神经网络 VAD)复核它们是否确实包含语音。

参数:
  • boundaries (torch.Tensor) – 包含语音片段边界的 torch.Tensor。

  • audio_file (path) – 用于计算 vad_out 的原始音频文件。

  • speech_th (float) – 用于确认语音的平均后验概率阈值。低于该阈值,片段将被重新分配到非语音区域。

返回:

确认存在语音活动的片段边界。

返回类型:

new_boundaries

get_segments(boundaries, audio_file, before_margin=0.1, after_margin=0.1)[source]

返回一个包含所有检测到的语音片段的列表。

参数:
  • boundaries (torch.Tensor) – 包含语音片段边界的 torch.Tensor。

  • audio_file (path) – 用于计算 vad_out 的原始音频文件。

  • before_margin (float) – 用于在检测到的边界之前稍微剪裁片段的样本。

  • after_margin (float) – 用于在检测到的边界之后稍微剪裁片段的样本。

返回:

segments – 包含检测到的语音片段的列表

返回类型:

list

get_speech_segments(audio_file, large_chunk_size=30, small_chunk_size=10, overlap_small_chunk=False, apply_energy_VAD=False, double_check=True, close_th=0.25, len_th=0.25, activation_th=0.5, deactivation_th=0.25, en_activation_th=0.5, en_deactivation_th=0.0, speech_th=0.5)[source]

在输入文件中检测语音片段。输入信号可以是短录音,也可以是长录音。该函数计算大块(例如 30 秒)上的后验概率,这些大块按顺序读取(以避免在内存中存储大信号)。每个大块又被分割成更小的块(例如 10 秒),这些块并行处理。检测语音片段的流程如下:

1- 计算帧级的后验概率。2- 对后验概率应用阈值。3- 在此基础上推导候选语音片段。4- 在每个候选片段内应用基于能量的 VAD(可选)。5- 合并过近的片段。6- 移除过短的片段。7- 复核语音片段(可选)。

参数:
  • audio_file (str) – 音频文件路径。

  • large_chunk_size (float) – 从输入音频文件中按顺序读取的大块的大小(以秒为单位)。

  • small_chunk_size (float) – 从大块中提取的小块的大小(以秒为单位)。音频信号在小块内并行处理。注意 large_chunk_size/small_chunk_size 必须是整数。

  • overlap_small_chunk (bool) – 如果为 True,则创建重叠的小块(50% 重叠)。重叠块的概率使用 hamming 窗口组合。

  • apply_energy_VAD (bool) – 如果为 True,则对检测到的语音片段使用基于能量的 VAD。神经网络 VAD 通常会创建更长的片段,并倾向于将相邻片段合并。能量 VAD 后处理对于进行细粒度的语音活动检测非常有用。能量阈值由 activation_th 和 deactivation_th 管理(见下文)。

  • double_check (bool) – 如果为 True,则(使用神经网络 VAD)复核候选语音片段是否确实包含语音。基于 speech_th 参数(见下文),对神经网络提供的平均后验概率应用阈值。

  • close_th (float) – 如果边界之间的距离小于 close_th,则片段将被合并。

  • len_th (float) – 如果片段的长度小于 close_th,则片段将被合并。

  • activation_th (float) – 神经网络后验概率的阈值,高于此值开始语音片段。

  • deactivation_th (float) – 神经网络后验概率的阈值,低于此值结束语音片段。

  • en_activation_th (float) – 如果能量高于 activation_th,则开始一个新的语音片段。仅在 apply_energy_VAD 为 True 时激活。

  • en_deactivation_th (float) – 当能量 <= deactivation_th 时,认为片段结束。仅在 apply_energy_VAD 为 True 时激活。

  • speech_th (float) – 候选语音片段内平均后验概率的阈值。低于该阈值,片段将被重新分配到非语音区域。仅在 double_check 为 True 时激活。

返回:

boundaries – torch.Tensor,其中偶数位置包含语音片段的开始秒,奇数位置包含对应的结束秒(例如,[1.0, 1.5, 5.0, 6.0] 表示我们有两个语音片段;

一个从 1.0 到 1.5 秒,另一个从 5.0 到 6.0 秒)。

返回类型:

torch.Tensor

forward(wavs, wav_lens=None)[source]

获取帧级语音活动预测