概述
回声消除(AEC)通过过滤麦克风输入中的扬声器输出,可以消除设备自身播放声音带来的错误识别,从而解锁可语音打断的实时对话模式,并提高普通对话模式下的唤醒打断正确率。在没有硬件回采通道的情况下,小智AI开发板需要通过软件方式实现AEC。本文将介绍代码实现方式和提升AEC效果的注意点。
效果演示视频
【面包板电路版本小智AI可打断实时对话演示-哔哩哔哩】 https://b23.tv/d9JUS8U
代码核心实现方式
完整源代码 https://github.com/78/xiaozhi-esp32/pull/462
1. 配置选项
在main/Kconfig.projbuild
文件中,为实时对话选项增加面包板子选项。
2. 虚拟参考信号
在main/audio_codecs/no_audio_codec.cc
文件中,针对面包板使用的音频处理模块,增加一路虚拟的参考信号。播放时建立缓存,读取麦克风时将播放缓存写入参考信号通道。
3. AEC模式配置
在main/audio_processing/audio_processor.cc
文件中,将AEC模式改为AEC_MODE_VOIP_HIGH_PERF
模式。
4. 采样率配置
在main/boards/bread-compact-wifi/config.h
文件中,修改播放设备采样率为16kHz。
影响AEC效果的注意点
- 数据同步:扬声器播放缓存数据和麦克风采集数据需要同步。实际测试发现,正负60ms内同步对效果影响不大。超过100ms后会清空播放缓存,参考信号置零处理。
- 信号频率:AEC需要的两路信号都需要是16kHz。麦克风采集频率已是16kHz,扬声器播放频率需从默认的24kHz改为16kHz。
- 麦克风数据处理:Inmp441和ics43434麦克风原始数据为24bit,原始版本读取I2S数据后做了12位右移处理并截断成16位,导致AEC效果受影响。应改为右移8位再整体缩放到16位。
未来优化方向
- 硬件回采效果对比:对比ESP32 S3自带ADC的硬件回采效果,虽然性能一般,但不增加硬件成本。
- 麦克风缩放处理:麦克风缩放处理会导致声音变小,影响低音量的识别效果。可考虑在afe中增加AGC自动增益控制或进行基础放大处理。
- AEC算法收敛:AEC算法需要一段时间才能稳定,在首次播放时增加音频上传屏蔽时间可降低打断错误率。
- 算法极限性能:扬声器音量大且离麦克风近时,回声消除效果不理想。可考虑使用其他开源AEC算法(如卡尔曼滤波)进行改进。
- 音质保留:音频播放变为16kHz后会影响音质。可考虑保留24kHz播放采样率,并增加一个resample到16kHz的过程。
- 噪声处理模型:目前噪声处理模型使用的是webrtc,nsnet2模型噪声处理效果明显更好,但会降低唤醒词模型的识别率(因此wake_word_detect.cc中afe关闭了噪声处理)。nsnet2是否改善服务端的语音识别效果需测试观察。