音频检测

更新时间:2023-08-09 09:25:02下载pdf

音频检测主要分为分贝检测和哭声检测。

  • 分贝检测:是指采集音频帧使用软件算法计算音频的分贝。

  • 哭声检测:是指分析音频帧数据,判断是否有婴儿啼哭,实现看护功能。

工作原理

分贝检测

  • 采集 200 毫秒的音频数据,传递到检测算法。

  • 计算音频帧所有振幅的平均值,得到分贝值。

  • 业务层实时读取结果。建议 40~200 毫秒内读取一次,判断结果与阈值的大小,若超出阈值,触发声音报警。

哭声检测

  • 每一帧音频帧传递到哭声检测队列中。

  • 哭声检测线程,实时检测音频帧,并更新检测结果。如果检测到哭声,更新结果,并且检测线程休眠 1 秒,防止结果丢失。

  • 业务层实时读取结果。建议 40~500 毫秒内读取一次。若值为 1,则表示检测到哭声。

调用流程

音频检测

数据结构

检测类型

typedef enum {
...
    TKL_MEDIA_DETECT_TYPE_BABY_CRY,                                     // 婴儿哭声,baby cry
    TKL_MEDIA_DETECT_TYPE_DB,                                           // 声音分贝,audio decibel
...
} TKL_MEDIA_DETECT_TYPE_E;

检测结果

typedef struct {
    INT32_T val;
    CHAR_T res[8];
} TKL_AUDIO_DETECT_RESULT_T; // DETECT result

音频检测函数

开启检测

IPC 设备,暂时只支持 1 路 AI,card0 即可。

/**
* @brief audio input detect start
*
* @param[in] card: card number
* @param[in] type: detect type
*
* @return OPRT_OK on success. Others on error, please refer to tkl_error_code.h
*/
OPERATE_RET tkl_ai_detect_start(INT32_T card, TKL_MEDIA_DETECT_TYPE_E type);

获取检测结果

/**
* @brief audio detect get result
*
* @param[in] card: card number
* @param[in] type: detect type
* @param[out] presult: audio detect result
*
* @return OPRT_OK on success. Others on error, please refer to tkl_error_code.h
*/
OPERATE_RET tkl_ai_detect_get_result(INT32_T card, TKL_MEDIA_DETECT_TYPE_E type, TKL_AUDIO_DETECT_RESULT_T *presult);

停止检测

/**
* @brief audio input detect stop
*
* @param[in] card: card number
* @param[in] type: detect type
*
* @return OPRT_OK on success. Others on error, please refer to tkl_error_code.h
*/
OPERATE_RET tkl_ai_detect_stop(INT32_T card, TKL_MEDIA_DETECT_TYPE_E type);

使用示例

// 分贝检测:
     ret = tkl_ai_detect_start(0, TKL_MEDIA_DETECT_TYPE_DB);
    ...
    ret = tkl_ai_detect_get_result(0, TKL_MEDIA_DETECT_TYPE_DB, &db_value);
    ...
        // 判断分贝是否超出阈值,db_value.val 为分贝值
        if (db_value.val >= phdl->sensitivity) {
            phdl->db_flag = 1;
        } else {
            phdl->db_flag = 0;
        }
    ...
    ret = tkl_ai_detect_stop(0, TKL_MEDIA_DETECT_TYPE_DB);

// 哭声检测:
    ret = tkl_ai_detect_start(0, TKL_MEDIA_DETECT_TYPE_BABY_CRY);
    ...
    ret = tkl_ai_detect_get_result(0, TKL_MEDIA_DETECT_TYPE_BABY_CRY, (VOID*)&result);
    if (result.val == 1) {      //发现有婴儿哭声
        TYDEBUG("find baby cry\n");
        ...
    }
    ...
    ret = tkl_ai_detect_stop(0, TKL_MEDIA_DETECT_TYPE_BABY_CRY);

注意事项

不获取检测结果时,请调用 API 停止检测,节省性能。

常见问题

如何设定分贝检测的阈值?

  • 高灵敏度,阈值设置为 45,对应 60~65dB。
  • 低灵敏度,阈值设置为 65,对应 75~80dB。