麦克风服务
概述
专为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 强制进入对话模式
- cmd : 控制命令
返回值:
- 成功返回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;
}