声音事件检测算法


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 输入音频数据的帧长(一次输入的采样点数)
  • 相关数据类型及接口

    ALGO_SED_GetInputAttr

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长度(单位:字节)
  • 相关数据类型及接口

    ALGO_SED_Run

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内存块长度
  • 相关数据类型及接口

    ALGO_SED_InitHandle

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)
  • 相关数据类型及接口

    ALGO_SED_Run

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时才触发该事件,默认值1
    lsd_threshold 巨响检测的rms阈值(单位:dB),默认值0(表示不进行巨响检测)
  • 相关数据类型及接口

    ALGO_SED_SetParams

    ALGO_SED_GetParams

3.6 SedLsdOutput_t

  • 说明

    巨响检测输出数据结构体

  • 定义

    typedef struct
    {
        MI_BOOL is_large_sound;
        MI_FLOAT max_rms;
    } SedLsdOutput_t;
    
  • 成员

    成员名称 描述
    is_large_sound 当前音频是否为巨响
    max_rms 当前音频的最大rms(单位:dB)
  • 相关数据类型及接口

    ALGO_SED_Lsd

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 无效的文件