热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转载_音频处理之回声消除及调试经验

本文讲的回声(Echo)是指语音通信时产生的回声,即打电话时自己讲的话又从对方传回来被自己听到。回声在固话和手机上都有,小时还可以忍受,大时严重影响沟通交流,它是影响语音质量的重要

本文讲的回声(Echo)是指语音通信时产生的回声,即打电话时自己讲的话又从对方传回来被自己听到。回声在固话和手机上都有,小时还可以忍受,大时严重影响沟通交流,它是影响语音质量的重要因素之一。可能有的朋友要问了,为什么我打电话时没有听见自己的回声,那是因为市面上的成熟产品回声都被消除掉了。回声分为线路回声(line echo)和声学回声(acoustic echo),线路回声主要存在于固话中,是由于2-4线转换引入的回声,声学回声是由于空间声学反射产生的回声 。回声消除(Echo canceller, EC)是语音前处理的重要环节,下面主要讲其基本原理和调试中的一些经验。

 

1,基本原理

1)自适应滤波器和自适应算法

一般滤波器的系数是固定的,而自适应滤波器的系数是变化的,是依据自适应算法来调整滤波器系数的。自适应滤波器的结构采用FIR或IIR均可,由于IIR存在稳定性问题,因此一般采用FIR。下图是自适应滤波器的一般结构:

                                                                 《转载_音频处理之回声消除及调试经验》

上图中,x(k)为输入信号,y(k)为输出信号,d(k)为期望信号,e(k)是d(k)和y(k)的误差信号。自适应滤波器的滤波器系数受误差信号e(k)控制,根据e(k)的值和自适应算法自动调整。

自适应算法一般采用LMS(least mean square,最小均方)算法及其变种(如NLMS算法)。LMS算法是随机梯度算法族中的一员。具体可以看相关的文章。

 

2)回声消除基本原理。

下图是回声消除基本原理的框图:

                                                           《转载_音频处理之回声消除及调试经验》       

处理过程如下:

a)     算近端远端语音数据的energy,确定双方是silent还是talk。

b)    远端输入经过自适应FIR滤波器后就得到了近似于近端输入的数据,并与近端输入相减后得到了误差e。误差e作为自适应LMS算法的输入在需要的时候去更新自适应FIR滤波器的系数给后面远端数据处理用。在需要的时候是指远端talk近端silent的情况,其他情况(比如double silent / double talk)下不需要更新FIR滤波器的系数。

c)     误差e同时也会经过NLP(非线性处理)后产生舒适噪声送给对方。

 

2,调试

EC相对较难,要做的很好很不容易。在webRTC开源前主要是大公司和专业的算法公司有好的实现方案,一般公司要想产品里有EC就去买算法库。webRTC开源后一些核心的算法(包括AEC/ANS/AGC等)也随之开源,这样众公司开始用webRTC里的算法,尤其是互联网公司,AEC等算法基本都是用的webRTC的。

本人有两次EC的调试经历。第一次是在芯片公司,做语音解决方案。从公司的算法部门拿来了回声消除实现,把它用到解决方案中。另一次是在移动互联网公司,做实时语音通信类APP,要把webRTC的AEC用到APP中。第一次花的时间较多,要学习原理,看算法代码,做应用程序验证算法并且要修改系数,在产品上调试等。第二次有了第一次的基础再加上webRTC封装的较好从而花的时间较短。个人觉得对EC零基础但已有EC算法代码的基础上去调试主要有如下几步:

1)学习回声消除的基本原理,涉及信号处理知识(从固定系数滤波器到系数自适应滤波器)和高等数学知识(梯度)等。因为不是做算法,掌握基本的就可以了。如果基础扎实,当然搞得越明白越好了。

2)看算法代码。如果有实现的设计文档那是最好了,好多算法实现有技巧,有设计文档的话能更好的帮助理解代码。没有只能硬着头皮啃了。刚开始可能有些看不懂,多看几遍,也许每一次都会多懂一些。

3)做个应用程序验证算法。这个应用程序输入是近端和远端的PCM文件,把EC的输出写进一个PCM文件里,看处理效果如何。这里面也可以分几小步:

a)     设latency为零,近端和远端的PCM文件相同,理论上输出是全零数据。如果是这样,恭喜你选择的算法有一个好的base。如果不是那就需要去调算法里的一些系数了,这也许要调好多次,最终调试结果要是算法输出基本听不见回声。

b)    设一定的latency,近端的PCM和远端的数据一样,但是近端的PCM数据相对远端的有一定的delay,这个值跟设定的latency值是一样的,这时理论上输出还是全零数据。

c)    获取实际产品上的近端和远端PCM数据,可以近似得到近端和远端的latency。把这几个作为输入,看算法输出,也要基本听不见回声。这步调好后算法基本上就可以用了。

4)  在具体硬件平台上去调。每个硬件平台上的latency都是不一样的。在芯片公司时有demo板,每个客户也有他们的电路板,硬件平台相对不多一个个获取近远端PCM数据调好latency就可以了。在移动互联网公司做APP时,手机类型众多,用上面方法太累,于是在UI上做了一个滑动条去配置latency,让测试人员去测试找到一个相对较好的latency,然后放在配置文件里保存下来,以后这款手机就用这个latency值了。

经过上面几步后在真正产品上的EC调试就算结束了。


推荐阅读
  • 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
    前言最近看到很多应届生晒offer,稍有名气点的公司给出的价格都是一年30多W或者月薪20几k,相比之下工作几年的自己薪资确实很寒酸.根据我自己找工作经历,二线城市一般小公司招聘 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 验证识别之你讲武德了吗?
    说说那个试用版的打包软件,既然是试用版肯定要加个试用期限,但是里面的pb模型并没有放识别率最好的那个,而是放了一个识别率中等 ... [详细]
  • 推荐 :以数据驱动的方式讲故事
    直觉vs数据首先,你有思考过一个问题吗?当你的直觉与你所掌握的数据矛盾的时候,你是听从于直觉还是相信你所掌握的数据呢?201 ... [详细]
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • vlfilecopy(findfile(vllist>string(10811110311146103105102)))(vll的简单介绍
    本文目录一览:1、一段lisp代码求解释2、运 ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
author-avatar
mobiledu2502927445
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有