声音事件检测算法
REVISION HISTORY¶
Revision No. | Description | Date |
---|---|---|
1.0 | First version | 05/30/2024 |
1.1 | add lsd | 09/13/2024 |
1. 概述¶
1.1. 算法说明¶
声音事件检测(Sound Event Detection, SED)是检测是否有对应声音事件的算法,目前支持小孩子哭声检测、咳嗽声检测、玻璃碎声检测。
model | 功能 | 类别 |
---|---|---|
sed_tbs.img | babycry检测 | negative(event_index=0); babycry(event_index=1); |
sed_tbl.img | babycry检测(大模型) | negative(event_index=0); babycry(event_index=1); |
sed_tcs.img | cough检测 | negative(event_index=0); cough(event_index=1); |
sed_tcbs.img | cough&babycry检测 | negative(event_index=0); cough(event_index=1); babycry(event_index=2); |
sed_tbgl.img | babycry&glass-shatter检测(大模型) | negative(event_index=0); babycry(event_index=1); glass(event_index=2); |
1.2. 注意¶
算法工作采样率为16kHz,输入长度为256个采样点(16ms)。
本算法使用16kHz采样率训练模型,测试时请播放采样率大于16kHz的音频。
2. API参考¶
该功能模块提供以下API:
API名称 | 功能 |
---|---|
ALGO_SED_CreateHandle | 创建句柄 |
ALGO_SED_InitHandle | 初始化句柄 |
ALGO_SED_SetParams | 设置可配置参数 |
ALGO_SED_GetInputAttr | 获取模型的输入属性信息 |
ALGO_SED_Run | 运行检测算法 |
ALGO_SED_DeinitHandle | 反初始化句柄 |
ALGO_SED_ReleaseHandle | 释放句柄 |
ALGO_SED_GetParams | 获取已配置参数 |
ALGO_SED_Lsd | 运行巨响检测算法 |
2.1 ALGO_SED_CreateHandle¶
-
功能
创建句柄
-
语法
MI_S32 ALGO_SED_CreateHandle(void **handle);
-
形参
参数名称 描述 输入/输出 handle 指向算法句柄的指针 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.2 ALGO_SED_InitHandle¶
-
功能
初始化句柄
-
语法
MI_S32 ALGO_SED_InitHandle(void *handle, const SedInit_t *init_info);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init_info 算法初始化参数,详见SedInit_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.3 ALGO_SED_SetParams¶
-
功能
设置算法的可配置参数
-
语法
MI_S32 ALGO_SED_SetParams(void *handle, const SedParams_t *params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 params 可配置参数(详见SedParams_t) 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.4 ALGO_SED_GetInputAttr¶
-
功能
获取模型的属性信息,包括模型输入分辨率以及输入数据的类型
-
语法
MI_S32 ALGO_SED_GetInputAttr(void *handle, SedInputAttr_t *input_attr);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input_attr 保存属性信息指针,详见SedInputAttr_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.5 ALGO_SED_Run¶
-
功能
运行算法,并获取输出结果
-
语法
MI_S32 ALGO_SED_Run(void *handle, const SedInput_t *input, SedOutput_t *output);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 输入的音频数据,详见SedInput_t,注意当一次性输入音频数据过长(超过2秒)时仅对最后2秒的音频进行检测 输入 SedOutput_t 输出的算法结果 输出 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.6 ALGO_SED_DeinitHandle¶
-
功能
反初始化算法
-
语法
MI_S32 ALGO_SED_DeinitHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.7 ALGO_SED_ReleaseHandle¶
-
功能
释放句柄占用资源
-
语法
MI_S32 ALGO_SED_ReleaseHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码)
2.8 ALGO_SED_GetParams¶
-
功能
获取算法目前的配置参数
-
语法
MI_S32 ALGO_SED_GetParams(void *handle, SedParams_t *params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 params 返回的参数结构体指针 输出 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
2.9 ALGO_SED_Lsd¶
-
功能
运行巨响检测算法,并获取输出结果
-
语法
MI_S32 ALGO_SED_Lsd(void *handle, const SedInput_t *input, SedLsdOutput_t* output);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 输入的音频数据,详见SedInput_t,注意当一次性输入音频数据过长(超过2秒)时仅对最后2秒的音频进行检测 输入 SedLsdOutput_t 巨响检测的输出结果 输出 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
-
头文件:sgs_sed_api.h
-
库文件:libsgsalgo_sed.a / libsgsalgo_sed.so
-
3. 结构体说明¶
算法相关结构体定义如下:
数据类型 | 定义 |
---|---|
SedInputAttr_t | 算法输入信息结构体 |
SedInput_t | 算法输入音频数据结构体 |
SedInit_t | 算法初始化参数结构体 |
SedOutput_t | 算法输出结构体 |
SedParams_t | 算法可配置参数结构体 |
SedLsdOutput_t | 巨响检测输出数据结构体 |
3.1 SedInputAttr_t¶
-
说明
模型输入数据的相关信息
-
定义
typedef struct { MI_S32 frame_len; } SedInputAttr_t;
-
成员
成员名称 描述 frame_len 输入音频数据的帧长(一次输入的采样点数) -
相关数据类型及接口
3.2 SedInput_t¶
-
说明
算法输入数据结构体
-
定义
typedef struct { MI_S32 sample_rate; MI_S32 bit_width; void *buffer; MI_U32 buffer_len; } SedInput_t;
-
成员
成员名称 描述 sample_rate 输入音频的采样率 bit_width 输入音频的量化bit数 buffer 输入音频的buffer指针 buffer_len 输入音频的buffer长度(单位:字节) -
相关数据类型及接口
3.3 SedInit_t¶
-
说明
算法初始化参数结构体
-
定义
typedef struct { char ipu_firmware_path[MAX_SED_STRLEN]; // ipu_firmware.bin path char model_path[MAX_SED_STRLEN]; // model path MI_BOOL create_device; // set false to create ipu device outside algo lib MI_BOOL destroy_device; // set false to destroy ipu device outside algo lib void *model_buffer; // set it when load model from memory MI_U32 model_buffer_len; // set it when load model from memory } SedInit_t;
-
成员
成员名称 描述 ipu_firmware_path ipu_firmware_path路径 model_path 模型文件路径 create_device 是否在算法库内进行IPUDevice的创建,默认为true,即在库内创建,在需同时调用算法库时可设置为false并在外部手动创建IPUDevice destroy_device 是否在算法库内进行IPUDevice的销毁,默认为true,即在库内销毁,在需同时调用算法库时可设置为false并在外部手动销毁IPUDevice model_buffer 使用model_path时请设置为NULL,将model_path置空并且设置model_buffer和model_buffer_len可用于从模型内存块初始化算法 model_buffer_len 使用model_path时请设置为0,设置model_buffer内存块长度 -
相关数据类型及接口
3.4 SedOutput_t¶
-
说明
算法输出数据结构体
-
定义
typedef struct { MI_BOOL is_valid; MI_S32 event_index; MI_FLOAT event_score; } SedOutput_t;
-
成员
成员名称 描述 is_valid 是否为有效输出结果(算法会按照一定间隔而非而每次调用均运行,is_valid为true时说明算法运行且返回结果是有效的) event_index 输出音频事件的类别(event_index和事件类型的对应关系与模型相关,详见算法说明) event_score 输出音频事件的分值(取值0.0~1.0) -
相关数据类型及接口
3.5 SedParams_t¶
-
说明
算法可配置参数
-
定义
typedef struct { MI_S32 smooth_length; // output result smooth len; default 0 MI_FLOAT vad_threshold; // vad threshold; default -45 MI_FLOAT event_threshold[MAX_SED_EVENT_NUM]; // event score threshold; default [0.5, 0.5] MI_U32 min_trigger_times[MAX_SED_EVENT_NUM]; // return a positive event when detected more than min_trigger_times, default 1 MI_FLOAT lsd_threshold; // large sound detection rms threshold(unit: dB) default 0 means lsd is disabled } SedParams_t;
-
成员
成员名称 描述 smooth_length 输出结果的平滑窗口长度,越长输出结果的变化越稳定,越短输出结果的变化越灵敏,默认值为0,即不对结果做平滑 vad_threshold 声音事件检测VAD阈值,(取值-50.0~0.0)默认值-45.0 event_threshold 音频事件的score阈值,默认值0.5(有前端算法建议阈值为0.35,无前端算法建议阈值为0.7) min_trigger_times 音频事件的最小触发次数,仅当长度为 smooth_length
的事件窗口score超过阈值的次数大于等于min_trigger_times
时才触发该事件,默认值1lsd_threshold 巨响检测的rms阈值(单位:dB),默认值0(表示不进行巨响检测) -
相关数据类型及接口
3.6 SedLsdOutput_t¶
-
说明
巨响检测输出数据结构体
-
定义
typedef struct { MI_BOOL is_large_sound; MI_FLOAT max_rms; } SedLsdOutput_t;
-
成员
成员名称 描述 is_large_sound 当前音频是否为巨响 max_rms 当前音频的最大rms(单位:dB) -
相关数据类型及接口
4. 错误码¶
错误码 | 数值 | 描述 |
---|---|---|
E_ALGO_SUCCESS | 0 | 操作成功 |
E_ALGO_HANDLE_NULL | 1 | 算法句柄为空 |
E_ALGO_INVALID_PARAM | 2 | 无效的输入参数 |
E_ALGO_DEVICE_FAULT | 3 | 硬件错误 |
E_ALGO_LOADMODEL_FAIL | 4 | 加载模型失败 |
E_ALGO_INIT_FAIL | 5 | 算法初始化失败 |
E_ALGO_NOT_INIT | 6 | 算法尚未初始化 |
E_ALGO_INPUT_DATA_NULL | 7 | 算法输入数据为空 |
E_ALGO_INVALID_INPUT_SIZE | 8 | 无效的算法输入数据维度 |
E_ALGO_INVALID_LICENSE | 9 | 无效的license许可 |
E_ALGO_MEMORY_OUT | 10 | 内存不足 |
E_ALGO_FILEIO_ERROR | 11 | 文件读写操作错误 |
E_ALGO_INVALID_OUTPUT_SIZE | 12 | 无效的算法输出数据维度 |
E_ALGO_INVALID_DECODE_MODE | 13 | 无效的解码模式 |
E_ALGO_MODEL_INVOKE_ERROR | 14 | 模型invoke错误 |
E_ALGO_INVALID_FILE | 15 | 无效的文件 |