1 /* Copyright (C) RK 2 Written by Ryne 3 Date : 20221214 v1.2.1*/ 4 5 6 #ifndef RKAUDIO_SED_H 7 #define RKAUDIO_SED_H 8 9 #include <stdlib.h> 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 #define JUMP_FRAME 20 16 17 typedef struct RKSEDAGCParam_ 18 { 19 /* 新版AGC参数 */ 20 float attack_time; /* 触发时间,即AGC增益下降所需要的时间 */ 21 float release_time; /* 施放时间,即AGC增益上升所需要的时间 */ 22 float max_gain; /* 最大增益,同时也是线性段增益,单位:dB */ 23 float max_peak; /* 经AGC处理后,输出语音的最大能量,范围:单位:dB */ 24 float fRth0; /* 扩张段结束能量dB阈值,同时也是线性段开始阈值 */ 25 float fRk0; /* 扩张段斜率 */ 26 float fRth1; /* 压缩段起始能量dB阈值,同时也是线性段结束阈值 */ 27 /* 无效参数 */ 28 int fs; /* 数据采样率 */ 29 int frmlen; /* 处理帧长 */ 30 float attenuate_time; /* 噪声衰减时间,即噪声段增益衰减到1所需的时间 */ 31 float fRth2; /* 压缩段起始能量dB阈值 */ 32 float fRk1; /* 扩张段斜率 */ 33 float fRk2; /* 扩张段斜率 */ 34 float fLineGainDb; /* 线性段提升dB数 */ 35 int swSmL0; /* 扩张段时域平滑点数 */ 36 int swSmL1; /* 线性段时域平滑点数 */ 37 int swSmL2; /* 压缩段时域平滑点数 */ 38 } RKSEDAGCParam; 39 rkaudio_sedagc_param_init()40 inline static RKSEDAGCParam* rkaudio_sedagc_param_init() 41 { 42 RKSEDAGCParam* param = (RKSEDAGCParam*)malloc(sizeof(RKSEDAGCParam)); 43 /* 新版AGC参数 */ 44 param->attack_time = 100.0; /* 触发时间,即AGC增益上升所需要的时间 */ 45 param->release_time = 200.0; /* 施放时间,即AGC增益下降所需要的时间 */ 46 param->max_gain = 15.0; /* 最大增益,同时也是线性段增益,单位:dB */ 47 param->max_peak = -3.0; /* 经AGC处理后,输出语音的最大能量,范围:单位:dB */ 48 param->fRk0 = 2; /* 扩张段斜率 */ 49 param->fRth2 = -25; /* 压缩段起始能量dB阈值,同时也是线性段结束阈值,注意 fRth2 + max_gain < max_peak */ 50 param->fRth1 = -45; /* 扩张段结束能量dB阈值,同时也是线性段开始阈值 */ 51 param->fRth0 = -70; /* 噪声门阈值 */ 52 /* 无效参数 */ 53 param->fs = 16000; /* 数据采样率 */ 54 param->frmlen = 256; /* 处理帧长 */ 55 param->attenuate_time = 1000; /* 噪声衰减时间,即噪声段增益衰减到1所需的时间 */ 56 param->fRk1 = 0.8; /* 扩张段斜率 */ 57 param->fRk2 = 0.4; /* 扩张段斜率 */ 58 param->fLineGainDb = -25.0f; /* 低于该值,起始的attenuate_time(ms)内不做增益 */ 59 param->swSmL0 = 40; /* 扩张段时域平滑点数 */ 60 param->swSmL1 = 80; /* 线性段时域平滑点数 */ 61 param->swSmL2 = 80; /* 压缩段时域平滑点数 */ 62 return param; 63 } 64 65 typedef struct SedAedParam_ 66 { 67 float snr_db; // 信噪比大于snr输出1,单位为db 68 float lsd_db; // 响度大于db值输出1, 最高为0db 69 int policy; // vad灵敏度,0—>2, 灵敏度等级提升。默认为1. 70 } SedAedParam; 71 72 // 声音事件检测 73 typedef struct SedParam_ 74 { 75 int frm_len; // 统计帧长 建议长度:110-150 76 int nclass; // 类别数目 77 int babycry_decision_len; // 哭声确认帧长 78 int buzzer_decision_len; //蜂鸣器确认帧长 79 int glassbreaking_decision_len; //玻璃破碎声确认帧长 80 } SedParam; 81 82 typedef struct RKAudioSedRes_ 83 { 84 int snr_res; 85 int lsd_res; 86 int bcd_res; 87 int buz_res; 88 int gbs_res; 89 } RKAudioSedRes; 90 91 typedef enum RKAudioSedEnable_ 92 { 93 EN_AGC = 1 << 0, 94 EN_AED = 1 << 1, 95 EN_SED = 1 << 2, 96 } RKAudioSedEnable; 97 98 typedef struct RKAudioSedParam_ 99 { 100 int model_en; 101 RKSEDAGCParam* agc_param; 102 SedAedParam *aed_param; 103 SedParam* sed_param; 104 } RKAudioSedParam; 105 rkaudio_sed_param_aed()106 static SedAedParam *rkaudio_sed_param_aed() 107 { 108 SedAedParam* param = (SedAedParam *)calloc(sizeof(SedAedParam), 1); 109 param->snr_db = 10; 110 param->lsd_db = -35; 111 param->policy = 1; 112 return param; 113 } 114 rkaudio_sed_param()115 static SedParam* rkaudio_sed_param() 116 { 117 SedParam* param = (SedParam*)malloc(sizeof(SedParam)); 118 param->frm_len = 125; 119 param->nclass = 3; 120 param->babycry_decision_len = 100; 121 param->buzzer_decision_len = 100; 122 param->glassbreaking_decision_len = 30; 123 return param; 124 } 125 rkaudio_sed_param_init()126 inline static RKAudioSedParam *rkaudio_sed_param_init() 127 { 128 RKAudioSedParam *param = (RKAudioSedParam *)calloc(sizeof(RKAudioSedParam), 1); 129 130 param->model_en = EN_AGC | EN_AED | EN_SED ; 131 param->agc_param = rkaudio_sedagc_param_init(); 132 param->aed_param = rkaudio_sed_param_aed(); 133 param->sed_param = rkaudio_sed_param(); 134 return param; 135 } 136 rkaudio_sed_param_destroy(RKAudioSedParam * param)137 inline static void rkaudio_sed_param_destroy(RKAudioSedParam *param) 138 { 139 if (param == NULL) 140 return; 141 if (param->agc_param) 142 { 143 free(param->agc_param); 144 param->agc_param = NULL; 145 } 146 if (param->aed_param) 147 { 148 free(param->aed_param); 149 param->aed_param = NULL; 150 } 151 if (param->sed_param) 152 { 153 free(param->sed_param); 154 param->sed_param = NULL; 155 } 156 free(param); 157 } 158 159 void *rkaudio_sed_init(int fs, int bit, int chan, RKAudioSedParam *param); 160 char rkaudio_sed_init_res(void* st_); 161 void rkaudio_sed_destroy(void *st_); 162 int rkaudio_sed_process(void *st_, short *in, int in_size, RKAudioSedRes *res); 163 float rkaudio_sed_lsd_db(void *st_); 164 165 #ifdef __cplusplus 166 } 167 #endif 168 169 /** @}*/ 170 #endif 171