我知道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 };
我不太了解如何突出显示和本地/全局阈值。这些是严格的统计参数吗?
答案 0 :(得分:4)
追踪代码,您将看到上面列出的预设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),则分辨率会更“粗糙”,并且VAD信号的谐调会变小(较小)(小于30毫秒)会改变信号的语音活动,因此“不太谨慎”。
因此,与其说它具有攻击性,不如说是它如何“谨慎地”或“断言地”跟踪其所估计的基本语音信号。
我希望这有助于推断其工作情况。至于值本身,它们只是算法细节,由于音频帧的大小不同而有所不同。