WebRtc Акустическое эхоподавление3 (AEC3), дающее плоский MicOutPut после эхоподавления - PullRequest
0 голосов
/ 16 февраля 2019

Позвольте мне начать эту тему, заявив, что я совершенно новичок в WebRtc, и если что-нибудь упомяну о чем-то полу-остроумном, пожалуйста, потерпите меня в простейшей форме.

Я пишу приложение, котороевыполняет сравнение производительности эхоподавления между Speex и Web RTC AEC3.[База кода WebRtc AEC3 (Новейшая ветвь): https://webrtc.googlesource.com/src/+/branch-heads/72]

Приложение считывает файлы WAV и передает образцы в модуль AEC, а модуль записи WAV сохраняет выходные данные подавления эха,

У меня есть 2 входа: 1) Вход динамика или визуализированный сигнал или сигнал FarEnd 2) Вход MicInput или захваченный сигнал или сигнал NearEnd

И один выход: 1) MicOutput - который является результатом подавления эха.

Теперь для модулей Speex, я вижу хорошо себя вести.Пожалуйста, посмотрите на следующий файл, он хорошо справляется с отменой обработанного сигнала из захваченного сигнала.

Speex Results

Однако, когда я передаюте же файлы с WebRtc Aec3, я получаю сигнал.Ниже приведен результат AEC3.

WebRtc AEC3 Results

Кажется, что он также подавляет исходный микрофонный сигнал.

Яиспользуя следующие параметры (извлеченные из программы чтения файлов Wav): Частота дискретизации: 8000 Канал: 1 бит / Образец: 16 Число образцов: 270399 Образцы, поданные в AEC за раз: (10 * SampleRate) / 1000 = 80

Это инициализация:

m_streamConfig.set_sample_rate_hz(sampleRate);
m_streamConfig.set_num_channels(CHANNEL_COUNT);

// Create a temporary buffer to convert our RTOP input audio data into the webRTC required AudioBuffer. 
m_tempBuffer[0] = static_cast<float*> (malloc(sizeof(float) * m_samplesPerBlock));

// Create AEC3. 
m_echoCanceller3.reset(new EchoCanceller3(m_echoCanceller3Config, sampleRate, true));       //use high pass filter is true

// Create noise suppression.
m_noiseSuppression.reset(new NoiseSuppressionImpl(&m_criticalSection));
m_noiseSuppression->Initialize(CHANNEL_COUNT, sampleRate);

И вот как я вызываю API:

auto renderAudioBuffer = CreateAudioBuffer(spkSamples);
auto capturedAudioBuffer = CreateAudioBuffer(micSamples);

// Analyze capture buffer
m_echoCanceller3->AnalyzeCapture(capturedAudioBuffer.get());

// Analyze render buffer
m_echoCanceller3->AnalyzeRender(renderAudioBuffer.get());

// Cancel echo
m_echoCanceller3->ProcessCapture(
capturedAudioBuffer.get(), false);          
// Assuming the analog level is not changed.  
//If we want to detect change, need to use gain controller and remember the previously rendered audio's analog level

// Copy the Captured audio out 
capturedAudioBuffer->CopyTo(m_streamConfig, m_tempBuffer);

arrayCopy_32f(m_tempBuffer[0], micOut, m_samplesPerBlock);

А также в отношении параметров (задержка, echoModel, реверберация, noisefloor и т. Д.), Я использую все значения по умолчанию.

Может кто-нибудь сказать мне, что я делаю неправильно?Или как я могу улучшить его, настроив соответствующие параметры?

UpDate: (22/02/2019) Выяснил, почему отключен выход Echo Output.Похоже, Webrtc AEC3 не может обработать частоту дискретизации 8k и 16k, хотя в исходном коде есть указания, что они поддерживают 4 различные частоты дискретизации: 8k, 16k, 32k и 48k.Я получил вывод с эхоподавлением после того, как дал ввод сэмплов 32k и 48k.Однако я не вижу никакой эхоподавления.Он просто выплевывает точные сэмплы, как он был подан на вход NearEnd / Mic / Captured.Так что да, возможно, мне не хватает настроек ключевых параметров.Все еще ищу помощь.

...