speex 回声消除的用法【转】
来源:互联网 发布:微信支付端口什么意思 编辑:程序博客网 时间:2024/04/30 20:06
来自:http://blog.csdn.net/lsccsl/article/details/8126338
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
- speex 回声消除的用法【转】
- speex 回声消除的用法
- speex 回声消除的用法
- 基于Speex的声学回声消除
- 基于Speex的声学回声消除
- Speex 回声消除
- Speex 之回声消除
- speex回声消除
- Speex 回声消除
- Speex回声消除器
- speex 回声消除
- speex 回声消除(2)
- speex回声消除功能测试
- Speex 回声消除接口介绍
- Speex回声消除代码分析
- Speex回声消除代码分析
- speex 回声消除(1)
- Android移植Speex回声消除
- 编译,安装php拓展的一般步骤
- Mysql联合查询UNION和UNION ALL的使用介绍
- 编程之美-程序理解和时间分析
- 2011年ESRI北京站IDL视频教程(全) (2011-05-01 11:03:26) 转载
- 日期时间处理工具类总结
- speex 回声消除的用法【转】
- 时钟周期、机器周期、指令周期的概念及三者之间的关系
- Java中类成员函数重载、覆盖和隐藏的区别
- 拖拽Div
- 深入解析php中的foreach问题
- 算法题积累-明明的随机数
- java中使用javascript Rhino 引擎
- Java与算法之(3) - 斐波那契数列
- Java下CAS(Compare And Swap)并发操作测试