MI AED API


REVISION HISTORY

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

    1. OVERVIEW


    1.1. Module Description

    AED (short for Acoustic event detection) is used to detect specific sound events in the audio stream. Currently supports baby crying and Loud Sound Detection (LSD).


    1.2. Keyword

    • Sensitivity

      Sensitivity of baby cry detection. The lower the sensitivity, the longer it takes for a continuous baby cry to be reported. On the contrary, the higher the sensitivity, the easier it is to be detected. The parameter range is listed according to AedSensitivity.

    • Operating Point

      Baby crying detection operation point. Increasing the operating point will reduce the false alarm rate, and reducing the operating point will reduce the false alarm rate. This parameter needs to be in the range of [-10,10].

    • Vad Threshold

      Voice Activity Detection dBFS threshold value. Must be higher than this setting value before entering baby cry detection.

    • LSD Threshold

      Loud Sound Detection dBFS threshold. Above this set value, it is detected as loud sound.


    1.3. Note

    In order to facilitate debugging and confirm the effect of the algorithm, the user application needs to implement replacement algorithm parameter and grab audio data.


    2. API REFERENCE


    2.1. API List

    API name Features
    IaaAed_GetBufferSize Get the memory size required for Aed algorithm running
    IaaAed_Init Initialize the memory required for the Aed algorithm
    IaaAed_Config Configure Aed algorithm
    IaaAed_Run baby cry detection
    IaaAed_GetResult Get the result of baby cry detection
    IaaAed_SetSensitivity Set the sensitivity of baby cry detection
    IaaAed_SetSampleRate Set the data sampling rate for baby cry detection
    IaaAed_SetOperatingPoint Set the operation point for baby cry detection
    IaaAed_SetVadThreshold Set the Vad dBFS threshold of baby cry detection
    IaaAed_SetLsdThreshold Set the dBFS threshold for LSD
    IaaAed_RunLsd LSD algorithm processing
    IaaAed_GetLsdResult Get the results of LSD
    IaaAed_Release Quit Aed and release memory

    2.2. IaaAed_GetBufferSize

    • Features

      Get the memory size required for Aed algorithm running.

    • Syntax

      unsigned int IaaAed_GetBufferSize(void);
      
    • Return value

      Return value is the memory size required for the operation of the Aed algorithm.

    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Note

      Only the required memory size is returned. The application and release of memory need to be processed by the application.

    • Example

      Please refer to IaaAed_Run example.


    2.3. IaaAed_Init

    • Features

      Initialize the memory required for the Aed algorithm

    • Syntax

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

      Parameter name Description Input/output
      working_buf_ptr Aed algorithm initialization parameter Input
      aed_struct Aed initialization algorithm structure Input
    • Return value

      Return value Result
      Not NULL Successful
      NULL Failed
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Note

      • Whether using a baby cry detection or LSD function needs to call MI_AED_Init to initialize Aed algorithm to get the Aed algorithm handle.
    • Example

      Please refer to IaaAed_Run example.


    2.4. IaaAed_Config

    • Features

      Configure Aed algorithm.

    • Syntax

      ALGO_AED_RET IaaAed_Config(AedHandle handle);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.5. IaaAed_Run

    • Features

      Aed algorithm baby cry detection processing

    • Syntax

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

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      audio_io Baby cry detection data pointer Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Note

      • The data length of audio_input must correspond to the point_number(the number of sampling points processed by the Aed algorithm at a time) set by AedProcessStruct.
    • Example

      #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

    • Features

      Get the result of baby cry detection

    • Syntax

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

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      aed_result Baby cry detection result Output
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.7. IaaAed_SetSensitivity

    • Features

      Set the sensitivity of baby cry detection

    • Syntax

      ALGO_AED_RET IaaAed_SetSensitivity(AedHandle handle,AedSensitivity
      sensitivity);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      sensitivity Baby cry detection sensitivity Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.8. IaaAed_SetSampleRate

    • Features

      Set the data sampling rate for baby cry detection

    • Syntax

      ALGO_AED_RET IaaAed_SetSampleRate(AedHandle handle,AedSampleRate srate);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      srate Sampling rate of baby cry detection data Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.9. IaaAed_SetOperatingPoint

    • Features

      Set the operation point for baby cry detection

    • Syntax

      ALGO_AED_RET IaaAed_SetOperatingPoint(AedHandle handle,int
      operating_point);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      operating_point Baby crying detection operation point Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.10. IaaAed_SetVadThreshold

    • Features

      Set the Vad dBFS threshold of baby cry detection, enter baby cry detection when it is higher than this threshold.

    • Syntax

      ALGO_AED_RET IaaAed_SetVadThreshold(AedHandle handle,int threshold_db);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      threshold_db Vad dBFS threshold for baby crying detection Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.11. IaaAed_SetLsdThreshold

    • Features

      Set the threshold of Aed algorithm loud sound detection

    • Syntax

      ALGO_AED_RET IaaAed_SetLsdThreshold(AedHandle handle,int threshold_db);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      threshold_db LSD threshold, more than the specified dBFS it was considered loud sound. Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.12. IaaAed_RunLsd

    • Features

      Aed algorithm LSD processing

    • Syntax

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

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      audio_input LSD data pointer Input
      lsd_db Current data decibels Output
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Note

      • The data length of audio_input must correspond to the point_number(the number of sampling points processed by the Aed algorithm at a time) set by AedProcessStruct.
    • Example

      Please refer to IaaAed_Run example.


    2.13. IaaAed_GetLsdResult

    • Features

      Get the LSD results of Aed algorithm

    • Syntax

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

      Parameter name Description Input/output
      handle Aed algorithm handle Input
      lsd_result LSD results Output
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    2.14. IaaAed_Release

    • Features

      Release Aed algorithm resource

    • Syntax

      ALGO_AED_RET IaaAed_Release(AedHandle handle);
      
    • Parameters

      Parameter name Description Input/output
      handle Aed algorithm handle Input
    • Return value

      Return value Result
      0 Successful
      Non-zero Failed, refer to error code
    • Dependency

      • Header: AudioAedProcess.h

      • Library: libAED_LINUX.so/ libAED_LINUX.a

    • Example

      Please refer to IaaAed_Run example.


    3. AED DATA TYPE


    3.1. AED data type list

    Data type Definition
    AedProcessStruct Aed algorithm initialization parameter structure type
    AedHandle Aed algorithm handle type
    AedSensitivity Aed algorithm baby cry detection sensitivity type
    AedSampleRate Aed algorithm baby cry detection data sampling rate

    3.2. AedProcessStruct

    • Description

      Define Aed algorithm initialization parameter structure type

    • Definition

      typedef struct {
      
          unsigned int point_number;
      
          unsigned int channel;
      
      } AedProcessStruct;
      
    • Member

      Member name Description
      point_number Sampling points, give value according to sampling rate
      Sampling rate: sampling points
      8K:256, 16K:512, 32K:1024, 48K:1536
      channel Audio data channels
    • Related data types and interfaces

      IaaAed_Init


    3.3. AedHandle


    3.4. AedSensitivity

    • Description

      Define the sensitivity type of baby cry detection for Aed algorithm.

    • Definition

      typedef enum {
      
          AED_SEN_LOW,
      
          AED_SEN_MID,
      
          AED_SEN_HIGH
      
      } AedSensitivity;
      
    • Member

      Member name Description
      AED_SEN_LOW Low sensitivity
      AED_SEN_MID Medium sensitivity
      AED_SEN_HIGH High sensitivity
    • Related data types and interfaces

      IaaAed_SetSensitivity


    3.5. AedSampleRate

    • Description

      Define the sampling rate type of baby cry detection for Aed algorithm

    • Definition

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

      Member name Description
      AED_SRATE_8K Sampling Rate 8000Hz
      AED_SRATE_16K Sampling Rate 16000Hz
      AED_SRATE_32K Sampling Rate 32000Hz
      AED_SRATE_48K Sampling Rate 48000Hz
    • Related data types and interfaces

      IaaAed_SetSampleRate


    4. ERROR CODE

    AED API error codes are shown as follow:

    Error code Definition Description
    0x00000000 ALGO_AED_RET_SUCCESS AED runs successfully
    0x10000201 ALGO_AED_RET_INIT_ERROR AED initialization error
    0x10000202 ALGO_AED_RET_INVALID_CONFIG AED Config is invalid
    0x10000203 ALGO_AED_RET_INVALID_HANDLE AED Handle is invalid
    0x10000204 ALGO_AED_RET_INVALID_SAMPLERATE AED sampling rate is invalid
    0x10000205 ALGO_AED_RET_INVALID_POINTNUMBER AED sampling points are invalid
    0x10000206 ALGO_AED_RET_INVALID_CHANNEL AED channel number is invalid
    0x10000207 ALGO_AED_RET_INVALID_SENSITIVITY AED detection sensitivity is invalid
    0x10000208 ALGO_AED_RET_INVALID_CALLING AED API call sequence error
    0x10000209 ALGO_AED_RET_API_CONFLICT Other APIs are running