zoukankan      html  css  js  c++  java
  • 使用Speex中的AEC模块,提高声音质量(转)

    在Speex(www.speex.org)的最新版本中,开始集成了回音消除的模块,而回音消除一直是Voip之中亟待解决的主要问题。 
    很多朋友和我说speex的aec模块的效能并不好,我们先来看一下speex的aec的api调用方式。 

    /* 
    *创建AEC对象 
    */ 
    SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length); 

    frame_size 的取值最好是一个编码的frame大小, 在低带宽条件下,一般延迟20ms,而大小为160 
    filter_length,最好是房间内反射时间的1/3 
    如: 一个房间的反射时延为300ms 
        那么这个filter_length就最好是100ms(这个长度又被称为tail length). 

    而其中filter_length的设定是一个关键。 

    /* 
    *执行AEC 
    */ 
    speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue); 

    其中: 
    input_frame: 就是被声卡捕捉到的声音 
    echo_frame: 是由扬声器播放出的声音,这个声音是需要从 input_frame中抵消的声音. 

    output_frame 是处理完以后输出的声音 

    residue是一个可选参数,如果不使用可以将之设置为NULL, 也可以通过preprocessor 来控制 

    问题的关键是 处理input和echo 之间的关系, 
    也就是说在捕捉到的信号和播放的信号之间的延迟必须足够的小,才可以提高效率. 

    writetosndcard(echo_frame, frame_size) 
    readfromsndcard(input_frame, frame_size) 
    speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue) 
    如果你想要尽可能的减小信号中的回音,那么可以将residue这个参数设置为噪音参数. 

    我相信在大多数情况下,都是因为声音捕捉和声音播放之间的同步问题没有处理好,导致的音频质量下降。 

    /* 
    *销毁和复位 
    */ 
    speex_echo_state_destroy(echo_state); 

    speex_echo_state_reset(echo_state); 
    不再复述了! 

    说明: 
    据说在Speex的最新的1.2beta版本上,Speex提供了可选择的,简化的API,来提高echo执行过程中的同步问题。 
    这些,我会在以后的文章中在讨论。 

  • 相关阅读:
    软件测试理论基础
    使用Pycharm官方统计代码行插件统计代码总行数
    Jmeter的配置文件解析
    python异常整理
    python2与python3的区别
    tomcat的server.xml配置
    异常:Error response from daemon: conflict: unable to delete 6fa48e047721 (cannot be forced)
    前端 -- 定位和z-index
    前端 -- background
    前端 -- 超链接导航栏案例
  • 原文地址:https://www.cnblogs.com/myitm/p/2113087.html
Copyright © 2011-2022 走看看