我知道Google的WebRTC VAD算法使用的是高斯混合模型(GMM),但是我的数学知识很薄弱,所以我并不真正理解这是什么意思。说这是一种基于统计的机器学习模型是正确的吗?对于VAD而言,这是经过训练可以识别语音与噪声的模型?

我正在写论文,并且创建了一个脚本,该脚本利用API来区分声音和噪音。它有效,但是我需要在我的论文中从一个非常基本的角度来解释它用来做出决定的机制。

最紧迫的是,我需要某种程度地了解“攻击性”设置对算法的作用。从字面上看,这只是规定一个置信度阈值吗?它有声音影响吗?

更新:

我的基本知识是:Google可能会在一堆预先标记的“噪声”和“语音”上训练他们的模型,并存储它们的特征;然后,它获取一个未知的样本,并查看它是否更像是噪声数据或语音数据。我不知道要测量的功能是什么,但是我假设至少要测量音高和振幅。

它使用GMM来计算它属于一个人口或另一个人口的概率。

侵略性可能会设定用于确定的阈值,但我不完全知道该部分的工作原理。

相关代码在这里:https://chromium.googlesource.com/external/webrtc/+/refs/heads/master/common_audio/vad/vad_core.c

“攻击性”设置确定以下常量(我显示模式0和3作为比较):

// Constants used in WebRtcVad_set_mode_core().
//
// Thresholds for different frame lengths (10 ms, 20 ms and 30 ms).
//
// Mode 0, Quality.
static const int16_t kOverHangMax1Q[3] = { 8, 4, 3 };
static const int16_t kOverHangMax2Q[3] = { 14, 7, 5 };
static const int16_t kLocalThresholdQ[3] = { 24, 21, 24 };
static const int16_t kGlobalThresholdQ[3] = { 57, 48, 57 };

// Mode 3, Very aggressive.
static const int16_t kOverHangMax1VAG[3] = { 6, 3, 2 };
static const int16_t kOverHangMax2VAG[3] = { 9, 5, 3 };
static const int16_t kLocalThresholdVAG[3] = { 94, 94, 94 };
static const int16_t kGlobalThresholdVAG[3] = { 1100, 1050, 1100 };

我不太了解如何突出显示和本地/全局阈值。这些是严格的统计参数吗?

最佳答案

跟踪代码,您将看到上面列出的预设4个值,这些值根据“攻击性”而变化:kOverHangMax{1,2}*, kLocalThreshold*, kGlobalThreshold*,它们映射到这4个内部数组(以攻击性为索引):

self->over_hang_max_1[], self->over_hang_max_2[], self->individual[], self->total[]

再看vad_core.c中的158行,我们看到基于帧长度使用了不同的值。 frame_length是所分析音频的“原子”或“块”:
// Set various thresholds based on frame lengths (80, 160 or 240 samples).
  if (frame_length == 80) {
    overhead1 = self->over_hang_max_1[0];
    overhead2 = self->over_hang_max_2[0];
    individualTest = self->individual[0];
    totalTest = self->total[0];
  } else if (frame_length == 160) {
    overhead1 = self->over_hang_max_1[1];
    overhead2 = self->over_hang_max_2[1];
    individualTest = self->individual[1];
    totalTest = self->total[1];
  } else {
    overhead1 = self->over_hang_max_1[2];
    overhead2 = self->over_hang_max_2[2];
    individualTest = self->individual[2];
    totalTest = self->total[2];
  }

直觉

因此,音频块越大(​​240个样本),算法就越“激进”,而80个样本帧越小,“侵略性”就越小:但这是为什么呢?直觉是什么?

calling-code(使用vad_core)为其提供了frames_length音频块。因此,如果您要进行VAD处理的音频文件长10分钟,则该音频上的滑动窗口将生成frame_length块并将其传递给此代码。

在音频以8000Hz采样率运行的情况下,当frame_length小(80)时,分辨率(10ms)细粒度且VAD信号将非常精确。更改将被准确跟踪,并且VAD估计将是“合理的” ...当frame_length大(240)时,分辨率会更“粗糙”,并且在较小(
因此,与其说它具有攻击性,不如说是它如何“谨慎地”或“断言地”跟踪所估计的基础语音信号。

我希望这有助于推理其工作方式。至于值本身,它们只是算法细节,由于音频帧的大小不同而有所不同。

09-19 13:12