speechbrain.inference.VAD 模块

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

Authors:
  • 阿库·罗赫 2021

  • 彼得·普兰廷加 2021

  • 洛伦·卢戈斯奇 2020

  • Mirco Ravanelli 2020

  • Titouan Parcollet 2021

  • 阿卜杜勒·赫巴 2021

  • 安德烈亚斯·诺茨 2022, 2023

  • Pooneh Mousavi 2023

  • Sylvain de Langen 2023

  • 阿德尔·穆门 2023

  • 普拉迪亚·坎达尔卡 2023

摘要

类:

VAD

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

参考

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

基础类:Pretrained

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

Parameters:
  • *args (元组)

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

Example

>>> 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文件中指定的神经模型。为了使此代码既可并行化又可扩展到长序列,它采用了双窗口方法。首先,我们顺序读取输入信号的非重叠大块。然后,我们将大块分割成较小的块,并并行处理它们。

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

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

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

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

Returns:

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

Return type:

torch.Tensor

get_speech_prob_chunk(wavs, wav_lens=None)[source]

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

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

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

Returns:

编码的批次

Return type:

torch.Tensor

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

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

Parameters:
  • vad_prob (torch.Tensor) – 帧级别的语音概率。

  • activation_th (float) – 用于启动语音段的阈值。

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

Returns:

vad_th – torch.Tensor 包含1表示语音区域,0表示非语音区域。

Return type:

torch.BoolTensor

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

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

Parameters:
  • prob_th (torch.Tensor) – 帧级别的二元决策(1表示语音帧,0表示非语音帧)。该张量可以从apply_threshold获得。

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

Returns:

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

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

Return type:

torch.Tensor

merge_close_segments(boundaries, close_th=0.25)[source]

合并长度小于给定阈值的段。

Parameters:
  • boundaries (str) – 包含语音边界的torch.Tensor。可以使用get_boundaries方法获得。

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

Returns:

合并段后的新边界。

Return type:

新边界

remove_short_segments(boundaries, len_th=0.25)[source]

移除过短的片段。

Parameters:
  • boundaries (torch.Tensor) – 包含语音边界的torch.Tensor。可以使用get_boundaries方法获得。

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

Returns:

没有短片段的新边界。

Return type:

新边界

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

以可读格式保存边界到文件(和/或打印它们)。

Parameters:
  • 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。这有助于设置能量阈值。

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

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

  • activation_th (float) – 当能量超过activation_th时,新的语音段开始。

  • deactivation_th (float) – 当能量小于等于 deactivation_th 时,该段被视为结束。

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

Returns:

由能量VAD后处理的新边界。

Return type:

新边界

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

将输入分割成大小为 chunk_size 的较小块,并具有重叠的 chunk_stride。这些块在批次轴上连接。

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

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

  • chunk_stride (int) – 每个块的步幅(跳跃)。

Returns:

x – 从输入信号中派生的新张量。

Return type:

torch.Tensor

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

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

Parameters:
  • vad_out (torch.Tensor) – 包含每个语音帧为1和非语音帧为0的torch.Tensor。

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

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

Returns:

vad_out 张量的上采样版本。

Return type:

vad_signal

upsample_boundaries(boundaries, audio_file)[source]

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

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

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

Returns:

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

Return type:

vad_signal

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

接收检测到的语音片段的边界作为输入,并使用神经VAD进行双重检查,以确保它们确实包含语音。

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

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

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

Returns:

确认语音活动的段落的边界。

Return type:

新边界

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

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

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

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

  • before_margin (float) – 用于在检测到的边缘之前稍微切割段样本。

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

Returns:

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

Return type:

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- 双重检查语音段(可选)。

Parameters:
  • audio_file (str) – 音频文件的路径。

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

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

  • overlap_small_chunk (bool) – 如果为True,它会创建重叠的小块(重叠50%)。 重叠块的概率使用汉明窗进行组合。

  • 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 时生效。

Returns:

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

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

Return type:

torch.Tensor

forward(wavs, wav_lens=None)[source]

获取帧级别的语音活动预测