当前位置:首页 » 《我的小黑屋》 » 正文

webrtc回音消除算法介绍

5 人参与  2024年04月29日 15:30  分类 : 《我的小黑屋》  评论

点击全文阅读


一、什么是回声消除(AEC)

 在回答回声消除之前,我们看这幅图片,如下图所示:

当远端Far-end有说话者讲话时,声音会传到近端(Near-end)的扬声器,然后声音通过空间延时和传输延时重新回到了远端。这样就造成了声学回声。近端到远端的流程也有同样声学回声,在此仅仅描述近端的流程.

你可能问:我们手机为什么没有这个现象。因为我们手机安卓系统已经实现了回声消除的算法。

二、回声消除处理

我们本次讲解的芯片平台,主要是比较低端,频率比较低的芯片。比如SMT32 esp8266.比较高端的芯片绝大部分原厂已经实现了回声消除的功能。回声消除算法也是比较消耗CPU的,所以我们对于低端的芯片,需要去选择一个好的回声消除算法尤其重要。

常见的speex webrtc 都自带回声消除的功能

实际效果对比:如果样本非线性不严重,两者的效果都不错;对于非线性speex效果就很差,webrtc的效果好;双讲时,webrtc出来的音质就很差,有吃音现象。

所以本次我们主要讲解WEBRTC的回声消除算法,对于WEBRTC它有三个三种回音消除算法(aec aec3 aecm)。其中aec ,aec3 主要是给手机使用的,我们安卓系统就是用了这个2个。我们低端芯片可能就跑不动了,本次我们主要使用webrtc的aecm。


三、基于webrtc平台Aecm的应用

/* 从喇叭读取音频数据的接口函数 * 应用程序调用 */void audio_capture_snddev_raw_pcm_read(BYTE_T *pcm_data ,UINT_T len){    for(;;){        /*cap_ring_buff  这个FIFO在 aec_thread线程被填充数据         * 应用程序从这个cap_ring_buff读取数据 是没有回声的         */        if(audio_ring_buff_used_size_get(cap_ring_buff) > len){            audio_ring_buff_read(cap_ring_buff, pcm_data, len);            break;        }    } }/* 音频播放到喇叭的接口函数 * 应用程序调用 */void audio_play_snddev_raw_pcm_write(BYTE_T *pcm_data ,UINT_T len){     UINT_T write_len = len;  UINT_T free_len = 0;      /*存储到play_ring_buff这个FIFO*/  free_len = audio_ring_buff_free_size_get(play_ring_buff);  if(free_len >= len){    audio_ring_buff_write(play_ring_buff,pcm_data,len);    write_len = len;  }   /*硬件喇叭播放声音*/   audio_speaker_play(pcm_data,write_len);}void aec_thread(){ #define N_SAMPLE  80       BYTE_T pcm_uint_in[N_SAMPLE*2];    BYTE_T pcm_uint_out[N_SAMPLE*2];    BYTE_T pcm_uint_e[N_SAMPLE*2];    void *aecmInst = NULL;    int status;     unsigned int out_len;        AecmConfig config;    config.cngMode = 1;    config.echoMode = 4;// 0, 1, 2, 3 (default), 4  /*初始化aec 设置aec的参数,比如音频采样率8000*/  if (aecmInst == NULL){     WebRtcAecm_Create(&aecmInst);     status = WebRtcAecm_Init(aecmInst, 8000);//8000 or 16000 Sample rate     if(status != 0){       AUDIO_DEG("WebRtcAecm_Init error");      }      status = WebRtcAecm_set_config(aecmInst, config);      if (status != 0) {        AUDIO_DEG("WebRtcAecm_set_config fail");      }  }      while (1){      /*读取麦克风的声音 从硬件MIC*/      auido_mic(pcm_uint_in,sizeof(pcm_uint_in));              /*从 play_ring_buff 读取数据 。这个play_ring_buff 的数据是在audio_play_snddev_raw_pcm_write函数放入*/      out_len = aidio_ring_buff_used_size_get(play_ring_buff);      if(out_len >= sizeof(pcm_uint_out)){        /*喇叭循环FIFO(play_ring_buff)有数据,则取出来开始回声消除*/        audio_ring_buff_read(play_ring_buff, pcm_uint_out, sizeof(pcm_uint_out));        out_len = N_SAMPLE;                /*喇叭循环FIFO(play_ring_buff)作为aec的Farend数据*/        if(WebRtcAecm_BufferFarend(aecmInst,pcm_uint_out,out_len)){          AUDIO_DEG("WebRtcAecm_BufferFarend fail");        }                 /*回声消除处理*/        if(WebRtcAecm_Process(aecmInst, pcm_uint_in, NULL, pcm_uint_e, out_len, snd_dev_used_aec_config.msInSndCardBuf)){          AUDIO_DEG("WebRtcAecm_Process fail");        }        /*写入capture fifo(cap_ring_buff)*/        auido_capture_pcm_fifo_write(pcm_uint_e,out_len*2);      }    }}

总体思路:喇叭播放音频数据时,先存储起来,存储在循环FIFO内,作为回声消除的Farend数据,建立一个aec线程,线程的主要工作流程:读取麦克风声音,读取喇叭存储的循环FIFO ,进行回声消除。

我写了个测试demo,项目地址:https://download.csdn.net/download/unique_no1/83074190

        里面包含测试程序和可执行文件,windows平台和linux平台的我都已经编译好了,大家可以测试看下效果,接口调用也比较简单,如果需要商用的话可以跟我联系,或者有技术问题想要沟通、交流的也非常欢迎。

如果需要技术问题沟通、技术交流讨论、业务合作也非常欢迎。

联系方式:

vx:unique_no_1

tel:18108010758


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/102016.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 林语熙周晏京(离婚后,老公天天跪求复合全集阅读)最新章节免费在线阅读_《离婚后,老公天天跪求复合全集阅读》最新热门小说 -
  • 顾绫雪嬴政《被始皇读心后,文武百官卷疯了!完结版阅读》完整版免费在线阅读_(顾绫雪嬴政)全集免费阅读 -
  • 情深意长皆成空完整版阅读(沈卿林砚辞)抖音热文_《情深意长皆成空完整版阅读》最新章节免费在线阅读 -
  • 姐姐为暴富重伤傅家金孙后火葬场了全集阅读小说(傅延江瑶)全文免费阅读无弹窗大结局_(姐姐为暴富重伤傅家金孙后火葬场了全集阅读免费阅读全文大结局)最新章节列表_笔趣阁(姐姐为暴富重伤傅家金孙后火葬场了全集阅读) -
  • 乔以诺萧瑾淮(不是你好是我好全集阅读)精彩试读_《不是你好是我好全集阅读》全本阅读 -
  • 白月光双双《重生后我成全老公和白月光,他却急了全集》全文免费阅读无弹窗大结局_(白月光双双)最新章节免费在线阅读 -
  • 苏小枫苏末小说免费笔趣阁_苏小枫苏末小说全章完本大结局
  • 死遁后他疯了最新小说全文阅读_最新免费小说沈轻洲林梦江之雪_完本小说(死遁后他疯了)
  • 免费小说《顾里宋婷婷小岳欧颖倩》已完结(顾里宋婷婷小岳欧颖倩)热门小说大结局全文阅读笔趣阁
  • 侄子为求富贵,变性后全家后悔最新小说_免费小说全文阅读(苏小枫苏末)_侄子为求富贵,变性后全家后悔苏小枫苏末小说推荐完结
  • 最新《沈轻洲林梦江之雪》小说(全集完整新上小说大结局(沈轻洲林梦江之雪))全文阅读笔趣阁
  • 拒绝嫁给姐夫后,我在八零年代暴富了(陈小棠沈正韩)阅读 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1