Алгоритмы обнаружения голосовой активности можно условно разделить на три категории.Первая категория представляет собой простейший метод распознавания на основе порога.Об этом упоминалось ранее.Для справкиОбнаружение голосовой активности; Вторая категория — это метод обнаружения на основе GMM, используемый WebRTC; третья категория — это метод обнаружения, основанный на глубоком обучении, о котором также упоминалось, см.Обнаружение конечной точки с помощью LSTM. Без лишних слов, давайте к делу.
1. Introduction
WebRTC VAD поддерживает частоту дискретизации 8/16/24/32/48 кГц, но для расчета она будет передискретизирована до 8 кГц, а длина каждого кадра может составлять 80/10 мс, 160/20 мс и 240/30 мс. VAD имеет следующие четыре режима, которые представляют собой общий режим, режим с низкой скоростью передачи данных, агрессивный режим и очень агрессивный режим.Параметры смешанной модели Гаусса и пороговое значение решения различны в разных режимах.
enum Aggressiveness {
kVadNormal = 0,
kVadLowBitrate = 1,
kVadAggressive = 2,
kVadVeryAggressive = 3
};
WebRTC использует статистическую модель GMM для оценки VAD голоса и 04 кГц делится на шесть частотных диапазонов следующим образом: 80250 Гц, 250500 Гц, 5001кГц, 1к2кГц, 2к3kHz, 3k~4kHz, и использовать энергии поддиапазонов этих частотных диапазонов в качестве характеристик, связанных с GMM.
II. Initialization
Говорить дешево, смотреть код напрямую, функция WebRtcVad_InitCore инициализирует следующий контент.
-
Начальное состояние VAD, здесь начальное состояние VAD устанавливается как наличие речи, что приводит к результату обнаружения VAD, равному 1, для сегмента речи в начале некоторых выборок.
-
Параметры, связанные с зависанием.
-
Коэффициенты фильтра понижения частоты дискретизации, как упоминалось ранее, будут понижены до 8 кГц для обработки независимо от входной частоты дискретизации.
-
Среднее значение и дисперсия речевого шума GMM, где kTableSize=12 представляет 6 поддиапазонов для каждой из двух моделей, а калибровка Q=7.
-
Вектор минимумов, используемый для отслеживания шума.
-
Коэффициент сплит-фильтра, разделение речи на поддиапазоны WebRTC обрабатывается сплит-фильтром вместо БПФ.
-
Режим обнаружения по умолчанию настроен на агрессивность, которую можно изменить позже с помощью функции WebRtcVad_set_mode.
int WebRtcVad_InitCore(VadInstT *self) { int i;
if (self == NULL) { return -1; } // Initialization of general struct variables. self->vad = 1; // Speech active (=1). self->frame_counter = 0; self->over_hang = 0; self->num_of_speech = 0; // Initialization of downsampling filter state. memset(self->downsampling_filter_states, 0, sizeof(self->downsampling_filter_states)); // Initialization of 48 to 8 kHz downsampling. WebRtcSpl_ResetResample48khzTo8khz(&self->state_48_to_8); // Read initial PDF parameters. for (i = 0; i < kTableSize; i++) { self->noise_means[i] = kNoiseDataMeans[i]; self->speech_means[i] = kSpeechDataMeans[i]; self->noise_stds[i] = kNoiseDataStds[i]; self->speech_stds[i] = kSpeechDataStds[i]; } // Initialize Index and Minimum value vectors. for (i = 0; i < 16 * kNumChannels; i++) { self->low_value_vector[i] = 10000; self->index_vector[i] = 0; } // Initialize splitting filter states. memset(self->upper_state, 0, sizeof(self->upper_state)); memset(self->lower_state, 0, sizeof(self->lower_state)); // Initialize high pass filter states. memset(self->hp_filter_state, 0, sizeof(self->hp_filter_state)); // Initialize mean value memory, for WebRtcVad_FindMinimum(). for (i = 0; i < kNumChannels; i++) { self->mean_value[i] = 1600; } // Set aggressiveness mode to default (=|kDefaultMode|). if (WebRtcVad_set_mode_core(self, kDefaultMode) != 0) { return -1; } self->init_flag = kInitCheck; return 0;
}
III. VAD Decision
Давайте начнем знакомить вас с процессом обработки VAD (WebRtcVad_Process) WebRTC. Конкретные шаги заключаются в следующем:
-
Выполните несколько основных проверок (WebRtcVad_ValidRateAndFrameLength), чтобы проверить, инициализирована ли структура VAD и соответствует ли длина голосового кадра условиям.
-
Понижение частоты речи до 8 кГц, понижение частоты дискретизации WebRTC — это не одношаговый процесс. В качестве примера возьмем понижение частоты дискретизации 48 кГц до 8 кГц (WebRtcSpl_Resample48khzTo8khz): сначала понизьте частоту дискретизации 48 кГц до 24 кГц, затем фильтр нижних частот голосовых данных 24 кГц (этот шаг не меняет частоту дискретизации), а затем продолжайте понижать частоту дискретизации 24 кГц -> 16 кГц, 16 кГц - >8 кГц, наконец, получите голосовые данные 8 кГц.
-
После получения речевых данных 8 кГц мы вычисляем энергию каждого поддиапазона речи как функции, связанные с GMM (WebRtcVad_CalculateFeatures). Сначала разделите данные 4 кГц на 0
2кГц и 2к4кГц, затем 2кЧасть 4kHz делится на 2k3кГц и 3к4 кГц в двух частях. 02кГц сначала делится на 01кГц и 1к2 кГц две части, где 01 кГц делится на 0250 Гц и 250500 Гц, последний до 0Часть 250 Гц подвергается фильтрации верхних частот 80 Гц, чтобы получить 80Часть 250 Гц, пока получается шесть поддиапазонов: 80250 Гц, 250500 Гц, 5001кГц, 1к2кГц, 2к3kHz, 3k~4kHz шесть поддиапазонов, соответственно вычисляют логарифмическую энергию этих шести поддиапазонов как характеристики, связанные с GMM. Кроме того, также рассчитывается общая_энергия, которая будет использоваться позже при расчете GMM (WebRtcVad_GmmProbability). -
Следующим шагом является расчет части GMM, Принцип GMM см.Внедрение алгоритмов машинного обучения с нуля (19) Модель гауссовой смеси. Различные пороги принятия решения будут выбраны в соответствии с длиной речевого кадра перед вычислением.
-
Во-первых, определите, больше ли значение total_energy, вычисленное на предыдущем шаге, порогового значения энергии kMinEnergy, и если оно больше, обработайте текущий кадр, в противном случае сразу установите vad_flag в 0.
-
Рассчитайте гауссову вероятность (WebRtcVad_GaussianProbability), соответствующую каждому поддиапазону, и умножьте ее на вес поддиапазона как окончательную вероятность речи/шума.Здесь, чтобы упростить расчет, WebRTC предполагает, что гауссовские модели речи и шума неактуальны .
-
Рассчитывается логарифмическое отношение правдоподобия (LLR) каждого поддиапазона, и отношение правдоподобия каждого поддиапазона сравнивается с порогом в качестве локального решения VAD. Сумма логарифмически взвешенных отношений правдоподобия всех поддиапазонов и порога сравниваются для принятия глобального решения по VAD. Когда локальное решение или глобальное решение приводит к решению о наличии речи, текущий кадр считается речевым кадром.
-
Используйте похмелье, чтобы сгладить результат
IV. Updation
VAD WebRTC может адаптироваться, поскольку он будет обновлять параметры GMM после принятия решения VAD.
-
Вероятности локальной (на поддиапазон) речи и шума рассчитываются для обновления параметров GMM.
-
Отслеживая минимальное значение каждого признака поддиапазона (WebRtcVad_FindMinimum), функция находит 16 минимальных значений в 100 кадрах для каждого признака. Все эти минимумы имеют возраст, а максимум не превышает 100. Если текущий объект является одним из 16 минимумов в 100 кадрах, тогда вычисляется и возвращается медиана пяти минимумов. Полученное здесь минимальное значение будет использоваться позже для обновления шума.
-
Параметры GMM обновляются, а именно среднее значение и дисперсия речи/шума, при этом среднее значение шума обновляется только тогда, когда текущий речевой кадр является неречевым кадром.
-
Если модель Гаусса для речи и модель Гаусса для шума очень похожи, разделите их.
V. Conclusion
VAD WebRTC может давать лучшие результаты при высоком отношении сигнал/шум, а по мере уменьшения отношения сигнал/шум результаты его обнаружения также ухудшаются. Кроме того, инженерная реализация WebRTC VAD использует арифметику с фиксированной точкой и некоторые приближенные операции, что делает его ресурсоемкость не очень высокой, но затрудняет чтение кода. В этой статье анализируется только общий процесс VAD в WebRTC, а некоторые конкретные детали еще предстоит изучить самим читателям. В WebRTC VAD еще много контента, прошу меня простить, если есть какие-то упущения.
Чтобы получить код, соответствующий этой статье, обратите внимание на группу голосовых алгоритмов официальной учетной записи и нажмите «Код» в строке меню, чтобы получить его.
использованная литература:
[1] Практическое руководство по обработке речи в реальном времени.
[2]. A Statistical Model-Based Voice Activity Detection