云音交互(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;
}