本文介绍了声加算法在BES平台的集成方法, 以BES2500YP为例子, 演示集成声加三麦ENC通话降噪算法的详细步骤
通话流程介绍
BES平台开启了通话流程大致为以下步骤:
蓝色部分为BES软件处理流程, 声加算法是处理图中红色部分流程, 红色部分可参考声加提供的bt_sco_chain_cp_soundplus.c和bt_sco_chain_thirdparty_soundplus.c, 需要先确保蓝色部分BES处理流程和数据没有问题再做声加算法集成. 如果想做客制化的修改, 也先按该文档集成算法成功, 验证算法效果以后, 再进行修改
算法目录介绍
以声加三麦通话ENC通话降噪的版本为例, 解压之后算法目录如图
各文件作用介绍
├── Makefile 算法库的编译脚本
├── SVE_ModeDef.h 语音增强算法模式配置文件
├── Soundplus_adapter.h 算法适配层头文件
├── Soundplus_adapter_ap.c 算法适配层主核调用部分
├── Soundplus_adapter_cp.c 算法适配层副核调用部分
├── SpEcCfgParaSt.c AEC&ENC算法参数配置
├── SpEcCfgParaSt.h AEC&ENC算法参数配置头文件
├── SpEcComDef.h 回声消除通用配置头文件
├── lib 算法库文件夹
│ ├── check_MD5_by_drag_the_.a_file_in_this.bat 检查文件完整性编译时打印的MD5值
│ └── libv3.0alpha_bes2600_debug.a 算法库
└── sndp_lib.h 算法库释放的API头文件
算法主要接口介绍
声加通话ENC降噪算法主要涉及四类接口的调用, 初始化函数, 回声消除处理, 通话上行处理, 反初始化函数. 主要看Soundplus_adapter适配层接口
-
算法的初始化
包含ap核心和cp核心的初始化, aecNrwFlag和rxNrwFlag分别代表aec窄带标志位和rx窄带标志位, 0代表MSBC宽带16K, 1代表CVSD窄带8K, 申请算法需要的动态内存并初始化算法引擎
-
算法反初始化
释放通话算法动态申请的内存, 0代表释放成功
-
算法AEC模块处理函数, 需要两个大小为240 * mic_num的float数组来保存AEC处理后的out和out_echos, in为麦克风原始数据, ref为参考信号原始数据, buf_len为麦克风原始数据长度, ref_len为参考信号原始数据长度.
参数:
out: 输出的线性AEC处理后的麦克风PCM数据out_echos: 输出估计回声 PCM 数据
in: 输入麦克风数据
ref: 参考信号PCM数据
buf_len: 麦克风PCM数据长度
设为240麦克风通道数, 则表示宽带通话
设为120麦克风通道数, 则表示窄带通话
ref_len: 参考PCM数据长度
设为240, 则表示宽带通话
设为120, 则表示窄带通话
AncFlag: 0 - anc off; 1 - anc on weak; 2 - anc on; 3 - anc on strong; 4 - Transparency -
算法TX模块处理函数, out为TX模块处理后的单通道数据, in传入AEC模块处理后的out数据, in_echos传入AEC模块处理后的out_echos数据, AncFlag为当前ANC模式
参数:
out: 输出麦克风PCM数据
In: 输入麦克风PCM数据
in_echos: 输入估计回声PCM数据
FAncFlag: 0-anc off; 1-anc on; 2-talk through
numsamples: 一路麦克风PCM数据的长度 -
算法RX模块处理函数
参数:
buf: 蓝牙下行PCM数据
len: 下行PCM数据长度 设为240表示宽带通话, 设为120表示窄带通话
AncFlag: 0-ancoff, 1-anc on
算法集成前的配置
正确配置才能使算法正常跑起来, 包括target里面的宏配置、麦克通道配置、麦克风数字增益配置、麦克风模拟增益配置
- 修改target.mk文件配置, 关闭所有BES自带通话算法和AUDIO_RESAMPLE(防止重采样只能采样两路, 具体视sdk定义是否需要关闭AUDIO_RESAMPLE)
- 在target.mk中打开声加相关宏开关
SPEECH_THIRDPARTY_SNDP:打开声加算法
SNDP_TX_AI_ENABLE: 使能声加算法的TX部分
SNDP_RX_AI_ENABLE: 使能声加算法的RX部分(默认关闭)
SNDP_TX_DUMP_ENABLE: 使能TX 部分pcm数据dump功能
SNDP_RX_DUMP_ENABLE: 使能RX 部分pcm数据dump功能
SNDP_TX_TIME_ENABLE: 使能TX 部分算法执行时间打印功能
SNDP_RX_TIME_ENABLE: 使能RX 部分算法执行时间打印功能
SPEECH_CODEC_CAPTURE_CHANNEL_NUM: 配置MIC通道, 比如有三路麦克风就填3
SPEECH_PROCESS_FRAME_MS: 设置每帧处理多长时间的音频数据, 默认15ms
HFP_DISABLE_NREC: 不使能NREC(NREC是手机上自带的算法)
SPEECH_TX_AEC_CODEC_REF: 使能参考信号codec
SCO_OPTIMIZE_FOR_RAM: 将overlay_text0剩余空间首地址会赋值到 sco_overlay_ram_buf
3. 配置麦克风通道的BITMAP
根据不同麦克风的数量, 配置对应数量宏下的麦克风通道, 还要正确配置偏置电压引脚(VMIC), 保证MIC供电正常
4. 前级数字麦克风增益配置
在tgt_hardware.h文件中调整数字麦克风增益CODEC_SADC_VOL, 一格大概2DB左右, 录音数据的幅值需要设置在合理的范围之内, 留给算法可操作的空间, 一般正常佩戴时幅值在-18至 -12dB之间较为合理. 可以使用dump数据查看, 数据dump方法可以参考文章: BES DUMP工具使用
5. 模拟麦克风增益配置
通话算法如果用到TalkMIC和FFMIC, 建议修改和TalkMIC和FFMIC的模拟增益一致. 如图在analog_bestxxxx.c文件中, 将DEFAULT_ANC_FF_ADC_GAIN_DB和DEFAULT_VOICE_ADC_GAIN_DB改成同样的值(根据项目实际情况判断是否需要修改)
完成以上配置了之后, 声加ENC算法移植前的工作就做好了, 下一步就可以将算法进行移植