通话调试流程指南
📎 原始文档:https://www.kdocs.cn/l/ck1XA2TmirZX 通话调试流程指南
1.简介
本文档主要提供一个较为通用的通话调试流程思路,其具体问题还需结合样机具体分析。
2.基本调试流程和注意事项
1.电脑软件上:以下调试步骤大部分基于Au(Adobe Audition)软件进行分析和调试,以听感结果进行效果验收。【Adobe Audition CC (该软件非杰理产品,请使用正版软件)】
2.应用工具上:通话调试过程中用于分析的数据都是来自pcm写卡工具导出通话数据。
软件程序上修改:
程序中打开PCM写卡debug操作如下:(设置为以下步骤即可直接用写卡工具去读取数据了)
【需要注意:使用写卡工具录取通话数据时,一定需要保证aec/ans/nlp/agc几个算法模块有一个是打开的,可以选择关闭aec/ans/nlp,保持AGC打开,但是设置放大上下限的增益为0,即打开了AGC模块,但也不会起效果】
pcm写卡工具使用方法:
pcm写卡工具:从以下链接下载读取 [音频数据导出使用说明.pdf] 进行学习操作。并看下方工具使用文档。
串口工具,向杰理科技深圳中心助理申请。申请后在下方的链接中下载工具并读取使用pdf。
【金山文档】 音频导出串口pcm工具 https://kdocs.cn/l/cpUgZtu355YQ
【金山文档】 PCM写卡工具使用说明 PCM写卡工具使用说明.otl
在工具使用有以下几个注意事项:
2.1 串口工具读取通话数据,默认是读取三个通道:0通道为mic采集的未经过算法处理的原始数据;1通道为DAC输出的干净的音频数据,也称通话算法的参考数据;2通道为mic采集原始数据经过算法和AGC动态增益后传到远端的数据。
2.2 串口工具读取数据需要使用内存卡来读取保存,该内存卡选用越小越好,最好是128MB或是512MB。
2.3 程序中打开pcmdebug 会占用cpu运行的部分资源,所以可能在部分客户的样机程序上打开调试,通话时会出现跑不过来的情况,比如通话时打印aec_buff full !;一旦通话时出现跑不过来的情况,那回音消除算法肯定是失效的,写卡测试抓到的数据也是错误的,所以客户需要首先排除跑不过来的情况。若出现跑不过来的情况,可先按下方修改:
- 增大时钟,将时钟主频#define CLOCK_FIX 直接设为最高。
- 关闭一些不影响通话的功能,可以关闭到只剩余通话功能。同时可以将部分程序放到ram中,比如FM代码放ram(无论fm模式是否有使能,都降fm的代码放ram!);将drc的代码放ram中。
- 检查客户样机程序是否有使能多项定时器在占用资源,可以关闭不影响通话的定时器。
2.1通话调试总体流程框图

2.2调试注意要点
2.2.1 确保原始数据无问题才能进一步调试
2.2.1.1远端
通话时远端听到较好的效果评判标准有:远端听到机器采集到近端人声的有效语言还原度以及回音问题。
所以此处关键是机器使用的mic:模具在不打开算法情况下样机mic采集到的原始数据已达到较好的有效人声还原度和信噪比,才可确保经过算法处理后对有效语言的损伤较小。
不看原始数据进行算法全开的盲调会使得无法定位到通话问题和无调试方向,是不可取的行为。
硬件上:1.首先根据麦克风规格书检查确保麦克风供电符合要求
2.第二需保证样机整体的硬件设计上,样机mic采集近端的原始数据不存在高频干扰声/电流声。
可以根据以下文档的第一大点检查测试: 【该步骤必须进行!!!】
AC695X_AC696X_AD697X 常见通话问题处理参考资料.doc
软件上:做完以上mic的硬件分析后,近端mic采集的声音传到远端,凭听感进行判断很难准确评判好坏和定位问题点,因此此处提供一个可视化的调试方法。
第一步:
普通办公室安静环境下用客户认可的人声清晰度的手机(如:iPhone13)正常通话时,确保是使用状态(如果是用手机做的参考,那就是手机放在耳边的状态),打开手机通话的录音,远端不要说话,只录制参考样机/手机的mic声音。这样就确认了参考样机/手机的标杆效果和有效语音频响曲线,或者若有对比样机也可用对比样机。(即用标杆样机/手机进行通话录音录制mic的声音)
第二步:
(耳机按照使用状态佩戴调试样机)/(音箱按照使用状态音箱摆正位置,保持距离) 进行录音(用写卡工具写卡数据)录制mic的声音,注意第一步手机录音内容和第二步样机录音的内容要保持一致,可以选择同样语调读同一段话。
第三步:
用Au软件进行调试样机和标杆效果音频的频响曲线对比,查看二者的效果差异。
AU中怎么添加频率分析窗口-百度经验 (baidu.com)
例:
用Au频率分析左上设置对数,窗口采用哈姆,FFT大小为1024下:
通过对比调试样机和iPhone13处于同一段语音的录音效果下对比,调试样机的声音大小相比iPhone13的要小了10db左右,可用Au增幅10db进行二者的拟合后进行对比。
可见二者拟合后,在最影响听感的200hz-3khz基本吻合,且调试样机整体曲线平缓,无明显陷波和尖峰,为正常效果。
且调试样机的拾音频谱在16k采样率下,频谱声纹清晰,此处声纹即上图能量谱上一条一条的纹理,纹理越清晰,随着频率的增高(纵轴向上)如果纹理还明显存在,就代表该mic采集到的人声还原度越好,有效语音越多,无明显杂音和电流声波形。
2.2.1.2近端
通话时近端喇叭出来的声音流:手机----bt---->样机(解码)------>DAC输出------>功放------>喇叭
通话时近端听到的声音评判标准有:对远端声音的还原度、喇叭播出的声音纯净度、声音大小等。【同时近端播放的声音对通话回声有着较大的影响】
1.必须确保样机整体结构稳定。用户可将产品样机放在桌面上,在通话时调节一个可接受的喇叭播放声音。此时需要保证这个声音下近端播放的声音喇叭震动不会过大,音箱整体结构不会发生较大震动(比如将样机震动的前后滑动),样机上的其他组成部件不会发生震动(螺丝钉,样机内部的一些器件,喇叭等),需要保证通话时近端播放声音不会导致样机出现明显异响。
2.确保原始数据正常时:通话时需要确保近端喇叭放出的声音没有失真,没有其他干扰噪声,如果近端喇叭播放的声音存在失真或是存在其他干扰噪声则会对回音消除算法的运行带来较大的干扰,最终导致远端听到的回音大。
3.如果听感上喇叭输出的声音存在失真(听感上有刺音),则需要先排查出失真的原因,此时需要进一步判断DAC输出的声音是否也存在失真问题,比如DAC输出的数据太大了,超出0db了,如下图,在AU软件中看到DAC输出的声音已经超出了odb,超出部分就会被截止,出现失真。DAC输出声音排查完后,按照上方的近端音频播放流程图可知,下一个则需排查功放端。

2.2.2 通话算法模块需逐步单独开启调试,一口气所有算法整体联调不可取
单独开启模块调试效果,可防止其他算法模块带来的影响,同时可以看到各个算法模块能处理的mic采集数据中的成分,并便于定位各算法模块对通话语音带来的影响,以及方便定位到通话回音产生的原因。单独开启模块调试顺序为:AEC/ENC->ANS\DNS->NLP。进行各个算法模块调试时,需要先理解各个算法模块做的事情和原理,见下一章。
3.各算法模块的原理简述

1、AEC回音消除模块
算法原理:通过计算参考数据【dac拿过来的干净音频的数据/pcm写卡通道1的数据】和主麦拾取数据【mic采集的未经过算法的原始数据/pcm写卡通道0的数据】的相干性做判断进行消除。通过计算两者的相关性,将回音部分做压制消除。
1.下方是AEC模块的参数调节选框:AEC_DT_AGGRESS原音回音追踪等级范围为1.0-5.0;即aec回音消除算法的档位设置。上面原理可知,算法是将通道0和1的数据做相干性分析,如果通道0mic采集到原始音频数据中远端过来的声音(需要被消除的部分)很大,比近端真正需要保留的人声大很多,就可能出现当前aec回音消除算法档位无法覆盖整个回音的追踪(或是理解为远端的声音大小超出了该档位的aec算法可追踪回音声音大小的阈值),所以此时需要提高等级。
2.aec回音消除算法无法处理非线性回音过大的情况。
非线性回音:指在声音传播过程中,由于反射、折射等物理现象的影响,使声音信号的强度和相位发生变化,从而样机mic采集到的声音出现误解或是失真。
1.当声音信号遇到障碍物(如墙壁、天花板等)时,会发生反射和折射,从而产生多个声源。这些声源会相互干涉和叠加(同相相加,反相相消),形成复杂的声波分布,最终形成如混响效果般的声场;最后样机mic采集到近端的声音是:混响版的喇叭声音+近端人声。这种混响般的声音属于非线性回音,aec降噪算法对其处理难度大。可见下图,下图为使用写卡工具录制到的mic采集的原始音频数据:
2.样机结构不稳定,通话播歌过程中,样机结构出现异响(如音箱整体震动,螺丝震动,其他物料震动等);或是喇叭装配结构不稳,播放音频过程中出现明显的喇叭震动,这种震动导致的失真,也是非线性失真;被mic采集到也无法被aec降噪算法消除。
2、NLP回音压制模块
NLP回音压制模块可视为一个简易版的aec回音消除模块。
NLP_ AGGRESS_FACTOR回音压制前级:主要影响的是压制时候声音频谱的范围。
NLP_MIN_SUPPRESS回音压制后级:主要影响的是在NLP_ AGGRESS_FACTOR确定好压制的频谱范围后,设置确定压制的深度。
范围和深度互相影响并非独立参数,在调节NLP,主要是保持好压制范围,去调节压制深度。可以单独打开nlp调节压制深度来看其对通话回音的影响。
3、ANS/DNS传统/神经网络单通道降噪模块
ANS为传统单通道降噪,用于消除稳态噪声,比如某些特定频率的环境噪音,对人声类型噪声无压制能力。DNS为单通道神经网络降噪,用于消除非人声类型的稳态噪声,对人声类型噪声无压制能力,其对稳态噪音压制的效果比ans要好,同时占用的资源也会更多。
1.在安静环境下:该算法部分带来的最大影响是会抹除掉人声的清音部分,如下图,所以其对人声的还原度以及自然度影响最大,若客户追求偏向人声自然度则推荐尽可能调低。ans算法的工具默认值就已经调的较低了,如果还有明显环境噪音,则可适量增大。
2.在嘈杂环境下:若样机原始数据的有效语音信噪比为负,即近端mic采集到的有效人声已经由于声音的遮掩效应被淹没在噪声(或是歌声下)之后,则会导致经过单通道降噪处理后人声部分严重缺失,表现为声音发闷。该情况可适当调低降噪效果,若无法达到想要的效果需要考虑更换信噪比更高的麦克风。
典型情况如图:
此时明显噪声的幅值已大过有效语音的幅值,信噪比=有效语音RMS-噪声RMS,此时信噪比为负值后,有效语音从500hz往上的部分已丢失。
4、AGC自动增益控制
AGC调试的是远端听到的声音,是对麦克风原始信号幅值过回音消除算法后的的二次放大或缩小(第一级放大为mic模拟增益)。AGC的效果一般可用Au进行模拟,通过AU对音频增大或减小增益:振幅统计下,若主麦原始信号平均振幅RMS总计为-35db,需要增幅到-25db,则AGC放大上限调为10db即可。
注意:AGC的放大上限与放大下限不宜差异过大,否则会带来忽大忽小的问题,其NDT_SPEECH_THR和DT_SPEECH_THR可根据样机实际情况进行调整,具体设置参数方法见下方参数意义。
【AGC模块的各个参数意义:】
- 单端模式和双端模式
通话的场景分为单双端模式:单端模式:只有近端在讲话,远端没有说话。双端模式:远端有在讲话。
SDK中的切换模式为:样机接收到远端发送过来的数据和ECHO_PRESENT_THR参数进行对比(注意数据是远端原始数据,没有经过样机DAC输出)。若远端发过来的原始数据大于ECHO_PRESENT_THR值,则主控近端通话路径进入双端模式路径。小于该值,主控近端通话路径进入单端模式路径。即判断近端走哪种模式取决于远端手机发送过来的原始数据大小,有的手机返回来的声音大点,有的小点,所以不同手机对于相同的ECHO_PRESENT_THR参数会有不同的现象。
单端模式
近端进入到单端模式中,样机mic采集的原始数据经过通话算法处理后,将走单端增益进行二次放大。


双端模式
近端进入到双端模式中,样机mic采集的原始数据经过通话算法处理后,将走双端增益进行二次放大。

2. 淡入淡出步进 通话单端/双端模式中,mic的原始数据经过通话算法处理后会依据其声音大小走放大的上下限,上下限在切换的过程中就需要对放大增益进行淡入淡出。淡入淡出效果就是从当前放大上下限开始做淡入淡出到目标放大上下限,从12dB到0dB是淡出,从0dB到12dB是淡入。
一般通话链路建立好之后,第一时间双方都是没有讲话,所以近端是处于单端模式的ndt_min_gain放大下限;假设此时ndt_min_gain是0dB,即为起始的淡入淡出增益值。随后若远端说话“喂”,近端没有说话,远端说话的原始数据大于设置的ECHO_PRESENT_THR,这时近端将切换至双端通话模式的放大下限dt_min_gain。若假设此时dt_min_gain是6dB,这个就是目标放大上下限。这个时候近端需要从单端下限0dB淡入到双端下限6dB,因为近端已进入到双端通话下限,所以淡入的步进使用DT_ FADE_IN,假设该值为1.3db;即本次淡入需要步进5次才能到目标放大增益值。每次步进的时间10ms,所以淡入淡出的步进值会影响到近端通话放大增益值的切换,如果步进时间过长,则会造成忽大忽小的情况。
4.典型问题示例
3.1 远端听到人声闷,人声不清晰
- 使用样机进行以上2.2.1的操作,测试样机mic采集的原始数据是否存在问题,若AU显示mic采集原始数据高频部分弱于手机拾音曲线---->则将样机模具拆除进行裸板测试,如裸板测试出现声音高频还是较差---->可再将裸板放置较为靠嘴的位置测试验证是否是佩戴方式导致---->若是佩戴方式导致的高频较差,可检查麦克风耦合电容是否为105,采用104的电容会使得声音中高频有所优化,降低低频分量。其次依靠EQ进行优化。
- 第二种出现人声闷问题的可能性就是ans/dns算法的压制导致的,可以开关ans/dns算法对比查看,具体的分析处理方法见上面标题2.3第三点ANS/DNS降噪算法。
3.2 通话存在回音问题分析处理
由上图可知,如果喇叭声音过大,导致喇叭播放出来的远端人声,被MIC重新采集经过算法处理和AGC动态增益后,又传回给远端手机,导致远端手机又听到自己的声音。
常见的通话回音问题原因有:
- 软件问题:1.检查是否有正确开启AEC算法模块;2.检查是否是程序修改出现的bug导致AEC算法不起作用;3.回声消除/回音压制等算法模块的压制等级参数调得不够大,或是回音处理算法模块没有打开完全。
- 硬件问题:硬件电路设计问题,比如:没有分数字地和模拟地、PCB板走线影响等原因,导致DAC线路上的音频信号直接串到MIC线路上引起的回音。
- 复杂综合问题:检查验证不是软件和硬件问题,并且按照原来的调试文档和经验,进行了各回音处理算法模块(aec/nlp/ans/agc)的综合调试,同时也有尝试提高aec/nlp回音消除和回音压制算法的强度,仍然存在回音问题的。
软件问题
1.正确更新配置工具,使能各算法模块后切记需要保存bin文件,以确保算法生效。
2.检测aec通话算法模块在程序中是否正确打开。上面的第1点是确保配置工具中正确使能各算法模块,本第2点是确保程序中是否有正确传入要打开的通话算法参数。
3.确保通话算法正确使能后,如果此时还存在较大的通话回音则需先查看通话时的程序打印,看程序运行是否存在问题。如下图,通话时抓取打印如果出现aec inbuf full的错误打印,则表示aec算法使能后,经过aec算法处理的通话数据出现堵塞,出现跑不过来的情况!
这种情况会有极大的概率导致通话出现回音,此时分析的方法如下:
- 检查系统时钟是否有提到最高,没有则将时钟主频#define CLOCK_FIX 直接设为最高。
- 提高时钟仍然会打印的话,则检查程序看哪些功能模块或客户自己创建任务或是创建的定时器比较占CPU资源,可以测试一点一点关闭一些功能模块、创建的任务和功能定时器,看情况是否会有好转。【若定位到是客户自己创建的线程任务导致通话算法跑不过来,则可尝试减小创建任务的优先级,或是增大aec通话算法线程的优先级】

- 做第2点的同时,也可以同时将部分程序放到ram中,比如FM代码放ram(无论fm模式是否有使能,都降fm的代码放ram!),和将drc的代码放ram中。
- 以上分析手法完成后,若程序通话时已不存在aec inbuf full的打印,通话回音的问题也有所好转(回音不再是完整的一句话返回,而是有明显被压制过的声音)。这就说明上面做的分析方法有作用,剩余的通话回音则需进一步定位回音原因。 【PC模式通话注意点!!!】
1.PC模式通话需要打开/参考数据变采样处理/处理,此处的参考数据即为上文所说的DAC输出的干净的音频数据,用于通话算法参考分析回音成分。
PC模式音频解码的采样率与AEC通话算法模块支持处理的数据采样率不同,所以PC通话需使能变采样
2.PC模式通话usb mic数据采集需经过aec算法,必须使能USB_MIC_AEC_EN
3.正确打开通话算法模块,usb mic通话程序默认只使能打开了ANS算法模块,此处需做修改,使能所有的通话算法模块。可以参考软件问题的上文通过打印看是否正确打开了所有通话算法。
2.usb mic通话传入的mic增益,不是配置工具上设置的mic模拟增益。usb mic增益需在程序中单独设置app_var.usb_mic_gain。
硬件问题
以上检查确保通话算法模块得到了正确的打开,再确定打开aec通话算法后,通话时是否有正确运行。
复杂综合问题
以上检查确保通话算法模块得到了正确的打开,再确定打开aec通话算法后,通话时是否有正确运行。
耳机回音一般仅开启NLP即可,音箱回音问题依据情况选择算法开启的模块。
调试方法:
- 检查硬件喇叭是否存在失真,模具是否存在明显震动,样机喇叭和麦克风隔离是否有做好(35db)。
- 软件调试:需要确保硬件上已做好了隔离,减震,以及喇叭无失真
样机整体气密性测试以及mic与腔体的密封性测试:
单独堵住主麦\副麦和不堵麦克风的差异越大越好,差异越大通话时近端mic采集到有效人声质量越高,对大音量通话场景的回音压制越好。
该数据差异一般在20db-35db,差异35db是大部分耳机的气密性要求,一个理想的气密性耳机,堵住和不堵住mic采集的数据扫频信号频谱如下图:
3.3 小腔体或密闭腔体音箱--AGC调试模拟单工通话效果
1.前文回顾:AGC属于mic采集数据流中的二级放大或缩小,只会影响远端听到的声音(详细看前文)。
小腔体音箱/大吸盘音箱:
音箱特点:喇叭腔体很小,所以很容易导致mic与喇叭腔体的隔绝性不强;或者由于空间原因,mic与喇叭腔体根本就没有做密封隔绝,这样就很容易造成通话回音的问题。一般对于这种结构的音箱,需要实现蓝牙通话的功能则推荐调试成单工通话的方式:此段主要介绍通过AGC模块调试模拟单工通话的效果,相较于软件上直接设置为单工模式AEC_SIMPLEX,AGC调节可使远端听到的效果更好。
需要打开的算法模块
使用单工通话模式就是为了解决处理通话回音的问题;所以如果已决定调试为单工通话效果,则建议在通话算法上(AEC/NLP/ANS)可只保留ANS或是DNS这种环境声降噪模块,回声问题通过AGC调试来模拟单工通话效果来解决处理。这样还能节省ram资源,减小通话时CPU使用率。新版配置工具可如下操作,也可在程序中直接修改:
旧版SDK配置工具无法直接在工具中关闭对应的通话算法,可直接在程序中修改:
【如果资源够用,也是可以保持AEC和NLP算法也打开的;只是mic采集到的原始数据会过aec和nlp处理,增加通话时cpu资源的消耗】
AGC动态调节参数修改
由于通过AGC来调节单工模式,需要修改AGC的参数突破工具中的界限,所以可直接在程序中修改需要修改的AGC参数,其他通话参数按照原流程读取配置工具即可。
本段的核心即通过AGC动态增益调节的原理,来控制通话实现单工通话的效果,整个AGC工作的流程和机制自行查看上方文档【4、AGC自动增益控制】!!!
//单端双端讲话淡入淡出步进
p->AGC_NDT_fade_in_step = 18.f;
p->AGC_NDT_fade_out_step = 18.f;
p->AGC_DT_fade_in_step = 18.f;
p->AGC_DT_fade_out_step = 18.f;
//单端讲话放大上下限及上下限阈值 ---- AGC调试单工,单端可根据样机实际情况来定
p->AGC_NDT_max_gain = 8.f;
p->AGC_NDT_min_gain = 4.f;
p->AGC_NDT_speech_thr = -50.f;
//双端讲话放大上下限及上下限阈值,远端讲话时,压制近端mic采集声音的大小,一般-60db就听不到了;
//该参数不需要太大;太大会有通话时突然没声音的感觉,也会导致压制近端mic声音恢复的时间过长,具体根据实际情况测试
p->AGC_DT_max_gain = -30.f;
p->AGC_DT_min_gain = -30.f;
p->AGC_DT_speech_thr = -40.f;
//判断走单端还是双端阈值,在AGC单工模式中,即如同AGC压制的开关,配置工具中默认参数为-70
//该参数也不用太小,太小的话,远端有一小点声音,近端的mic就被压制到完全没声音了,具体根据实际情况测试
p->AGC_echo_present_thr = -55.f;
以上程序只是某个样机案例中的修改参数,具体样机仍需根据实际情况测试再修改。
3.4 使能mic混响,同时需要通话时跑aec通话算法
当前SDK默认是使能mic混响后(哪怕不open mic混响),会固定mic采样率和dac输出采样率为44100,该固定的采样率在板机配置中可做修改。
使能mic混响后,mic每次采样的数据点数也会跟随mic采样率计算变化。

问题注意点:
我们的aec通话算法各个模块只支持处理16K的数据,并且每次处理的数据点数为256。即通话时mic采样率应为16K,通话DAC输出采样率为16K或8K(宽带通话或窄带通话)。所以这就和开mic混响后固定的mic采样率和dac输出采样率以及采样点数存在冲突。所以优化方法需区分开mic混响和开mic通话的流程。
具体优化案例:
- 首先,蓝牙开mic通话时如需跑aec通话算法,需关闭mic混响。在esco_enc_open流程中,开mic流程可以直接修改为走默认不带混响的开mic流程。

- 区分开mic通话案例【注意以下是用多个标识区分mic混响和mic通话流程的案例,还需根据客户程序做更多的区分】


以上是用标识位区分流程的案例,各标识位置1的地方,esco_mic_online可在esco_enc_open处置位。esco_call_online可在esco_dec_start处置位。