Анализ процесса WebRTC VAD

искусственный интеллект WebRTC
Анализ процесса WebRTC VAD

Алгоритмы обнаружения голосовой активности можно условно разделить на три категории.Первая категория представляет собой простейший метод распознавания на основе порога.Об этом упоминалось ранее.Для справкиОбнаружение голосовой активности; Вторая категория — это метод обнаружения на основе 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. Конкретные шаги заключаются в следующем:

  1. Выполните несколько основных проверок (WebRtcVad_ValidRateAndFrameLength), чтобы проверить, инициализирована ли структура VAD и соответствует ли длина голосового кадра условиям.

  2. Понижение частоты речи до 8 кГц, понижение частоты дискретизации WebRTC — это не одношаговый процесс. В качестве примера возьмем понижение частоты дискретизации 48 кГц до 8 кГц (WebRtcSpl_Resample48khzTo8khz): сначала понизьте частоту дискретизации 48 кГц до 24 кГц, затем фильтр нижних частот голосовых данных 24 кГц (этот шаг не меняет частоту дискретизации), а затем продолжайте понижать частоту дискретизации 24 кГц -> 16 кГц, 16 кГц - >8 кГц, наконец, получите голосовые данные 8 кГц.

  3. После получения речевых данных 8 кГц мы вычисляем энергию каждого поддиапазона речи как функции, связанные с GMM (WebRtcVad_CalculateFeatures). Сначала разделите данные 4 кГц на 02кГц и 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).

  4. Следующим шагом является расчет части GMM, Принцип GMM см.Внедрение алгоритмов машинного обучения с нуля (19) Модель гауссовой смеси. Различные пороги принятия решения будут выбраны в соответствии с длиной речевого кадра перед вычислением.

  5. Во-первых, определите, больше ли значение total_energy, вычисленное на предыдущем шаге, порогового значения энергии kMinEnergy, и если оно больше, обработайте текущий кадр, в противном случае сразу установите vad_flag в 0.

  6. Рассчитайте гауссову вероятность (WebRtcVad_GaussianProbability), соответствующую каждому поддиапазону, и умножьте ее на вес поддиапазона как окончательную вероятность речи/шума.Здесь, чтобы упростить расчет, WebRTC предполагает, что гауссовские модели речи и шума неактуальны .

  7. Рассчитывается логарифмическое отношение правдоподобия (LLR) каждого поддиапазона, и отношение правдоподобия каждого поддиапазона сравнивается с порогом в качестве локального решения VAD. Сумма логарифмически взвешенных отношений правдоподобия всех поддиапазонов и порога сравниваются для принятия глобального решения по VAD. Когда локальное решение или глобальное решение приводит к решению о наличии речи, текущий кадр считается речевым кадром.

  8. Используйте похмелье, чтобы сгладить результат

IV. Updation

VAD WebRTC может адаптироваться, поскольку он будет обновлять параметры GMM после принятия решения VAD.

  1. Вероятности локальной (на поддиапазон) речи и шума рассчитываются для обновления параметров GMM.

  2. Отслеживая минимальное значение каждого признака поддиапазона (WebRtcVad_FindMinimum), функция находит 16 минимальных значений в 100 кадрах для каждого признака. Все эти минимумы имеют возраст, а максимум не превышает 100. Если текущий объект является одним из 16 минимумов в 100 кадрах, тогда вычисляется и возвращается медиана пяти минимумов. Полученное здесь минимальное значение будет использоваться позже для обновления шума.

  3. Параметры GMM обновляются, а именно среднее значение и дисперсия речи/шума, при этом среднее значение шума обновляется только тогда, когда текущий речевой кадр является неречевым кадром.

  4. Если модель Гаусса для речи и модель Гаусса для шума очень похожи, разделите их.

V. Conclusion

VAD WebRTC может давать лучшие результаты при высоком отношении сигнал/шум, а по мере уменьшения отношения сигнал/шум результаты его обнаружения также ухудшаются. Кроме того, инженерная реализация WebRTC VAD использует арифметику с фиксированной точкой и некоторые приближенные операции, что делает его ресурсоемкость не очень высокой, но затрудняет чтение кода. В этой статье анализируется только общий процесс VAD в WebRTC, а некоторые конкретные детали еще предстоит изучить самим читателям. В WebRTC VAD еще много контента, прошу меня простить, если есть какие-то упущения.

Чтобы получить код, соответствующий этой статье, обратите внимание на группу голосовых алгоритмов официальной учетной записи и нажмите «Код» в строке меню, чтобы получить его.

использованная литература:

[1] Практическое руководство по обработке речи в реальном времени.

[2]. A Statistical Model-Based Voice Activity Detection