MI AED API
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 音频数据信道数 -
注意事项
无
-
相关数据类型及接口
3.3. AedHandle¶
-
说明
定义Aed算法句柄类型。
-
定义
typedef void* 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 高灵敏度 -
注意事项
无
-
相关数据类型及接口
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 -
注意事项
无
-
相关数据类型及接口
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正在运行 |