Speex在基于Android的楼宇可视对讲程序中的应用.docVIP

Speex在基于Android的楼宇可视对讲程序中的应用.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Speex在基于Android的楼宇可视对讲程序中的应用.doc

Speex在基于Android的楼宇可视对讲程序中的应用   摘要:本文简要介绍了在基于Android的楼宇可视对讲应用程序中声学回声消除的产生原理,并提出了通过抑制Speex来实现基于Android的回声消除。文章主要分析了Speex的源代码,讲述了以Speex为基础的jni开发。最终在Android应用层实现对Speex的合理调用,取得了良好的效果。   关键词:楼宇可视对讲 回声消除 Android Speex   中图分类号:TP393 文献标识码:A 文章编号:1007-9416(2016)06-0000-00   1 引言   在基于Android的楼宇对讲应用程序的开发过程中,会遇到的一个重要的难题:对话双方进行可视对讲时,一般会采用扬声器,近端的语音被麦克风采集并传送到远端,由远端的扬声器播出,播出的声音经空间反射,被远端的麦克风采集传回,这时说话人会听到自己的声音。这就是声学回声现象。为了保证软件产品的用户体验,必须实现回声消除(AEC)。由于AEC技术非常复杂,需要很大代价找专业公司解决。   2 Speex简介   Speex是一个开源免费跨平台的音频流处理方案,功能包括音频编码和解码,回声消、自动增益控制、噪声抑制等。本文楼宇可视对讲系统中,室内机都是使用Android操作系统。移植Speex到Android平台,提供Android应用层调用,是实现基于Android的回声消除的最经济的方法。   3 Speex的AEC模块分析   Speex移植成功后的对外函数可参看头文件“speex_echo.h”和speex/speex_preprocess.h。主要对外接口函数包括以下几个:   SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length);   回声消除控制模块初始化,返回一个初始化过的SpeexEchoState结构指针,参数frame_size是每次处理的数据块大小,参数filter_length是speex中提到的“尾长”。   void speex_echo_state_destroy(SpeexEchoState *st);   释放回声消除模块,参数st就是要释放的模块的SpeexEchoState结构。   void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out);   回声消除操作,参数rec是近端采集到的音频数据,play是远端音频数据,out是输出。   预处理操作preprocess包括回声消除预处理、噪声抑制、自动增益控制,其用法和回声消除类似。   4 基于Speex的jni驱动开发   Speex模块编译成功后,就要开始着手编写jni驱动程序了。驱动程序的源文件为speex_jni.c。编译成功后会生成“libspeex.so”动态链接库。 Speex的驱动对外接口函数有以下几个:   //声音处理模块初始化   void Java_com_peric_NetPhone_Init();   //声音处理操作,参数jrecBuf就是近端音频采集数据,jechoBuf就是远端音频数据, 每次输入的数据块大小可为4096字节   jbyteArray Java_com_peric_NetPhone_AEC(JNIEnv *env, jobject jObj, jbyteArray jrecBuf, jbyteArray jechoBuf)   //通话完成,释放声音处理模块   void Java_com_peric_NetPhone_Release();   5应用层实现回声消除   得了Speex的驱动程序,但有很多人却得不到理想的回声消除效果。Speex的基本原理就是以输入的远端音频数据为参照,消除麦克风采集到的近端音频中的远端音频部分。如果远端数据和近端数据之间的时间差过大,即AEC程序在做回声消除时参照的远端音频数据和近端音频数据之间有过大的错位,那么必然无法正确的消除回声。为此本文在应用层专门设置了4个队列和5个线程用于实现音频数据收发、播放、采集和AEC操作。线程和队列之间的关系如图1所示。   queueFarend队列存储InThread通过socket接收到的远端音频数据排到队尾,WriteThread读出并播放,当queueFarend为空时,WriteThread线程不会暂停播放,而是播放一段空白。第二个队列queuePlayback

文档评论(0)

yingzhiguo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档