speex的回声消息

就是speex_echo_cancellation函数的正确用法

回声消息的原理:

对参考声音(解码的对端原始语音包)做延迟(会有多个延迟,如麦克风直接采集到音箱的声音,经墙壁反射后再次采集),衰减,

从声卡里采集到的语音,做一个语音合成。

回声产生的条件:

通话中,有一方使用音箱(或者双方都用音箱)。

在实际中如何使用speex_echo_cancellation这个函数呢?错误的使用,将导致speex无法快速地收敛回声滤波器的参数。

使用音箱的那一方,这里我们称之为"发送方",调用speex_echo_cancellation,

这样做就绕开了网络延迟,引起对算法收敛的干挠。

这是第一点要注意的

(也可以在"接收方"调用speex_echo_cancellation,但网络出现抖动时,就会使算法无法快速收敛,就无法消除回声了)

这样,我们的代码中,大概会是这样的逻辑:

解码网络语音包(记为 play)

写入声卡

采集麦克风的声音(记为rec)

调用speex_echo_cancellation 参play与rec传给这个函数

回想一下,应用层的程序可能会是这样(当然您的程序也可能不是这样,但情形类似):

一个接收线程,收包,放音

一个发送线程,录音,发包

我们自然会在录音线程里调用speex_echo_cancellation

但这有一个问题,录音线程与放音线程因为系统的调度问题,也会造成抖动,导致speex的回声消除算法无法收敛。

以下的一个程序模形,读者们可以参考

1 接收线程A,解码网络语音包,接语音包推入一个消息队列A

2 放音录音线程B,从队列A中取出语音包,放音,录音,录音得到的语音包,通过speex_echo_cancellation处理后,存入队列B

3 发送线程C,从队列B中取语音包,编码,发送

简单地说,就是用一个线程放音,录音,然后echo cancel,这样就不存在线程调度引起的延迟抖动

采用这种方式,就避免了因为线程调度引起的抖动,避免了不确定的延迟对speex算法收敛过程的干挠。

最后一个干挠因素:os提供的录音放音接口也是异步的。。。

这个干挠因素基本在应用层是无法排除的了。。。可能就是几毫秒的误差,但足以干挠回声消除算法了。

多路语音(会议)

选一个超级节点做合成语音,或者终端对语音进行合成,之后,处理就变成与单对单语音通话类似的情形了

直接上speex_echo_cancellation

java speex回声消除_speex 回声消除的用法相关推荐

  1. 回声问题和回声消除技术及在可视监控对讲、楼宇对讲等领域的应用综述

    来源  http://www.qttaudio.com/hswt-yyzs.html 回声是远程对讲中最常见的声音问题之一.远程对讲的回声问题是许多对讲产品领域遇到的产品技术问题,比如,发生在手机外放 ...

  2. 回声的来源和消除(转载)

    时间:2006-3-3 Q:请问打电话时,听到的回音是哪来的?  A:在PBX或局用交换机侧,有少量电能未被充分转换而且沿原路返回,形成回声.如果打电话者离PBX或交换机不远,回声返回很快,人耳听不出 ...

  3. Android 平台语音通话及回音消除、噪音消除研究

    一 Android平台语音通讯 正因为Android平台优越的性能.美观的界面,越来越多人使用Android手机,从而在Android平台上的 语音通话越来越多.语音通话大概流程如下:我认为一个语音通 ...

  4. Android 平台语音通话及回音消除、噪音消除研究(转)

    一 Android操作系统由来 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平 板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名 ...

  5. 【转】Android 平台语音通话及回音消除、噪音消除研究

    本文转自博客:https://www.cnblogs.com/jianglijs/p/8583603.html -------------------------------------------- ...

  6. 关于java的集合类,以及HashMap中Set的用法!

    來源:http://hi.baidu.com/fyears/blog/item/52329711622e007ccb80c465.html 关于java的集合类,以及HashMap中Set的用法! 2 ...

  7. java this.val$_[Java教程]Jquery $(this).attr和$(this).val用法示例

    [Java教程]Jquery $(this).attr和$(this).val用法示例 0 2017-08-17 17:00:11 以下是个人心得整理,有兴趣朋友可以参考参考 $(this).attr ...

  8. js 如何将java list集合转换成var类型数组_零基础参加郑州Java培训 一定要注意Arrays.asList的用法...

    作为编程界的老大哥,Java一直是想要加入互联网行业的人的首选.为了能够更快更好地入行,很多零基础学员选择参加郑州Java培训班,跟着老师的脚步由浅入深的学习专业技术.今天千锋郑州小编就给大家分享使用 ...

  9. java中判断list是否为空的用法(亲测)

    1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...

最新文章

  1. 《数据科学:R语言实现》——3.12 估计缺失数据
  2. 云计算炒作多过采纳 普及仍需时日
  3. 2021CSP:游记
  4. java 四舍五入_Java常用类
  5. jasperReport - 多Table的PDF中文导出
  6. static、const、static const、const static成员的初始化问题
  7. 计算数据个数mysql thinkphp_ThinkPHP5 (mySQL) 统计各个时间段内的订单量
  8. MTK6589百度云ROM移植教程
  9. ESXI安装网卡或HBA卡驱动
  10. 2022南理工软件工程专硕考研经验
  11. android手机内存越来越小,手机内存越来越小怎么办 手机内存清理方法【步骤】...
  12. 三维GIS显示中,利用太阳高度角和方位角计算光照
  13. 华为招收mba硕士么_为什么我放弃MBA以获得计算机科学硕士学位
  14. 以太网卡 及 以太网帧
  15. 计算机技能名称英语,电脑技能英文表示法
  16. ios设备备份,更新路径(mac os)
  17. 一键搞定黑白照片上色,模糊的老照片瞬间变清晰
  18. python出现SyntaxError: Non-ASCII character '\xe6' in file错误
  19. 少儿编程课程体系需求
  20. 中英文在线语音转文字的方法

热门文章

  1. 什么是数据库视图(view),视图(view)优缺点是什么?
  2. R语言聚类分析之基于划分的聚类KMeans实战:基于菌株数据
  3. R语言dplyr包mutate_if函数修改所有满足条件的数据列的内容实战
  4. R计算回归模型Mallows’ Cp指标
  5. Servlet业务逻辑封装的试探
  6. android实现分类搜索功能,android应用中的搜索功能怎么实现的
  7. python 随机生成密码
  8. mysql 数据库的导入和导出
  9. 怎样理解公钥,私钥和数字签名
  10. 一文详解JavaBean 看这篇就够了