云音交互(AUI Cloud)

概述

Aui cloud是专为rtos打造的语音解决方案,提供了语音识别、语音合成、语义理解、本地语义端文本理解等接口,提供一套操作接口,用户可以根据需求实现自己的语音交互流程。

结构体定义

typedef void (*aui_nlp_cb_t)(void *data, int len, void* nlp_priv);
typedef struct _aui aui_t;
struct _aui {
    aui_ops_t ops;
    aui_cb_t cb;
    aui_audio_req_type_e audio_req_type; /*请求类型*/
};

typedef struct aui_ops {
    aui_nlp_cls_t *nlp;
    aui_tts_cls_t *tts;
} aui_ops_t;

typedef struct aui_cb  {
    aui_nlp_cb_t nlp_cb;
    aui_tts_cb_t tts_cb;
    void *nlp_priv;
    void *tts_priv;
} aui_cb_t;

typedef enum _aui_audio_req_type {
    AUI_AUDIO_REQ_TYPE_NLP = 0,  /* 请求语义识别 */
    AUI_AUDIO_REQ_TYPE_WWV       /* 请求二次唤醒确认 */
} aui_audio_req_type_e;

typedef struct aui_kws {
    aui_audio_req_type_e data_type;
    char  *data;
    size_t len;
} aui_audio_req_ack_info_t;

aui系统初始化和停止

AUI系统初始化

初始化aui系统,会分别初始化nlp、tts系统。

aui_t *aui_cloud_init(void);

停止上云流程

分别停止nlp、tts系统。

int aui_cloud_stop(aui_t *aui);

AUI去初始化

AUI系统去初始化。

int aui_cloud_deinit(aui_t *aui);

语音识别接口

启动语音数据交互

准备好语音识别的环境。

int aui_cloud_start_audio(aui_t *aui, aui_audio_req_type_e type);

type为请求类型。返回值为0表示成功。

向AUI系统输入语音数据

往语音识别服务器推送音频数据,可以是pcm数据,也可以是经过编码的音频数据,根据服务器而定。

int aui_cloud_push_audio(aui_t *aui, void *data, size_t size);

结束语音数据输入,AUI系统开始处理

告诉服务器这次语音识别结束了,可以返回处理结果了。

int aui_cloud_stop_audio(aui_t *aui);

语义解析接口

向AUI系统输入文本数据

AUI进行处理并回调NLP处理回调函数 NLP处理回调函数在初始化配置的时候被定义:aui->nlp_cb

int aui_cloud_push_text(aui_t *aui, char *text);

语音合成接口

状态回调函数定义

typedef void (* aui_tts_cb_t)(void *data, int len, void* tts_priv);

状态定义

typedef enum aui_tts_state {
    AUI_TTS_INIT     = 1,
    AUI_TTS_PLAYING  = 2,
    AUI_TTS_FINISH   = 3,
    AUI_TTS_ERROR    = 4,
} aui_tts_state_e;

启动tts系统,连接云端

int aui_cloud_start_tts(aui_t *aui);

向AUI系统输入文本数据并返回TTS结果

要求返回文本的TTS转换后的语音结果

int aui_cloud_req_tts(aui_t *aui, const char *text);

text为需要转换的文本。

停止tts系统,断开云端连接

int aui_cloud_stop_tts(aui_t *aui);

AUI系统注册适配接口

int aui_cloud_nlp_register(aui_t *aui, aui_nlp_cls_t *ops, aui_nlp_cb_t cb, void *priv);
int aui_cloud_tts_register(aui_t *aui, aui_tts_cls_t *ops, aui_tts_cb_t cb, void *priv);
int aui_cloud_nlp_unregister(aui_t *aui);
int aui_cloud_tts_unregister(aui_t *aui);
  • 参数
    • aui:aui对象指针
    • ops:nlp、tts的实现
    • cb:nlp、tts的事件回调
    • pri:nlp、tts的用户参数
  • 返回值
    • 0:成功
    • 非0:失败

操作接口对接

aui cloud中的nlp、tts分别提供了一组操作接口让用户对接。

nlp操作接口对接

typedef struct aui_nlp_cls {
    aui_cmm_cls;
    int (*push_data)(aui_t *aui, void *data, size_t size);
    int (*stop_push_data)(aui_t *aui);
    int (*push_text)(aui_t *aui, char *text);
} aui_nlp_cls_t;

用户需要实现以上这组接口的函数功能,但不是每个函数都必须实现。 对接伪代码:

static int yy_init(aui_t *aui)
{
    // TODO: init...

    return 0;
}

static int yy_start(aui_t *aui)
{
    // TODO: start...
    return 0;
}

static int yy_stop(aui_t *aui)
{
    // TODO: stop...
    return 0;
}

static int yy_push_text(aui_t *aui, char *text)
{
    // TODO: push text...
    return 0;
}

static aui_nlp_cls_t yy_nlp_cls = {
    .init = yy_init,
    .start = yy_start,
    .stop = yy_stop,
    .push_text = yy_push_text,
};

void aui_nlp_register_yy(aui_t *aui)
{
    if (aui) {
        aui->ops.nlp = &yy_nlp_cls;
    }
}

用户在相应的地方调用aui_nlp_register_yy()函数进行注册使用即可。

tts操作接口对接

typedef struct aui_tts_cls {
    aui_cmm_cls;
    int (*req_tts)(aui_t *aui, const char *text);
} aui_tts_cls_t;

用户需要实现以上这组接口的函数功能,但不是每个函数都必须实现。 对接伪代码:

static int zz_init(aui_t *aui)
{
    // TODO: init...

    return 0;
}

static int zz_start(aui_t *aui)
{
    // TODO: start...
    return 0;
}

static int zz_stop(aui_t *aui)
{
    // TODO: stop...
    return 0;
}

static int zz_req_tts(aui_t *aui, const char *text, const char *player_fifo_name)
{
    // TODO: req tts
    return 0;
}

static aui_tts_cls_t zz_tts_cls = {
    .init = zz_init,
    .start = zz_start,
    .stop = zz_stop,
    .req_tts = zz_req_tts,
};

void aui_tts_register_zz(aui_t *aui)
{
    if (aui) {
        aui->ops.tts = &zz_tts_cls;
    }
}

用户在相应的地方调用aui_tts_register_zz()函数进行注册使用即可。

示例代码

/* ai cmd */
aui_cmd_set_t g_aui_nlp_process;

/* ai engine */
aui_config_t g_aui_cfg;
aui_t        g_aui_handler;

static int aui_nlp_process1(cJSON *js, const char *json_text)
{
    /* 用户增加堆json的具体解析 */
    return 0;
}

static int aui_nlp_process2(cJSON *js, const char *json_text)
{
    /* 用户增加堆json的具体解析 */
    return 0;
}

static void aui_nlp_cb(const char *json_text)
{
    int ret;

    LOGI("NLP", "json= %s", json_text);

    /* 处理的主入口, 具体处理见初始化注册的处理函数 */
    ret = aui_nlp_process_run(&g_aui_nlp_process, json_text);

    LOGI("NLP", "nlp_process ret=%d", ret);

}

/* ai cmd init */
static int app_aui_cmd_init(void)
{
    aui_nlp_process_add(&g_aui_nlp_process, aui_nlp_process1);
    aui_nlp_process_add(&g_aui_nlp_process, aui_nlp_process2);

    return 0;
}

/* ai engine init */
static int app_aui_nlp_init(void)
{
    int ret;

    aui_config_t cfg;

    cfg.per         = "xiaoyan";
    cfg.vol         = 50;
    cfg.pit         = 50;
    cfg.spd         = 50;
    cfg.js_account  = "{\"asr\":{\"app_key\":\"1243\",\"app_id\":\"456\"},\"tts\":{\"app_key\":\"3434\",\"app_id\":\"9988\"}}";
    cfg.nlp_cb      = aui_nlp_cb;
    g_aui_handler.config  = cfg;
    g_aui_handler.context = NULL;

    aui_asr_register_aliyun(&g_aui_handler);
    aui_nlp_register_xunfei(&g_aui_handler);
    aui_tts_register_xunfei(&g_aui_handler);

    ret = aui_cloud_init(&g_aui_handler);

    if (ret != 0) {
        LOGE(TAG, "ai engine error");
    }

    return ret;
}

results matching ""

    No results matching ""