添加第三方算法以及多算法授权流程
📎 原始文档:https://www.kdocs.cn/l/cj50IEmgc7ZC 添加第三方算法以及多算法授权流程
各个系列授权库
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/multi_auth/authrun-tmpl-list.html#sdk
多算法授权使用说明
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/multi_auth/index.html
杰理服务器使用方式
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/multi_auth/website-readme.html
秘钥使用示例
https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/private_data_auth/secure_key.html
添加算法的大致流程
- 第三方算法的基本结构

- 音乐音效算法
普通SDK
初始化位置:音频流初始化的位置
如:int a2dp_dec_start()
数据处理位置:音频解码输出的位置
如:a2dp_dec_output_handler、
结束位置:音频流close的位置
如:static int __a2dp_audio_res_close(void)
可视化SDK
先添加第三方算法节点
找到节点对应的代码文件,注意看注释
3. 可视化添加自动mute开关功放 在dac节点前添加effect dev1节点,在对应的c文件(例如用的是effect_dev1,那么对应文件就是effect_dev1_node.c)添加流程


添加代码
void *mix_out_automute_hdl;
u16 timer;
#include "audio_energy_detect.h"
void __audio_mix_out_automute_mute(u8 mute)
{
printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
if(mute){
//关功放
}
else{
//开功放
}
}
static u8 mute_ch = 0;
/* #define AUDIO_E_DET_UNMUTE (0x00) */
/* #define AUDIO_E_DET_MUTE (0x01) */
void __mix_out_automute_handler(void *prive, u8 event, u8 ch, u8 ch_total)
{
printf(">>>> ch:%d %s\n", ch, event ? ("MUTE") : ("UNMUTE"));
if(event){
mute_ch |= BIT(ch);
}
else{
mute_ch &= ~BIT(ch);
}
if(mute_ch == 0x7){
event = 1;
}
else{
event = 0;
}
__audio_mix_out_automute_mute(event);
}
void timer_deal(void *p)
{
//也可以自己判断能量大小去开关功放
u32 energy = audio_energy_detect_energy_get(p, 0xf);
printf("audio_energy_detect_energy_get %d\n", energy);
}
修改函数
static u16 node_cnt = 0;
/* 自定义算法,初始化
* sample_rate:采样率
* ch_num:通道数,单声道 1,立体声 2, 四声道 4
**/
static void audio_effect_dev1_init(struct effect_dev1_node_hdl *hdl, u32 sample_rate, u8 ch_num)
{
if (hdl->mix_out_automute_hdl) {
printf("mix_out_automute is already open !\n");
return;
}
//__audio_mix_out_automute_mute(0);//根据需求选择是否先解mute
audio_energy_detect_param e_det_param = {0};
e_det_param.mute_energy = 5;
e_det_param.unmute_energy = 10;
e_det_param.mute_time_ms = 1000;
e_det_param.unmute_time_ms = 50;
e_det_param.count_cycle_ms = 10;
e_det_param.sample_rate = sample_rate;
e_det_param.event_handler = __mix_out_automute_handler;
e_det_param.ch_total = ch_num;
e_det_param.dcc = 1;
hdl->mix_out_automute_hdl = audio_energy_detect_open(&e_det_param);
node_cnt++;
printf("audio_effect_dev1_init %d %d\n", sample_rate, ch_num);
//hdl->timer = sys_timer_add(hdl->mix_out_automute_hdl, timer_deal, 200);
}
/* 自定义算法,运行
* sample_rate:采样率
* ch_num:通道数,单声道 1,立体声 2, 四声道 4
* *data:输入输出数据同地址,位宽16bit
* data_len :输入数据长度,byte
* */
static void audio_effect_dev1_run(struct effect_dev1_node_hdl *hdl, u32 sample_rate, u8 ch_num, s16 *data, u32 data_len)
{
//do something
/* printf("effect dev1 do something here\n"); */
audio_energy_detect_run(hdl->mix_out_automute_hdl, data, data_len);
}
/* 自定义算法,关闭
**/
static void audio_effect_dev1_exit(struct effect_dev1_node_hdl *hdl)
{
//do something
if (hdl->mix_out_automute_hdl) {
audio_energy_detect_close(hdl->mix_out_automute_hdl);
hdl->mix_out_automute_hdl = NULL;
node_cnt--;
if(node_cnt == 0){
__audio_mix_out_automute_mute(1);
printf("all node close\n");
}
}
if(hdl->timer){
sys_timer_del(hdl->timer);
hdl->timer = 0;
}
}

4. 通话mic算法
普通SDK
打开宏
#define TCFG_CVP_DEVELOP_ENABLE ENABLE_THIS_MOUDLE
算法处理函数: audio_aec_demo.c
//init
int audio_aec_init(u16 sample_rate);
//uninit
void audio_aec_close(void);
//run
//700N
/*
*********************************************************************
* Audio AEC RUN
* Description: AEC数据处理核心
* Arguments : in 主mic数据
* inref 参考mic数据(双mic降噪有用)
* ref speaker参考数据
* out 数据输出
* Return : 数据运算输出长度
* Note(s) : 在这里实现AEC_core
*********************************************************************
*/
static int audio_aec_run(s16 *in, s16 *inref, s16 *ref, s16 *out, u16 points);
//701N
/*
*********************************************************************
* Audio AEC RUN
* Description: AEC数据处理核心
* Arguments : in 主mic数据
* inref 参考mic数据(双mic降噪有用)
* inref1 参考mic数据(3 mic降噪有用)
* ref speaker参考数据
* out 数据输出
* Return : 数据运算输出长度
* Note(s) : 在这里实现AEC_core
*********************************************************************
*/
static int audio_aec_run(s16 *in, s16 *inref, s16 *inref1, s16 *ref, s16 *out, u16 points);
可视化SDK

算法处理函数:audio\CVP\audio_cvp_develop.c
/*
*********************************************************************
* Audio AEC Init
* Description: 初始化AEC模块
* Arguments : init_param 初始化参数句柄
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
int audio_aec_init(struct audio_aec_init_param_t *init_param);
/*
*********************************************************************
* Audio AEC Close
* Description: 关闭AEC模块
* Arguments : None.
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_aec_close(void);
/*
*********************************************************************
* Audio AEC RUN
* Description: AEC数据处理核心
* Arguments : in 主mic数据
* inref 参考mic数据(双mic降噪有用)
* inref1 参考mic数据(3 mic降噪有用)
* ref speaker参考数据
* out 数据输出
* points 数据点数,单位short
* Return : 数据运算输出长度
* Note(s) : 在这里实现AEC_core
*********************************************************************
*/
static int audio_aec_run(s16 *in, s16 *inref, s16 *inref1, s16 *ref, s16 *out, u16 points)
- 语音识别算法
可视化SDK
添加数据流,effect dev0用来添加算法处理数据
修改代码


添加第三方语音识别算法
启动和停止
//启动
ai_voice_recoder_open(0x00100000, 0);
//停止
ai_voice_recoder_close();
DEMO:
- 添加Dirac算法(需要自行找Dirac申请算法库替换libdirac.a) 【金山文档】 AC700N_earphone_release_V1.3.7_Dirac
https://kdocs.cn/l/cfJBAHfgAKcL
更新记录:
2023年8月24日:
兼容TWS和中控,需要找Dirac要对应的算法库
添加全景声算法(需要自行找wanos申请算法库替换libWANOS.a) 【金山文档】 AC700N_earphone_release_V1.3.8_wanos
AC700N_earphone_release_V1.3.8_wanos.zip
更新记录:
2024年1月29日:
- 公版首版,需要找wanos申请算法库