回音消除原理解析及Android应用
标签(空格分隔): Android Echo-Cancellation
什么是回音
回音分为两种:
- 声学回音(Acoustic Echo)
- 线路回音(Line Echo)
目前我们只讨论声学回音;声学回音是由于在免提或者会议应用中,扬声器的声音多次反馈到麦克风引起的;
回音消除原理
原理是,在发送时,把不需要的回音从语音流中间去掉;
对于一个混合了两个声音的语音流,要把他们分开,去掉其中一个,这个非常困难;所以,实际应用上,除了这个已经混合好的信号,我们是可以得到产生回音的原始信号,然后基于回音的原始信号,在混合信号中将回音信号剥离出来。
Android做回音消除的关键点
Android在4.1(API level 16)中增加了AcousticEchoCanceler
官方介绍在AcousticEchoCanceler(请自备梯子)
要启用回音消除的使用过方式如下:
prvivate void enableAcousticEchoCanceler() {mAcousticEchoCanceler = AcousticEchoCanceler.create( mPlayer.getAudioSessionId() );if( mAcousticEchoCanceler.isAvailable() ) {// enable echo cancellermAcousticEchoCanceler.setEnabled( true );}
}
回音消除需要和采集声音配合在一起,我们使用AudioRecord
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, frequency, channelIN, audioEncoding, tmpSize);
初始化好audioRecord之后,可以得到session id
audioRecord.getAudioSessionId();
初始化AudioTrack时,也需要额外的处理sessionId
udioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId());
需要申请的权限有
- RECORD_AUDIO
- MODIFY_AUDIO_SETTINGS
总结如下:
- 要测试Echo Cancel的效果,需要一边从microphone采集声音,一边用speaker进行声音播放;
- 播放声音时,注意要使用speaker,而不是耳机;
- 需要RECORD_AUDIO, MODIFY_AUDIO_SETTINGS两个权限的申请;
- 根据stackoverflow上的解释,需要在16K采样率,以及AudioManager.setMode( AUdioManager.MODE_IN_COMMUNICATION)下,回音消除效果最好;
AudioTrack create的时候,一定要加Record的session id,在nexus5上实测,加和不加的效果差异非常大;(meizu Pro6不明显)
Sample Code
整理以后放到github。
其他
Android的AcousticEchoCanceler有机型适配的问题,第三方的回音消除程序有:
- WebRTC中的AEC/AECM
- speex
ref
http://silversand.blog.51cto.com/820613/166095
https://item.congci.com/-/content/android-huisheng-xiaochu-acousticechocanceler
回音消除原理解析及Android应用相关推荐
- Android 广播实现原理解析
Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...
- android speex AEC 回音消除
android speex AEC 回音消除. 有时候喇叭声音会被mic录制进去,就会产生回音数据,这是非常让人头疼的,所以去回音在音视频应用中非常重要. 现在主流的回音消除手段有android自带a ...
- 论android等平台回音消除解决方案
来源 http://www.qttaudio.com/android-aec.html 回声消除介绍 http://www.baike.com/wiki/%E5%9B%9E%E9%9F%B3%E6%B ...
- 开源 基于Android的SIP电话-----Speex 回音消除 在android 平台
我的毕业论文题目是: 基于Android的移动VoIP高清视频通话系统的设计与实现 可以去CNKI下载察看,希望对大家有帮助 搞了将近一个月的时间,将Speex的编码和解码做好了,发现还不错. 参考A ...
- Android之Butterknife原理解析
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 Butterknife是一个专注于Android系统的View注入框架, ...
- Android 插件化原理解析——Activity生命周期管理
之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...
- Android代码入侵原理解析(一)
Original 2017-05-06 付超红 滴滴安全应急响应中心 2017年初,在滴滴安全沙龙上,滴滴出行安全专家--付超红,针对App的攻与防进行了分享.会后大家对这个议题反响热烈,纷纷求详情求 ...
- Android 插件化原理解析——Hook机制之AMSPMS
在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...
- 爱加密Android APk 原理解析
转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025 爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二 ...
最新文章
- 将编译器pass添加到Relay
- Elasticsearch 在互联网公司大量真实的应用案例
- 8、Kubernetes核心技术Service
- 2019展望:超级智能崛起,人类智慧与机器智能将深度融合
- 2019.07.11
- ARM64的启动过程之(二):创建启动阶段的页表
- 阿里云天池发布完整开源数据集!实测可下!
- iOS 10 消息推送(UserNotifications)秘籍总结(二)
- Hibernate(三) - hibernate 表操作-多对多配置
- Virtual Studio 2013 每次加载程序(dll)缓慢的问题
- xamarin_如何实现声明性Xamarin表单验证
- MDK、keil复制中文注释乱码
- Android字数限制的EditText实现方案研究
- 在mathtype中怎么打出花体字母
- eyoucms相关问题总结
- 管家婆物流配货单快速实现批量拣货
- 初探直播客户端(android)技术
- 如何下载透明底校徽校名、企业logo,无需抠图
- JS实现右键拖动元素
- maxcompute-入门-环境安装