麦克风服务

概述

专为IoT场景打造的麦克风服务,为用户提供本地语音识别各类事件及各类语音控制命令,从而解决传统硬件设备智能化的痛点,并提供麦克风适配层,方便用户适配不同的语音框架。

框架图

  • AP(Application Processor)主要负责应用开发,CP(coprocessor)用来通过处理主cpu的一些工作负荷来使操作提速的辅助处理器,如语音算法。
  • IPC (Inter-Process Communication,异构多核通信

适配层接口

typedef struct mic_ops
{
    int (*init)(mic_t *mic, mic_event_t mic_event); /* 模块初始化 */
    int (*deinit)(mic_t *mic);                      /* 去初始化 */
    int (*start)(mic_t *mic);                       /* 启动模块 */
    int (*stop)(mic_t *mic);                        /* 停止模块 */

    int (*pcm_data_control)(mic_t *mic, int enable);      /* 麦克风控制命令 */

    int (*set_push2talk)(mic_t *mic, int mode);                 /* push2talk */
    int (*notify_play_status)(mic_t *mic, int play_status, int delay); /*  */
} mic_ops_t;

接口定义

麦克风事件回调

typedef void (*aui_mic_evt_t)(int source, mic_event_id_t evt_id, void *data, int size);
  • 参数:

    • source : 麦克风来源
    • evt_id : 事件类型
    • data : 数据
    • size : 数据长度

      typedef enum {
        MIC_EVENT_PCM_DATA,      /* 有音频数据 */
        MIC_EVENT_SESSION_START, /* 开始对话 */
        MIC_EVENT_SESSION_STOP,  /* 停止对话 */
        MIC_EVENT_VAD,           /* 人声事件*/
        MIC_EVENT_VAD_DATA,      /* 人声识别数据 */
        MIC_EVENT_KWS_DATA,      /* 唤醒词数据 */
        MIC_EVENT_MIC_DATA,      /* 麦克风数据 */
        MIC_EVENT_REF_DATA,      /* 参考音数据 */
      } mic_event_id_t;
      

初始化麦克风服务

int aui_mic_init(utask_t *task, aui_mic_evt_t evt_cb);
  • 参数:

    • task : utask_t 指针
    • evt_cb: 用户事件回调
  • 返回值:

    • 成功返回0,失败返回-1

去初始化麦克风服务

int aui_mic_deinit(void);
  • 返回值:

    • 成功返回0,失败返回-1

启动麦克风服务

int aui_mic_start(void);
  • 返回值:

    • 成功返回0,失败返回-1

停止麦克风服务

int aui_mic_stop(void);
  • 返回值:

    • 成功返回0,失败返回-1

设置麦克风音频来源

int aui_mic_set_active(int source);
  • 参数:

    • source: 音频来源
  • 返回值:

    • 成功返回0,失败返回-1

麦克风控制命令

int aui_mic_control(mic_ctrl_cmd_t cmd);
  • 参数:

    • cmd : 控制命令
      • MIC_CTRL_START_PCM 启动音频数据传输
      • MIC_CTRL_STOP_PCM 停止音频数据传输
      • MIC_CTRL_START_VAD 启动VAD检测
      • MIC_CTRL_STOP_VAD 停止VAD检测
      • MIC_CTRL_VAD_TIMEOUT 设置对话超时时间
      • MIC_CTRL_START_SESSION 强制进入对话模式
  • 返回值:

    • 成功返回0,失败返回-1

获取麦克风状态

int aui_mic_get_state(mic_state_t *state);
  • 参数:

    • state : 麦克风状态
  • 返回值:

    • 成功返回0,失败返回-1

设置麦克风服务参数

int aui_mic_set_param(mic_param_t *param); //设置mic相关参数
int aui_mic_set_vad_param(mic_vad_param_t *param);
int aui_mic_set_aec_param(mic_aec_param_t *param);
  • 参数:

    • param: param参数
  • 返回值:

    • 成功返回0,失败返回-1
typedef struct mic_pcm_param {
    int   sample_bits;      /* 采样精度 默认16bit*/
    int   channels;         /* 采样通道数 默认1*/
    int   rate;             /* 采样率 默认16K*/
    int   sentence_time_ms; /* 有语音断句时间 */
    int   noack_time_ms;    /* 无语音超时时间 */
    int   max_time_ms;      /* 唤醒后总超时时间 */
    void *priv;             /* 预留 */
} mic_param_t;
typedef struct {
    int          vadmode;          /* VAD等级 0~3 等级逐步加强 */
    int          vadswitch;        /* 0 关闭VAD,1 打开, 2 打开起点关闭尾点 */
    int          vadfilter;        /* VAD过滤器类型, 0 关闭过滤器, 1~3 不同过滤器类型 */
    int          vadkws_strategy;  /* VAD KWS策略 */
    vad_thresh_t vadthresh_kws;    /* KWS VAD阈值 */
    vad_thresh_t vadthresh_asr;    /* ASR VAD阈值 */
    void         *priv;            /* 预留 */
} mic_vad_param_t;
typedef struct {
    int   nsmode;           /* 去噪等级参数  0~3 非线性处理等级逐步加强,其他值无非线性处理 */
    int   aecmode;          /* 回音消除等级  0~3 非线性处理等级逐步加强,其他值无非线性处理 */
    void *priv;
} mic_aec_param_t;

设置唤醒使能

int aui_mic_set_wake_enable(int en);
  • 参数en:

    • 1:使能,0:关闭
  • 返回值:

    • 成功返回0,失败返回-1

闭麦

int aui_mic_mute(int timeout);
  • 参数timeout:

    • 给定具体值即为闭麦时长,-1为永久闭麦
  • 返回值:

    • 成功返回0,失败返回-1

MIC 事件回调处理

typedef void (*mic_event_t)(void *priv, mic_event_id_t evt_id, void *data, int size);
  • 参数:
    • priv: 用于传递私有数据
    • evt_id:麦克风事件
    • data:事件参数数据指针
    • size:数据字节数

设置 MIC 的私有变量

int mic_set_privdata(void *priv);
  • priv:要设置的 MIC 的私有变量

  • 返回值:

    • 成功,返回0

获取设置的 MIC 的私有变量

void *mic_get_privdata(void);

麦克风设备注册

void voice_mic_register(void);
void mic_mind_register(void);
void mic_thead_v1_register(void);

示例代码

/* mic event*/
void mic_evt_cb(int source, mic_event_id_t evt_id, void *data, int size)
{

    switch (evt_id) {
        case MIC_EVENT_PCM_DATA:
            LOGD(TAG, "mic pcm evt");
            break;
        case MIC_EVENT_SESSION_START:
            LOGD(TAG, "mic start evt");
            break;
        case MIC_EVENT_SESSION_STOP:
            LOGD(TAG, "mic stop evt");
            break;
        default:;
    }
}

/* mic init */
int app_mic_init(utask_t *task)
{
    int ret;

    voice_mic_register();

    aui_mic_init(task, mic_evt_cb);

    ret = aui_mic_start();

    return ret;
}

results matching ""

    No results matching ""