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

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

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

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

[cpp] view plaincopy
  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流代码:

[html] view plaincopy
  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. RETURN_ON_ERR(echo_cancellation_->ProcessRenderAudio(ra));
  15. RETURN_ON_ERR(echo_control_mobile_->ProcessRenderAudio(ra));
  16. RETURN_ON_ERR(gain_control_->ProcessRenderAudio(ra));
  17. return kNoError;
  18. }

上述代码可以看出farend获得数据后主要有4个步骤的处理。

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

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

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

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

nearend流代码:

[cpp] view plaincopy
  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. AudioBuffer* ca = capture_audio_.get();  // For brevity.
  12. bool data_processed = is_data_processed();
  13. if (analysis_needed(data_processed)) {
  14. for (int i = 0; i < fwd_proc_format_.num_channels(); i++) {
  15. // Split into a low and high band.
  16. WebRtcSpl_AnalysisQMF(ca->data(i),
  17. ca->samples_per_channel(),
  18. ca->low_pass_split_data(i),
  19. ca->high_pass_split_data(i),
  20. ca->filter_states(i)->analysis_filter_state1,
  21. ca->filter_states(i)->analysis_filter_state2);
  22. }
  23. }
  24. RETURN_ON_ERR(high_pass_filter_->ProcessCaptureAudio(ca));
  25. RETURN_ON_ERR(gain_control_->AnalyzeCaptureAudio(ca));
  26. RETURN_ON_ERR(echo_cancellation_->ProcessCaptureAudio(ca));
  27. if (echo_control_mobile_->is_enabled() && noise_suppression_->is_enabled()) {
  28. ca->CopyLowPassToReference();
  29. }
  30. RETURN_ON_ERR(noise_suppression_->ProcessCaptureAudio(ca));
  31. RETURN_ON_ERR(echo_control_mobile_->ProcessCaptureAudio(ca));
  32. RETURN_ON_ERR(voice_detection_->ProcessCaptureAudio(ca));
  33. RETURN_ON_ERR(gain_control_->ProcessCaptureAudio(ca));
  34. if (synthesis_needed(data_processed)) {
  35. for (int i = 0; i < fwd_proc_format_.num_channels(); i++) {
  36. // Recombine low and high bands.
  37. WebRtcSpl_SynthesisQMF(ca->low_pass_split_data(i),
  38. ca->high_pass_split_data(i),
  39. ca->samples_per_split_channel(),
  40. ca->data(i),
  41. ca->filter_states(i)->synthesis_filter_state1,
  42. ca->filter_states(i)->synthesis_filter_state2);
  43. }
  44. }
  45. // The level estimator operates on the recombined data.
  46. RETURN_ON_ERR(level_estimator_->ProcessStream(ca));
  47. was_stream_delay_set_ = false;
  48. return kNoError;
  49. }

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

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

WebRTC音频处理流程概述相关推荐

  1. WebRTC视频数据流程分析

    本文来自<WebRTC Native开发实战>书籍作者许建林在LiveVideoStack线上分享中的内容,详细分析总结 WebRTC 的视频数据流程,并对大型项目如何快速上手:分析方法, ...

  2. WebRTC音频系统 音频发送和接收

    文章目录 3.1音频数据流发送流程 3.2 发送中的编码.RTP打包 3.3 AudioSendStream类关系 3.4`webrtc::AudioSendStream` 创建和初始化 3.5 创建 ...

  3. ijkplayer源码分析 音频解码流程

    前言 本系列如下: 整体概述 视频渲染流程 音频播放流程 read线程流程 音频解码流程 视频解码流程 视频向音频同步 start流程和buffering缓冲策略 本文是流程分析的第四篇,分析ijkP ...

  4. webRTC混音流程

    原因:由于目前开始调研混音算法,故在此分析一下webRTC的实现流程,其他实现流程在另外一个博客有记录. 概况:目前调研的混音算法在多路混音时只有webRtc的原理符合基本流程.webRtc充分考虑了 ...

  5. SAP SD基础知识之SD常见流程概述

    SAP SD基础知识之SD常见流程概述 正常销售.正常退货.第三方销售.跨公司销售.独立采购.寄售.免费赠送,这些就是项目实践中SD模块里最常见的流程了,当然还有一些不太常用的流程没有列举进来,不再本 ...

  6. ETL流程概述及常用实现方法

    ETL是英文Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.常见于数据仓库开发中将数 ...

  7. 1-uboot流程——概述

    [uboot] (第一章)uboot流程--概述 2016年10月26日 22:30:45 阅读数:2520 [uboot] uboot流程系列:  [project X] tiny210(s5pv2 ...

  8. 7. U9成本核算基本流程概述

    摩天,用友旗下社会化的企业数智化学习认证社区,提供数智营销.智慧医疗.数智金融.智能制造.项目管理等精品课程,数智化人才上摩天!https://mot.yonyou.com/ 当成本计算模式=分摊时, ...

  9. MariaDB架构图与执行流程概述

    MariaDB架构图与执行流程概述 1MariaDB执行流程 以客户端访问MariaDB数据库服务器为例,它的执行流程见下: 当一个客户端(应用程序.GUI工具)连接MariaDB时会产生一个基于该客 ...

最新文章

  1. 服务器架设笔记——使用Apache插件解析简单请求
  2. 神奇的 SQL,Group By 真扎心,原来是这样!
  3. 字节跳动Java高级工程师:java队列实现停车场出入
  4. python maketrans_Python maketrans()方法
  5. servlet与tomcat的关系
  6. J.U.C 提供的阻塞队列
  7. c语言常用算法累加法例题,C语言第三次模拟练习题部分解答.docx
  8. 用CommonDialog公共对话框选取多个文件
  9. Java的对象和类 以学生管理系统为例
  10. sas硬盘安装linux,Intel SAS RAID安装CentOS 5.4 Linux操作系统方法附教程下载
  11. 1.5时钟控制的触发器(钟控JK、钟控T触发器)
  12. 云借阅-图书管理系统
  13. 出行必备:手机1秒调出健康码 !
  14. 平板电脑与计算机连接网络,终于发现平板电脑怎么连接网络
  15. Win7安装.Net Framework 4.5.2失败最有效的解决方法
  16. Maven之Nexus局域网私服的搭建以及上传下载的测试
  17. DenseFuse: A Fusion Approach to Infrared and Visible Images 阅读笔记
  18. 【旧设备重获新生】--TL-WR842N V4.4路由器升级
  19. python个人所得税计算器
  20. 中南大学和中山大学计算机专业哪个好,中山大学和中南大学哪个好?各有哪些优势?...

热门文章

  1. 浏览器众生相 程序员火眼鉴身份
  2. 四维超体运动在三维空间的表现(使用three.js)
  3. 算法——经典例子之Python实现百钱白鸡问题
  4. 学校图书借阅管理系统(python + sql serve)数据库大作业
  5. linux mint 卸载compiz,Ubuntu12.04和linux mint 13的3D桌面效果的实现及compiz conf...
  6. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第四篇:使用脚本控制跑酷角色
  7. 制作mysql rpm包_一步步制作RPM包
  8. 利用Histcite+Web Of Science帮助领域文献了解
  9. 阿里云云解析新手教程 新手看完啥都会了
  10. PyTorch 分布式训练 (DP/DDP/torchrun/多机多卡) <笔记总结>