AFE(信号处理)
简介
AFE 是增强语音信号的音频信号处理模块,可以提高语音识别系统的鲁棒性或改善通信系统的信号质量。
在 AIVoice 中,AFE 算法包括以下子模块:
AEC(声学回声消除)
BF(波束成形)
NS(噪声抑制)
AGC(自动增益控制)
SSL(声源定位)
当前 SDK 中提供了以下四种麦克风阵型对应的算法库:
1mic
2mic_30mm
2mic_50mm
2mic_70mm
也可以通过定制服务提供其他麦克风阵列或性能优化。
算法框图
单麦克阵列
双麦克阵列
输入音频
单麦克阵列
输入音频的 格式 为 16kHz、16 bit、双通道(其中 1 个通道为 mic 数据,另 1 个通道为参考信号)。 若不需要 AEC 功能,则输入为单通道 mic 数据。
输入音频的 帧长 固定为 256 个点。
数据排列示意图如下:
双麦克阵列
输入音频的 格式 为 16kHz、16 bit、三通道(其中 2 个通道为 mic 数据,另 1 个通道为参考信号)。 若不需要 AEC 功能,则输入为两通道 mic 数据。
输入音频的 帧长 固定为 256 个点。
数据排列示意图如下:
备注
当不需要 AEC 功能时, 相关参数应配置为:enable_aec = false, ref_num = 0。
配置
配置参数定义
AFE 配置包括麦克风阵列、模式、子模块开关等。
typedef struct afe_config{
// AFE 通用参数
afe_mic_geometry_e mic_array; // 麦克风阵列类型。请确保选择匹配的资源库
int ref_num; // 参考通道数量,必须为 0 或 1。若 ref_num=0 则禁用 AEC
int sample_rate; // 采样率(Hz),必须为 16000
int frame_size; // 帧长(采样点数),必须为 256
afe_mode_e afe_mode; // AFE 模式,用于 ASR(语音识别)或语音通话。
bool enable_aec; // AEC(声学回声消除)模块开关
bool enable_ns; // NS(噪声抑制)模块开关
bool enable_agc; // AGC(自动增益控制)模块开关
bool enable_ssl; // SSL(声源定位)模块开关
// AEC 模块参数
afe_aec_mode_e aec_mode; // AEC 模式,传统信号处理或神经网络。当前版本不支持神经网络
int aec_enable_threshold; // AEC 的参考信号幅度阈值,取值范围[0, 100]。
// 数值越大表示使能 AEC 的最小回声量越大
bool enable_res; // AEC 残余回声抑制模块开关
afe_aec_filter_tap_e aec_cost; // 资源消耗模式,消耗越高滤波器长度越长,回声消除效果越好
afe_aec_res_aggressive_mode_e res_aggressive_mode; // AEC 强度,强度越高残余回声抑制越强,但失真也越大
// NS 模块参数
afe_ns_mode_e ns_mode; // NS 模式,信号处理或神经网络方法。神经网络方法仅支持语音通话模式
afe_ns_cost_mode_e ns_cost_mode; // 低资源模式表示单通道降噪,降噪效果比多通道差
afe_ns_aggressive_mode_e ns_aggressive_mode; // 降噪强度,强度越高稳态噪声抑制越强,但失真也越大
// AGC 模块参数
int agc_fixed_gain; // AGC 固定增益(dB),应用于 AFE 的输出,取值范围[0, 18]
bool enable_adaptive_agc; // 自适应 AGC 开关。仅支持语音通话模式。
// SSL 模块参数
float ssl_resolution; // SSL 分辨率(角度)
int ssl_min_hz; // SSL 模块的最小频率(Hz)
int ssl_max_hz; // SSL 模块的最大频率(Hz)
} afe_config_t;
如果需要修改麦克风阵列,请确保配置和 AFE 资源库做对应的修改。详情请参考 ${aivoice_lib_dir}/include/aivoice_afe_config.h
。
注意
请确保 mic_array 和 ref_num 两个参数与 AFE 输入音频匹配。
AFE 模式配置
AFE 包括两种模式,分别对应两种典型的应用场景,语音识别和语音通话。
应用场景 |
模式配置 |
模式说明 |
---|---|---|
语音识别 |
afe_mode = AFE_FOR_ASR |
当处理后数据用于语音识别或唤醒时,应配置为该模式。 该模式下,更关注语音损伤,对回声残留和底噪的容忍度较高。 |
语音通话 |
afe_mode = AFE_FOR_COM |
当用于语音通话场景时,应配置为该模式。 该模式下,更关注避免回声泄露,可接受一定语音损伤。 |
备注
语音通话模式下,外部接口支持 1mic/2mic,内部算法则仅支持 1mic。2mic 输入时内部调用 1mic 算法,使用 mic1 和 ref 路数据。
模块开关配置
AEC(回声消除)
模块说明:用于消除麦克风拾取的设备自身播放的声音,即回声。
开启条件:当设备带喇叭,有带回声场景时,应开启 AEC 模块。
模块开启前后频谱对比如下:
RES(残留回声抑制)
模块说明:为 AEC 模块中的非线性处理子模块,用于进一步抑制回声残留。 当该模块开启时回声抑制更强,但同时语音损伤也会增加。
开启条件:不同 AFE 模式下,开启条件不同。 当 AEC 模块关闭时,该模块无法单独开启。
语音识别:当喇叭播放时非线性较强,回声残留较高时,可以开启 RES 模块。
语音通话:除有特殊需求外,需要开启 RES 模块。
模块开启前后频谱对比如下:
NS(噪声抑制)
模块说明:用于抑制环境噪声,包括信号处理和神经网络方法两种模式,可通过参数
ns_mode
进行配置。信号处理方法主要对稳态噪声具有很好的抑制效果,神经网络方式则还可以处理部分非稳态噪声。 神经网络方法仅支持语音通话模式。开启条件:不同 AFE 模式下,开启条件不同。
语音识别: 当使用场景环境噪声较高或设备本身会发出较大稳态噪声,推荐开启 NS 模块。
语音通话: 除有特殊需求外,需要开启 NS 模块。
模块开启前后频谱对比如下:
AGC(自动增益控制)
模块说明:用于调整输出音频的幅值。 调整 agc_fixed_gain 参数时,应保证在语音音量最大情况下,处理后的信号不截幅。
开启条件:不同 AFE 模式下,开启条件不同。 自适应 AGC 仅支持语音通话模式。
语音识别:当输出信号幅度偏低明显影响识别或唤醒效果时,可以开启 AGC 模块,施加适当的增益。
语音通话:除有特殊需求外,需开启 AGC 模块和自适应 AGC。
SSL(声源定位)
模块说明:用于计算目标说话人的方向。 仅支持双麦克阵列,输出角度范围为 0° ~ 180°。
开启条件:当需要获取说话人方向时,可以开启 SSL 模块。 SSL 模块仅支持语音识别模式。
硬件设计要求
麦克风单体性能推荐
麦克风建议优选全向性硅麦,一致性更好。
灵敏度(sensitivity):模拟硅麦 ≥ -38dBV,数字硅麦 ≥ -26dBFS,±1.5dB
信噪比(SNR):≥ 60dB
总体谐波失真(THD):≤ 1%(1kHz)
声学过载点(AOP):≥ 120dB SPL
喇叭单体性能推荐
谐波失真(THD):额定功率下 100Hz ~ 200Hz THD≤5%,200Hz ~ 8kHz THD≤3%
麦克阵列设计建议
2 个麦克风之间间距建议保持 3.0cm ~ 7.0cm,优选 5cm。
所有麦克风收音口位于同一直线,该直线平行于水平面。
麦克风朝向可以在朝上与朝前(朝向说话人)之间任意角度。
推荐同一个阵列内的麦克应使用同一厂家的同一型号,不建议混用。
麦克阵列中,各麦克的结构推荐采用相同的设计,以保证结构设计的一致性。
整机拾音性能要求
一致性
频响一致性:自由场频谱(100Hz ~ 7kHz)响应波动 < 3dB。
相位一致性:麦克风之间的相位差(1kHz) < 10°。
气密性
外部喇叭播放,堵上麦克风与不堵上麦克风收音的音量差值(100Hz ~ 8kHz) > 15dB。
频谱无异常
不应有异常的电噪声。
不应有丢音。
频谱衰减
7.5kHz 频率以下不应有明显的衰减。
频率混叠
播放扫频信号(0Hz ~ 20kHz),16kHz 收音信号没有明显频率混叠。
整机播放回采性能要求
回采接入方式
仅支持硬回采,不支持软回采。
回采接入位置
回采位置推荐尽量靠近喇叭侧,需接在 EQ 之后,以规避音效导致的非线性。
回采增益
设备喇叭最大音量播放时,回采信号不应截幅,建议参考峰值 -3dB ~ -6dB。
时延
不要有时延。
总谐波失真
设备喇叭最大音量播放时,100Hz THD≤10%,200Hz ~ 500Hz THD≤6%,500Hz ~ 8kHz THD≤3%。
气密性
设备喇叭播放,堵上麦克风与不堵上麦克风收音的音量差值(100Hz ~ 8kHz) > 15dB。