Алгоритм Google WebRTC VAD (особенно «агрессивность») - PullRequest
2 голосов
/ 12 апреля 2019

Я знаю, что в алгоритме 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 };

Я не совсем понимаю, как вступают в игру свес и локальный / глобальный порог. Это строго статистические параметры?

...