【WebRTC】音频处理流程概述

转载 2015年08月21日 09:45:27

WebRTC强大的技术和易用性在此不再累述。研究了RTC那么久的时间,在国内的社区和论坛鲜见详细介绍其中具体技术的文章和讨论。因此准备花点时间总结一下自己对WebRTC 的Audio Processing Module 的理解。希望国内能有更多做音频算法的同行集思广益,推进音频技术的发展。

现在主要介绍一下audio_processing.h。

首先插入了几个类,这些都是audio_processing的核心模块。

摘要:本文主要介绍WebRTC的APM。

WebRTC强大的技术和易用性在此不再累述。研究了RTC那么久的时间,在国内的社区和论坛鲜见详细介绍其中具体技术的文章和讨论。因此准备花点时间总结一下自己对WebRTC 的Audio Processing Module 的理解。希望国内能有更多做音频算法的同行集思广益,推进音频技术的发展。

现在主要介绍一下audio_processing.h。

首先插入了几个类,这些都是audio_processing的核心模块。

  1. class AudioFrame;  
  2. class EchoCancellation;  
  3. class EchoControlMobile;  
  4. class GainControl;  
  5. class HighPassFilter;  
  6. class LevelEstimator;  
  7. class NoiseSuppression;  
  8. class VoiceDetection;  
这里大体介绍一下这几个类的功能和应用场景。

AudioFrame:主要记录了通道基本信息,数据,VAD标志时间戳,采样频率,信道数等。

EchoCancellation:回声消除模块(AEC),在使用外置扬声器的时候应该使用,有些使用耳麦通讯的情况也会存在回声(因为麦克风与扬声器有空间或者电的弱耦合),如果影响了通话也应该开启。

EchoControlMobile:回声抑制模块(AES),这个模块和回声消除模块功能相似,但是实现方法不一样。该模块使用定电话实现,运算量也远远小于回声消除模块。非常适合移动平台使用。但是对语音损伤大。

GainControl:增益控制模块(AGC),这个模块使用了语音的特征对系统硬件音量和输出的信号大小进行调节。硬件上可以控制输入音量。软件上只能调节原来信号的幅度,如果对原来就已经破音的信号,或者本来输入就比较小的信号就无能为力了。

HighPassFilter:高通滤波器,抑制不需要的低频信号。内部是使用定化的IIR实现的。可以根据需要修改参数选择相应的截止频率。对于某些有工频干扰的设备需要使用高通滤波器。

LevelEstimator:估计信号的能量值。

NoiseSuppression:噪声抑制模块(NS/SE),该模块一般应用在有环境噪声的情况,或者是麦克风采集到的数据有明显噪声的情况。

VoiceDetection:语音激活检测模块(VAD),该模块用于检测语音是否出现。用于编解码以及后续相关处理。

APM分为两个流,一个近端流,一个远端流。近端(Near-end)流是指从麦克风进入的数据;远端(Far-end)流是指接收到的数据。现在分别介绍一下,这部分代码在audio_processing_impl.cc里。

farend流代码:

  1. int AudioProcessingImpl::AnalyzeReverseStreamLocked() {  
  2.   AudioBuffer* ra = render_audio_.get();  // For brevity.  
  3.   if (rev_proc_format_.rate() == kSampleRate32kHz) {  
  4.     for (int i = 0; i < rev_proc_format_.num_channels(); i++) {  
  5.       // Split into low and high band.  
  6.       WebRtcSpl_AnalysisQMF(ra->data(i),  
  7.                             ra->samples_per_channel(),  
  8.                             ra->low_pass_split_data(i),  
  9.                             ra->high_pass_split_data(i),  
  10.                             ra->filter_states(i)->analysis_filter_state1,  
  11.                             ra->filter_states(i)->analysis_filter_state2);  
  12.     }  
  13.   }  
  14.   
  15.   RETURN_ON_ERR(echo_cancellation_->ProcessRenderAudio(ra));  
  16.   RETURN_ON_ERR(echo_control_mobile_->ProcessRenderAudio(ra));  
  17.   RETURN_ON_ERR(gain_control_->ProcessRenderAudio(ra));  
  18.   
  19.   return kNoError;  
  20. }  
上述代码可以看出farend获得数据后主要有4个步骤的处理。

1、判断是否是32k信号,采取相应的分频策略;

2、AEC流程,记录AEC中的farend及其相关运算;

3、AES流程,记录AES中的farend及其相关运算;

4、AGC流程,计算farend及其相关特征。

nearend流代码:

  1. int AudioProcessingImpl::ProcessStreamLocked() {  
  2. #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP  
  3.   if (debug_file_->Open()) {  
  4.     audioproc::Stream* msg = event_msg_->mutable_stream();  
  5.     msg->set_delay(stream_delay_ms_);  
  6.     msg->set_drift(echo_cancellation_->stream_drift_samples());  
  7.     msg->set_level(gain_control_->stream_analog_level());  
  8.     msg->set_keypress(key_pressed_);  
  9.   }  
  10. #endif  
  11.   
  12.   AudioBuffer* ca = capture_audio_.get();  // For brevity.  
  13.   bool data_processed = is_data_processed();  
  14.   if (analysis_needed(data_processed)) {  
  15.     for (int i = 0; i < fwd_proc_format_.num_channels(); i++) {  
  16.       // Split into a low and high band.  
  17.       WebRtcSpl_AnalysisQMF(ca->data(i),  
  18.                             ca->samples_per_channel(),  
  19.                             ca->low_pass_split_data(i),  
  20.                             ca->high_pass_split_data(i),  
  21.                             ca->filter_states(i)->analysis_filter_state1,  
  22.                             ca->filter_states(i)->analysis_filter_state2);  
  23.     }  
  24.   }  
  25.   
  26.   RETURN_ON_ERR(high_pass_filter_->ProcessCaptureAudio(ca));  
  27.   RETURN_ON_ERR(gain_control_->AnalyzeCaptureAudio(ca));  
  28.   RETURN_ON_ERR(echo_cancellation_->ProcessCaptureAudio(ca));  
  29.   
  30.   if (echo_control_mobile_->is_enabled() && noise_suppression_->is_enabled()) {  
  31.     ca->CopyLowPassToReference();  
  32.   }  
  33.   RETURN_ON_ERR(noise_suppression_->ProcessCaptureAudio(ca));  
  34.   RETURN_ON_ERR(echo_control_mobile_->ProcessCaptureAudio(ca));  
  35.   RETURN_ON_ERR(voice_detection_->ProcessCaptureAudio(ca));  
  36.   RETURN_ON_ERR(gain_control_->ProcessCaptureAudio(ca));  
  37.   
  38.   if (synthesis_needed(data_processed)) {  
  39.     for (int i = 0; i < fwd_proc_format_.num_channels(); i++) {  
  40.       // Recombine low and high bands.  
  41.       WebRtcSpl_SynthesisQMF(ca->low_pass_split_data(i),  
  42.                              ca->high_pass_split_data(i),  
  43.                              ca->samples_per_split_channel(),  
  44.                              ca->data(i),  
  45.                              ca->filter_states(i)->synthesis_filter_state1,  
  46.                              ca->filter_states(i)->synthesis_filter_state2);  
  47.     }  
  48.   }  
  49.   
  50.   // The level estimator operates on the recombined data.  
  51.   RETURN_ON_ERR(level_estimator_->ProcessStream(ca));  
  52.   
  53.   was_stream_delay_set_ = false;  
  54.   return kNoError;  
  55. }  

其中包括七个步骤:1、分频;2、高通滤波;3、硬件音量控制;4、AEC;5、NS;6、AES;7、VAD;8、AGC;9、综合。

可见nearend的处理全面,流程清晰。可以更具实际需要打开不同的模块,适应不同场景的需要,对于一般通讯系统来说具有正面的改善效果。但是在实际工作中也发现了一些流程上隐患。另外就是该结构的各个模块处理相对独立耦合低,本来应该是一个优良的特性,然而在复杂情况的信号处理难以到达目标效果。由于低耦合造成的运算量浪费更加是无法避免的。


WebRTC音频处理流程概述

摘要:本文主要介绍WebRTC的APM。 WebRTC强大的技术和易用性在此不再累述。研究了RTC那么久的时间,在国内的社区和论坛鲜见详细介绍其中具体技术的文章和讨论。因此准备花点时间总结一下自...
  • u014338577
  • u014338577
  • 2017年01月01日 22:37
  • 300

WebRTC音频处理流程概述

摘要:本文主要介绍WebRTC的APM。 WebRTC强大的技术和易用性在此不再累述。研究了RTC那么久的时间,在国内的社区和论坛鲜见详细介绍其中具体技术的文章和讨论。因此准备花点时间总结一下自己对...
  • boywgw
  • boywgw
  • 2015年07月07日 16:17
  • 7491

webrtc agc

一、参数 (一)、mode enum Mode { // Adaptive mode intended for use if an analog volume control is av...
  • tanningzhong
  • tanningzhong
  • 2016年01月20日 10:36
  • 2724

Webrtc AGC 算法原理介绍(三)

零、前言本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。一、WebRtcAgc_A...
  • u014020618
  • u014020618
  • 2016年10月18日 13:33
  • 3669

WebRTC详解

1、WebRTC目的 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...) 轻易快捷开发出丰...
  • Explorer_day
  • Explorer_day
  • 2017年02月16日 09:27
  • 1506

Android 版本AGC调节

因为在有些android手机webrtc语音比较轻,但是本机自带录音播放还是比较大的,为此想增大webrtc的增益,我这里AGC模式采用kAgcFixedDigital或kAgcAdaptiveDig...
  • tanningzhong
  • tanningzhong
  • 2016年01月20日 10:50
  • 2537

webrtc(一) agc

参数mode enum Mode { // Adaptive mode intended for use if an analog volume control is available ...
  • xmdxcsj
  • xmdxcsj
  • 2015年12月03日 21:33
  • 3396

Webrtc 回声消除 三(NS、VAD、AEC、AGC设备端终结篇)

本章概述: 1、优化了网络队列,提高网络丢包乱序包损情况下的回音消除质量,工具为Openwrt。 2、封装AGC接口解决speaker放大电路播放的声音能量太大,AEC无法精确消除,出现真声和回声都消...
  • yuanchunsi
  • yuanchunsi
  • 2017年04月17日 17:49
  • 3352

单独编译和使用webrtc音频增益模块(AGC)

webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分。另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到...
  • godloveyuxu
  • godloveyuxu
  • 2017年06月29日 16:08
  • 545

Webrtc AGC 算法原理介绍(二)

音频算法零、前言本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。...
  • u014020618
  • u014020618
  • 2016年09月20日 14:37
  • 4593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【WebRTC】音频处理流程概述
举报原因:
原因补充:

(最多只允许输入30个字)