完成!对自己有点印象。
我们的产品需要回声消除功能,确定了三种可能的技术方案,
1)利用MCU检测audio out和audio in的音频信号,编写算法计算两侧声音信号的强度,根据audio out和audio in的强弱在两个通道之间进行可选的切换,实现半双工通话效果,但现在市场上都是全双工通话效果,半双工会让产品竞争力降低
(2) 使用CPU厂商的回声消除算法,实际测试经过各种可调参数的调优以及与厂商多次讨论,回声消除效果不够干净,与预期效果相去甚远。供应商的反馈是改进外壳,使MIC与扬声器尽可能隔离,但由于ID设计、音质和音量要求,没有改变外壳的空间。
(3)从网上下载webrtc、speex等开源回声消除算法,交叉编译后移植到产品中。
4)从专门从事音频算法的公司购买算法,但每个产品都需要额外的成本,这会大大降低产品的竞争力。
权衡之后,我决定深入研究使用开源算法的解决方案;
所以,我从github、gitee等网站下载了一系列回声消除代码,都是C语言和matlab语言的。
以八度音程合成两个声音,生成一段包含近端麦克风捕获语音和远端参考语音的双讲场景。
然后运行在线下载的用于回声消除的代码,分析输出音频并选择其中最有效的算法。
从结果来看,webrtc音频处理的AEC算法不好,回声消除不干净,双讲场景有明显的吞话现象。 webrtc音频处理的AEC3算法干净,但是对双讲另一端的声音抑制非常大,声音断断续续,不自然;
speex有轻微的回声,最好找一个matlab语言实现的aec算法,回声消除得很干净,双讲只有轻微的吞字现象。
然后,我使用Visual Studio编译调试WebRTC AudioProcessing AEC开源代码,参考Matlab上面的AEC算法修改代码,使用在线调试设置断点、单步运行等分析语句的值逐步变化,最终得到的数据与matlab语言的aec算法的结果完全相同最终得到的数据与matlab的aec算法的结果完全相同;
今天编译到产品中,将MIC和SPEAKER增益调整到合理值,然后实际通话测试回声消除的效果,结果出奇的好。
这样就有希望设计出一款能够达到小目标之上销量的产品。
以上是通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案的详细内容。更多信息请关注PHP中文网其他相关文章!