首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌的WebRTC VAD算法(尤指。“侵略性”)

谷歌的WebRTC VAD算法(尤指。“侵略性”)
EN

Stack Overflow用户
提问于 2019-04-12 17:10:59
回答 1查看 5.1K关注 0票数 5

我知道谷歌的WebRTC VAD算法使用高斯混合模型(GMM),但我的数学知识很薄弱,所以我不太明白这意味着什么。说它是一种基于统计的机器学习模型是正确的吗?对于VAD来说,它是经过训练来识别语音和噪声的模型吗?

我正在写一篇论文,我创建了一个利用API来区分声音和噪音的脚本。这是可行的,但是我需要在我的论文中从一个非常基本的层面来解释它用来做决定的机制。

最迫切的是,我需要知道在某种程度上,“攻击性”设置对算法做了什么。这是否真的只是设定一个信心的门槛呢?有声音影响吗?

更新:

我的超基本理解是:谷歌可能会通过一系列预先标注的“噪音”和“语音”来训练他们的模型,并存储每个模型的特征;然后,它取一个未知的样本,看看它是否更像噪音或语音数据。我不知道测量的特征是什么,但我假设至少测量了音高和振幅。

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

进取心很可能设置它用来做决定的阈值,但我不知道这个部分是如何工作的。

相关代码在这里:core.c

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

代码语言:javascript
复制
// 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 };

我不太明白悬置和本地/全球门槛是如何发挥作用的。这些是严格的统计参数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-28 19:39:57

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

代码语言:javascript
复制
self->over_hang_max_1[], self->over_hang_max_2[], self->individual[], self->total[]

进一步看一看vad_core.c中的第158行,我们看到基于帧长度使用了不同的值。frame_length是正在分析的音频的“原子”或“块”:

代码语言:javascript
复制
// 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个样本帧越小,“攻击性越小”:但是为什么呢?直觉是什么?

呼叫码 (使用vad_core)为它提供了frames_length块的音频。因此,如果你的音频文件是10分钟长,那么一个滑动窗口将产生frame_length块,并将它传递给这段代码。

当音频以8000 the采样率运行时,当frame_length较小(80)时,分辨率(10 is )较细& VAD信号将非常精确。更改将被精确跟踪,VAD估计将是“合理的”.当frame_length很大(240)时,分辨率会更“粗”,并且VAD信号与信号的语音活动的微小(<30毫秒)变化不协调.因此“不那么谨慎”。

因此,我宁愿谈论“谨慎”或“果断”地跟踪它所估计的潜在的声音信号,而不是咄咄逼人。

我希望这能帮我解释一下它在做什么。至于数值本身,它们只是算法上的细节,由于不同大小的音频帧而有所不同。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55656626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档