MI AED API

Version 1.1


1. 概述


1.1. 算法说明

AED(Acoustic Event Detection)声学事件检测,用于在音讯码流中侦测特定的声音事件。目前支持对婴儿哭声和高分贝声音的检测(LSD)。


1.2. 关键词说明

  • Sensitivity

    婴儿哭声检测灵敏度。灵敏度越低,需要更长时间的连续婴儿哭声才会发报,反之,灵敏度越高,越容易被检测到。参数范围依照AedSensitivity列举。

  • Operating Point

    婴儿哭声检测操作点。提高操作点将会降低误报警率,减小操作点将会降低漏报率。此参数需在[-10,10]范围内。

  • Vad Threshold

    语音活性检测 (Voice activity detection)dBFS门坎值,须高于此设定值,才会进入婴儿哭声检测。

  • LSD Threshold

    高分贝声音检测(Loud Sound Detection)dBFS门坎值,高于此设定值,将被侦测为高分贝声音。


1.3. 注意

为方便调试和确认算法效果,需要用户应用自行实现替换算法参数和抓取音频数据的逻辑。


2. API 参考


2.1. 功能模块API

API名 功能
IaaAed_GetBufferSize 获取所需内存大小
IaaAed_Init 初始化Aed算法
IaaAed_Config 配置Aed算法
IaaAed_Run 执行婴儿哭声检测
IaaAed_GetResult 获取婴儿哭声检测结果
IaaAed_SetSensitivity 设置婴儿哭声检测灵敏度
IaaAed_SetSampleRate 设置婴儿哭声检测资料取样率
IaaAed_SetOperatingPoint 设置婴儿哭声检测操作点
IaaAed_SetVadThreshold 设置婴儿哭声检测VAD的dBFS阈值
IaaAed_SetLsdThreshold 设置高分贝声音检测的dBFS阈值
IaaAed_RunLsd 高分贝检测算法处理
IaaAed_GetLsdResult 获取高分贝声音检测的结果
IaaAed_Release 退出Aed并释放内存

2.2. IaaAed_GetBufferSize

  • 功能

    获取Aed算法运行所需要的内存大小。

  • 语法

    unsigned int IaaAed_GetBufferSize(void);
    
  • 形参

    参数名称 描述 输入/输出
  • 返回值

    返回值为Aed算法运行所需要的内存大小

  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。

  • 举例

    请参考IaaAed_Run 举例部分。


2.3. IaaAed_Init

  • 功能

    初始化Aed算法。

  • 语法

    AedHandle IaaAed_Init(char *working_buf_ptr, AedProcessStruct*aed_struct);
    
  • 形参

    参数名称 描述 输入/输出
    working_buf_ptr Aed算法的初始化参数指标 输入
    aed_struct Aed 初始化算法结构体 输入
  • 返回值

    返回值 结果
    非NULL 成功
    NULL 失败
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    • 无论是使用婴儿哭声检测还是高分贝检测功能,都需要调用MI_AED_Init来初始化Aed算法,获取Aed算法handle。
  • 举例

    请参考IaaAed_Run 举例部分。


2.4. IaaAed_Config

  • 功能

    配置Aed算法。

  • 语法

    ALGO_AED_RET IaaAed_Config(AedHandle handle);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.5. IaaAed_Run

  • 功能

    Aed算法婴儿哭声检测处理

  • 语法

    ALGO_AED_RET IaaAed_Run(AedHandle handle,short *audio_io);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    audio_io 用于婴儿哭声检测的数据指针 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    • audio_input的数据长度必须和AedProcessStruct所设定的point_number(Aed算法一次处理的采样点数)相对应。
  • 举例

    #include <stdio.h>  
    #include <string.h>  
    #include <stdlib.h>
    
    #include "AudioAedProcess.h"
    
    /*  0:Fixed input file  1:User input file   */  
    #define IN_PARAMETER 1
    
    int main(int argc, char *argv[])  
    {  
        AedHandle AED_HANDLE;  
        AedProcessStruct aed_params;  
        unsigned int aedBuffSize;  
        char *working_buf_ptr = NULL;  
        /************************User change section start**************************/  
        int vad_threshold_db = -40;  
        int lsd_threshold_db = -15;  
        int operating_point = -10;  
        AedSensitivity sensitivity = AED_SEN_HIGH;  
        AedSampleRate sample_rate = AED_SRATE_8K;  
        aed_params.channel = 1;  
        /************************User change section end***************************/  
        short input[1024];  
        char src_file[128] = {0};  
        FILE * fpIn;  
        ALGO_AED_RET ret = ALGO_AED_RET_SUCCESS;  
        int bcd_result;  
        int lsd_result;  
        int frm_cnt = 0;  
        int lsd_db = 0; //useless param.
    
    #if IN_PARAMETER  
        if(argc < 2)  
        {  
            printf("Please enter the correct parameters!\n");  
            return -1;  
        }  
        sscanf(argv[1], "%s", src_file);  
    #else  
        sprintf(src_file, "%s", "./AFE_8K.wav");  
    #endif
    
        switch (sample_rate)  
        {  
            case AED_SRATE_8K:  
                aed_params.point_number = 256;  
                break;  
            case AED_SRATE_16K:  
                aed_params.point_number = 512;  
                break;  
            case AED_SRATE_32K:  
                aed_params.point_number = 1024;  
                break;  
            case AED_SRATE_48K:  
                aed_params.point_number = 1535;  
                break;  
            default:  
                printf("Unsupported current sample rate !\n");  
                return -1;  
        }  
        aedBuffSize = IaaAed_GetBufferSize();  
        working_buf_ptr = (char *)malloc(aedBuffSize);  
        if(NULL == working_buf_ptr)  
        {  
            printf("malloc workingBuffer failed !\n");  
            return -1;  
        }  
        printf("malloc workingBuffer succeed !\n");  
        AED_HANDLE = IaaAed_Init(working_buf_ptr, &aed_params);  
        if(NULL == AED_HANDLE)  
        {  
            printf("IaaAed_Init faild !\n");  
            return -1;  
        }  
        printf("IaaAed_Init succeed !\n");  
        ret = IaaAed_Config(AED_HANDLE);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_Config failed !, ret = %d\n", ret);  
            return -1;  
        }  
        ret = IaaAed_SetSensitivity(AED_HANDLE, sensitivity);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_SetSensitivity failed !, ret = %d\n", ret);  
            return -1;  
        }  
        ret = IaaAed_SetSampleRate(AED_HANDLE, sample_rate);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_SetSampleRate failed !, ret = %d\n", ret);  
            return -1;  
        }  
        ret = IaaAed_SetOperatingPoint(AED_HANDLE, operating_point);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_SetOperatingPoint failed !, ret = %d\n", ret);  
            return -1;  
        }  
        ret = IaaAed_SetLsdThreshold(AED_HANDLE, lsd_threshold_db);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_SetLsdThreshold failed !, ret = %d\n", ret);  
            return -1;  
        }  
        ret = IaaAed_SetVadThreshold(AED_HANDLE, vad_threshold_db);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_SetVadThreshold failed !, ret = %d\n", ret);  
            return -1;  
        }
    
        fpIn = fopen(src_file, "rb");  
        if(NULL == fpIn)  
        {  
            printf("fopen in_file failed !\n");  
            return -1;  
        }  
        printf("fopen in_file success !\n");  
        memset(input, 0, sizeof(short) * 1024);  
    #if 1  
        /*Consider whether the input file has a header*/  
        fread(input, sizeof(char), 44, fpIn); // Remove the 44 bytes header  
    #endif  
        while(fread(input, sizeof(short), aed_params.point_number * aed_params.channel, fpIn))  
        {  
            frm_cnt++;  
            /* Run LSD process */  
            ret = IaaAed_RunLsd(AED_HANDLE, input, &lsd_db);  
            if (ALGO_AED_RET_SUCCESS != ret)  
            {  
                printf("MI_AED_RunLsd failed !, ret = %d\n", ret);  
                break;  
            }  
            ret = IaaAed_GetLsdResult(AED_HANDLE, &lsd_result);  
            if(ALGO_AED_RET_SUCCESS != ret)  
            {  
                printf("IaaAed_GetLsdResult failed !, ret = %d\n", ret);  
            }  
            if (lsd_result)  
            {  
                printf("current time = %f, loud sound detected!\n", \  
                frm_cnt * ((float)aed_params.point_number / sample_rate));  
            }  
            /* Run AED process */  
            ret = IaaAed_Run(AED_HANDLE, input);  
            if(ALGO_AED_RET_SUCCESS != ret)  
            {  
                printf("MI_AED_Run failed !,ret = %d\n", ret);  
                break;  
            }  
            ret = IaaAed_GetResult(AED_HANDLE, &bcd_result);  
            if(ALGO_AED_RET_SUCCESS != ret)  
            {  
                printf("IaaAed_GetResult failed !, ret = %d\n", ret);  
            }  
            if(bcd_result)  
            {  
                printf("Baby cried at %.3f.\n", \  
                frm_cnt * ((float)aed_params.point_number / sample_rate));  
            }  
        }  
        printf("AED end !\n");  
        ret = IaaAed_Release(AED_HANDLE);  
        if(ALGO_AED_RET_SUCCESS != ret)  
        {  
            printf("IaaAed_Release failed !, ret = %d\n", ret);  
        }  
        fclose(fpIn);  
        return 0;  
    }
    

2.6. IaaAed_GetResult

  • 功能

    获取婴儿哭声检测的结果

  • 语法

    ALGO_AED_RET IaaAed_GetResult(AedHandle handle, int *aed_result);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    aed_result 婴儿哭声检测结果 输出
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.7. IaaAed_SetSensitivity

  • 功能

    设置婴儿哭声检测的灵敏度

  • 语法

    ALGO_AED_RET IaaAed_SetSensitivity(AedHandle handle,AedSensitivity sensitivity);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    sensitivity 婴儿哭声检测的灵敏度 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.8. IaaAed_SetSampleRate

  • 功能

    设置婴儿哭声检测的资料采样率

  • 语法

    ALGO_AED_RET IaaAed_SetSampleRate(AedHandle handle,AedSampleRate srate);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    srate 婴儿哭声检测的资料取样率 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.9. IaaAed_SetOperatingPoint

  • 功能

    设置婴儿哭声检测的操作点

  • 语法

    ALGO_AED_RET IaaAed_SetOperatingPoint(AedHandle handle,int operating_point);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    operating_point 婴儿哭声检测的操作点 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.10. IaaAed_SetVadThreshold

  • 功能

    设置婴儿哭声检测的Vad dBFS阈值,高于此阀值则进入婴儿哭声检测

  • 语法

    ALGO_AED_RET IaaAed_SetVadThreshold(AedHandle handle,int threshold_db);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    threshold_db 婴儿哭声检测的Vad dBFS阈值 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.11. IaaAed_SetLsdThreshold

  • 功能

    设置Aed算法高分贝检测的阈值

  • 语法

    ALGO_AED_RET IaaAed_SetLsdThreshold(AedHandle handle,int threshold_db);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    threshold_db 高分贝检测的阈值,达到多少dBFS以上才认为是高分贝 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.12. IaaAed_RunLsd

  • 功能

    Aed算法高分贝检测处理

  • 语法

    ALGO_AED_RET IaaAed_RunLsd(AedHandle handle,short *audio_input, int *lsd_db);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    audio_input 用于高分贝检测的数据指针 输入
    lsd_db 当前资料的分贝数 输出
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    • audio_input的数据长度必须和AedProcessStruct所设定的point_number(Aed算法一次处理的采样点数)相对应。
  • 举例

    请参考IaaAed_Run举例部分。


2.13. IaaAed_GetLsdResult

  • 功能

    获取Aed算法高分贝检测的结果

  • 语法

    ALGO_AED_RET IaaAed_GetLsdResult(AedHandle handle, int* lsd_result);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
    lsd_result 高分贝声音检测结果 输出
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


2.14. IaaAed_Release

  • 功能

    释放Aed算法资源。

  • 语法

    ALGO_AED_RET IaaAed_Release(AedHandle handle);
    
  • 形参

    参数名称 描述 输入/输出
    handle Aed算法handle 输入
  • 返回值

    返回值 结果
    0 成功
    非0 失败,参照错误码
  • 依赖

    • 头文件: AudioAedProcess.h

    • 库文件: libAED_LINUX.so/ libAED_LINUX.a

  • 注意

    无。

  • 举例

    请参考IaaAed_Run 举例部分。


3. AED 数据类型


3.1. AED模块相关数据类型定义

数据类型 定义
AedProcessStruct Aed算法初始化参数结构体类型
AedHandle Aed算法句柄类型
AedSensitivity Aed算法的婴儿哭声检测灵敏度类型
AedSampleRate Aed算法的婴儿哭声检测数据取样率

3.2. AedProcessStruct

  • 说明

    定义Aed算法的初始化参数结构体类型。

  • 定义

    typedef struct {
    
        unsigned int point_number;
    
        unsigned int channel;
    
    } AedProcessStruct;
    
  • 成员

    成员名称 描述
    point_number 采样点数,需依照采样率给值 采样率:采样点数 8K:256, 16K:512, 32K:1024, 48K:1536
    channel 音频数据信道数
  • 注意事项

  • 相关数据类型及接口

    IaaAed_Init


3.3. AedHandle


3.4. AedSensitivity

  • 说明

    定义Aed算法的婴儿哭声检测灵敏度类型。

  • 定义

    typedef enum {
    
        AED_SEN_LOW,
    
        AED_SEN_MID,
    
        AED_SEN_HIGH
    
    } AedSensitivity;
    
  • 成员

    成员名称 描述
    AED_SEN_LOW 低灵敏度
    AED_SEN_MID 中灵敏度
    AED_SEN_HIGH 高灵敏度
  • 注意事项

  • 相关数据类型及接口

    IaaAed_SetSensitivity


3.5. AedSampleRate

  • 说明

    定义Aed算法的婴儿哭声检测采样率类型。

  • 定义

    typedef enum {
    
        AED_SRATE_8K = 8000,
    
        AED_SRATE_16K = 16000,
    
        AED_SRATE_32K = 32000,
    
        AED_SRATE_48K = 48000
    
    } AedSampleRate;
    
  • 成员

    成员名称 描述
    AED_SRATE_8K 采样率8000Hz
    AED_SRATE_16K 采样率16000Hz
    AED_SRATE_32K 采样率32000Hz
    AED_SRATE_48K 采样率48000Hz
  • 注意事项

  • 相关数据类型及接口

    IaaAed_SetSampleRate


4. 错误码

AED API 错误码如表所示:

表 4‑1 AED API错误码

错误码 宏定义 描述
0x00000000 ALGO_AED_RET_SUCCESS AED执行成功
0x10000201 ALGO_AED_RET_INIT_ERROR AED初始化错误
0x10000202 ALGO_AED_RET_INVALID_CONFIG AED Config无效
0x10000203 ALGO_AED_RET_INVALID_HANDLE AED Handle无效
0x10000204 ALGO_AED_RET_INVALID_SAMPLERATE AED采样率无效
0x10000205 ALGO_AED_RET_INVALID_POINTNUMBER AED采样点数无效
0x10000206 ALGO_AED_RET_INVALID_CHANNEL AED通道数无效
0x10000207 ALGO_AED_RET_INVALID_SENSITIVITY AED检测灵敏度无效
0x10000208 ALGO_AED_RET_INVALID_CALLING AED呼叫API顺序错误
0x10000209 ALGO_AED_RET_API_CONFLICT 有其他API正在运行