MI AED API


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 09/12/2020
    1.1
  • Modified API
  • 10/15/2020

    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正在运行