WebRTC音频处理流程概述

转载 2015年07月07日 16:17:33

摘要:本文主要介绍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音频引擎之audio_processing介绍

audio_processing模块为语音处理的精华,包含音频的回音处理、降噪处理、自动增益处理等音频的核心处理业务算法,(静音检测在另外一个模块,不知道新版与这基本算法放到了同一个模块木有) ,  ...

webrtc:音频处理流程

转载:http://blog.csdn.net/neustar1/article/details/19200489 本文概要介绍WebRTC的音频处理流程,见下图 webRTC将音频会话抽象...

WebRTC源码分析一:音频处理流程

本文概要介绍webRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输。上图中有三个Cha...

WebRTC音频处理流程概述

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

webrtc NS 函数调用 自我学习

本文有部分是借鉴网上部分作者的,尽量注明来源,如有问题,请告知本人,及时删帖 文章只为能够吸引并且与更多人一起学习,若文章有任何问题,请告知本人,本人尽快改正 1、创建实体:N...

Webrtc AGC 算法原理介绍(一)

Webrtc AGC 算法原理介绍(一)标签(空格分隔): 音频算法零、前言本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因...

Webrtc AGC 算法原理介绍(二)

音频算法零、前言本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。...

webrtc中关于AEC,AGC,NS模块的使用总结

自己在查找测试代码的时候,发现一个博主写的很好,这是他的网址:http://www.cnblogs.com/mod109/p/5827918.html。 不过webrtc的源码在更新,有些函数的调用...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

webrtc agc

一、参数 (一)、mode enum Mode { // Adaptive mode intended for use if an analog volume control is av...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebRTC音频处理流程概述
举报原因:
原因补充:

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