基于Speex的声学回声消除
来源:互联网 发布:眼镜软件 lms 编辑:程序博客网 时间:2024/04/30 16:37
所谓声学回声消除,是为了解决VoIP(网络电话)中这样一个问题:即A与B进行通话,A端有麦克风和扬声器分别用来采集A的声音和播放B的声音,B端有麦克风和扬声器分别用来采集B的声音和播放A的声音,很明显,由于声音传播的特性,A端的麦克风在采集A的声音的同时,也采集到了A端扬声器播放的来自B的声音,也就是A端采集到的声音是一个混合的声音,这个声音通过网络发给B时,B就不仅能听到A的声音,也能听见B前几秒自己的声音,这就是在B端听到了B自己的回声,同理在A端也可以听到A自己的回声,这显然不是我们想要的。
声学回声消除一般可以通过硬件和软件分别实现,目前来说,硬件实现比较简单,软件实现较难,这里的难并不是说回声消除算法很难,而是在应用算法时的实时同步问题很难,目前软件实现较好的应该是微软,但似乎也对硬件配置和操作系统有要求。而Speex提供了声学回声消除算法库,本文就简单用Speex对一段录音进行回声消除,当然这不是实时处理的。
Speex中回声消除API封装在语音处理API中,在最新版本的Speex中将语音处理相关的API独立封装成libspeexdsp。
应用Speex回声消除API流程很简单:包含相关头文件——创建回声消除器状态——对每帧进行回声消除——销毁回声消除器状态。一般可以与Speex中的预处理器一起使用,已达到较好的声音效果,应用预处理器API的流程也很简单:包含相关头文件——创建预处理器状态——对每帧进行预处理——销毁预处理器状态。当然可以设置预处理器状态,在此我们使用默认设置。可以看到两者流程相同,因而写成一个CSpeexEC类,这是一个开源的回声消除器,对其中的两个函数调用做了稍微的修改。原文参见http://www.360doc.com/content/11/1008/18/11192_154383516.shtml,原文所用speex版本是1.1.9,我们用的是speex-1.2beta3-win32,执行预处理和回声消除的函数进行了更新。
1、speexEC.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
来自CODE的代码片speexEC.h
2、speexEC.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
来自CODE的代码片speexEC.cpp
3、测试驱动文件echocancel.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
来自CODE的代码片echocancel.cpp
程序需要两个FarEnd.pcm和NearEnd.pcm文件作为输入,输出out.pcm文件,其中FarEnd.pcm为远端回放音频,即待消除的回声参考文件,NearEnd.pcm是近端麦克风采集音频,是人的语音和回声的混合音频,out.pcm是对NearEnd.pcm进行回声消除后的文件。我们用matlab将纯净语音与FarEnd.pcm线性相加来产生NearEnd.pcm,其中采样率为8kHz,这样FarEnd与NearEnd是严格同步的,注意,是线性相加,而且可以将FarEnd乘以一个幅值再与纯净语音相加。从下图和听觉结果来看,完全同步时回声消除效果很好。
FarEnd-8kHz.pcm
NearEnd-8kHz.pcm
out-8kHz.pcm
但实际VoIP中麦克风采集到的人的语音和扬声器播放的声音并不是简单的线性混合,一方面是由于房间内的混响,它们更接近于卷积混合;更重要的是,麦克风采集到的回放和参考回放不是严格同步的,即FarEnd.pcm信号与NearEnd.pcm中的回放FarEnd信号不是同步的,一般会有几帧的延时,这是因为FarEnd.pcm是直接从声卡提取的,而NearEnd.pcm中的回放FarEnd信号是经过声卡经扬声器播放,再被麦克风采集的。
为此,我们选取一段歌曲作为FarEnd.pcm,在播放的FarEnd.pcm的同时开始录音,产生NearEnd.pcm。程序进行回声消除的结果如下:
FarEnd1-8kHz.pcm
NearEnd1-8kHz.pcm
out1-8kHz.pcm
从上图及听力结果来看,在这样没同步的情况下,回声消除的效果并不理想。注意FarEnd.pcm参考回放的幅值比NearEnd.pcm录音到的回放幅值大,这是因为声音在传播过程中是会衰减的。
上图的结果是在采样率为8kHz下进行的,一个有趣的现象是,若提高采样率,效果似乎变好了。为此,我们将音频采样率转为44.1kHz并相应修改程序中的采样率,得到结果如下图所示:
out2-44.1kHz.pcm
从上图来看似乎看不出效果变好,但是从听觉效果来看,回声的的确确是变小了。这应该跟回声消除算法的收敛有关,因为采样率变大,每秒的采样点多。采样率为8kHz,帧长160对应20ms;采样率为44.1kHz,帧长160对应约3.6ms,所以可能跟帧大小相关。具体什么原因,我还没想到一个很好的解释方法。
以上就是基于Speex的回声消除简单应用,在能保证同步的情况下效果不错,但不同步时效果变差,可以适当提高采样率(frame_size不变)以提高处理效果。
- 基于Speex的声学回声消除
- 基于Speex的声学回声消除
- Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)
- Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)
- Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)
- speex 回声消除的用法
- speex 回声消除的用法
- speex 回声消除的用法【转】
- Speex 回声消除
- Speex 之回声消除
- speex回声消除
- Speex 回声消除
- Speex回声消除器
- speex 回声消除
- speex 回声消除(2)
- 一个开源的声学回声消除器
- 一个开源的声学回声消除器
- 微软声学回声消除demo AECMicArray的使用
- 测试人员的考核评定
- 九度[1004]-Median
- Qlabel
- Android设计模式之(18)----适配器模式
- hive on spark安装的一些问题
- 基于Speex的声学回声消除
- 指针 c++
- 初识Docker
- Reactor模型的演变
- LeetCode--N-Queens II
- 查看Linux系统位数
- 计算机网络——自顶向下方法第四章4.5 4.6
- webuploader分片上传大文件
- eclipse配置文件没有提示问题解决方案