如今,很多应用都带有语音输入,通过语音识别去搜索用户想要的结果,这样做的原因就是方便 ,然后哦我决定自己也去搞一个可以支持语音识别,合成的应用玩一下,讯飞在这方面 的技术还蛮好的,所以我使用的是讯飞的技术,接下来我们来讲讲怎么在科大讯飞里面集成我们想要的语音识别,合成效果。
开发步骤:
1.1
1.1.1:创建应用
进入AIUI平台,点击我的应用,选择我的应用-->创建新应用,填写您应用的相关信息与应用平台后,便创建好应用了。
1.1.2:配置技能
应用创建完成后,你可以点击应用,进入应用配置界面,点击勾选技能,如果我们想要做一个语音查询天气的话,我们可以勾选天气技能,如需同时使用其他技能,也可以 一起勾选
2.1. SDK集成
2.2.1 下载SDK
在AIUI平台创建完应用后,在该应用的SDK下载页面下载对应的SDK包。SDK包里包含MSC库和AIUI库,本章节仅介绍AIUI库的入门使用,MSC库包含唤醒和合成能力,如需了解MSC库,请访问MSC开发指南。
2.2.2Android平台集成步骤
导入SDK
打开Android Studio,创建一个新的工程,将下载的Android SDK压缩包中libs目录下的libaiui.so以及AIUI.jar拷贝至Android工程的libs目录下,并将SDK包中assets目录下cfg文件夹以及res目录下vad文件夹拷贝至工程中。工程结构如下图所示:
将AIUI.jar添加至工程依赖,将app module下的gradle配置文件中指定默认jniLibs目录为libs。
添加用户权限
在工程AndroidManifest.xml文件中添加如下权限,如在Android6.0及以上手机中集成使用,请动态申请所需权限。
然后还需要我们在aiui_phone.cfg文件中配置自己的appid
现在我们进入主要的代码编写阶段:
创建AIUIAgent:
SDK中提供的AIUIAgent就是和AIUI交互的桥梁。创建AIUIAgent,示例如下:
createAgent方法包含三个参数:
第一个参数类型为Context;
第二个参数类型为String,具体值是通过读取assets目录下的cfg/aiui_phone.cfg文件而获得的字符串;
第三个参数类型为AIUIListener,是AIUI事件回调监听器。
getAIUIParams()具体示例如下所示:
mAUIListener具体示例如下所示(这个AIUIListener作用就是 为了监听语音识别状态的,比如说识识别完成,识别失败等等):
AIUI在交互过程中依靠AIUIMessage向SDK传递指令,依靠AIUIEvent从SDK内部向外抛出事件回调
语音语义理解示例
发送CMD_WAKEUP消息至AIUI,使AIUI处于唤醒状态,再发送开始录音消息,使麦克风录入音频,并通过AIUIListener的回调,获取语义结果。代码示例如下
通过这个AIUIMessage向SDK传递指令,依靠AIUIEvent从SDK内部向外抛出事件回调(AIUIMessage就是发送信息给AIUI,让它做什么,AIUIevent就是对AIUI执行的结果(语音识别失败了,还是成功了)的回调),具体参见AIUI SDK消息事件
如出现20006错误,请注意下应用是否拥有录音权限。返回的语义结果,参考语义结果说明文档
最后就是结果解析了:
在AUIEventListener回调中,可以收到来自AIUI的多种消息,具体示例如下:
private AIUIListener mAIUIListener = new AIUIListener() {
@Override
public void onEvent(AIUIEvent event) {
switch (event.eventType) {
case AIUIConstant.EVENT_WAKEUP:
//唤醒事件
Log.i( TAG, "on event: "+ event.eventType );
break;
case AIUIConstant.EVENT_RESULT: {
//结果解析事件
try {
JSONObject bizParamJson = new JSONObject(event.info);
JSONObject data = bizParamJson.getJSONArray("data").getJSONObject(0);
JSONObject params = data.getJSONObject("params");
JSONObject content = data.getJSONArray("content").getJSONObject(0);
if (content.has("cnt_id")) {
String cnt_id = content.getString("cnt_id");
JSONObject cntJson = new JSONObject(new String(event.data.getByteArray(cnt_id), "utf-8"));
String sub = params.optString("sub");
if ("nlp".equals(sub)) {
// 解析得到语义结果
String resultStr = cntJson.optString("intent");
Log.i( TAG, resultStr );
}
}
} catch (Throwable e) {
e.printStackTrace();
}
} break;
case AIUIConstant.EVENT_ERROR: {
//错误事件
Log.i( TAG, "on event: "+ event.eventType );
Log.e(TAG, "错误: "+event.arg1+"\n"+event.info );
} break;
case AIUIConstant.EVENT_VAD: {
if (AIUIConstant.VAD_BOS == event.arg1) {
//语音前端点
} else if (AIUIConstant.VAD_EOS == event.arg1) {
//语音后端点
}
} break;
case AIUIConstant.EVENT_START_RECORD: {
Log.i( TAG, "on event: "+ event.eventType );
//开始录音
} break;
case AIUIConstant.EVENT_STOP_RECORD: {
Log.i( TAG, "on event: "+ event.eventType );
// 停止录音
} break;
case AIUIConstant.EVENT_STATE: {
// 状态事件
mAIUIState = event.arg1;
if (AIUIConstant.STATE_IDLE == mAIUIState) {
// 闲置状态,AIUI未开启
} else if (AIUIConstant.STATE_READY == mAIUIState) {
// AIUI已就绪,等待唤醒
} else if (AIUIConstant.STATE_WORKING == mAIUIState) {
// AIUI工作中,可进行交互
}
} break;
default:
break;
}
}
};
附件:
源码地址
参考文档:
科大讯飞AIUI平台