集成SDK
近期使用科大讯飞AIUI开发一款智能语音灯控项目,因此在这记录一下我的心得,写的不好忘各位大佬见谅,不喜勿喷呐,下面就像大家介绍一下我的使用心得,注册讯飞账号,添加项目这些个常规操作就不用多说了吧,直接进入正题:
AIUI主要的技能分为两种:开放技能和自定义技能,开放技能包含的内容有天气,计算,百科,笑话等通用技能,自定义技能则是开发者自己定义的Intent(意图),等会会详细介绍怎么自定义自己的意图。开放技能只要在添加就可以了,如图所示:
接下来是自定义技能的使用,进入到我的技能一栏,选择创建技能,以下是我创建好的技能列表
开放技能中没有想要的功能时需要自己实现自定义技能,通过语义理解提取到关键字,在“后处理”服务器去执行一些操作,比如在自定义技能中,设置语料“开灯”,当用户说“请帮我打开灯”之后,AIUI会触发这个自定义技能,其中的query就是“开灯”,后处理服务收到这个语义后,可以做一些操作,返回数据;
{
-
"semantic": [-
{-
"slots": [-
{}
此时就能通过返回的数据中的intent和normvalue来判断是否开灯,其他自己定义的语义同理。此时把后台的东西差不多都配置好了,就可以下载SDK了,AIUI开放平台首页底部找到sdk下载中心,选择自己要下载的sdk。
下载完毕之后就是导入到项目中,解压下载的包,把对应的lib文件夹中的文件分别导入到自己的项目中,此时可能会出现libaiui.so找不到,别方兄弟,你直接如下操作:
把-v7a中的libaiui.so复制一份到armeabi.so中,此时也许还会出现一个问题,编译so库是报错,那你就要来这个操作了,在app的build中添加一下代码:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
此时不要惊喜,你还需要配置你的APPID,在你的清单文件中和Application配置你的APPID,注意必须要保持一致APPID,不然会报出错误码10407,如需查看错误码,可以到此查看,这里面列举了会出现的一些错误码和详细说明
再从新编译一遍,此时就导入SDK成功了,这里只是介绍了怎么使用自定义后台意图和导入SDK,下面就要对其的使用了。
AIUI的使用
由于AIUI文档介绍的少之又少,所以本人踩的坑也比较多,开发AIUI特别要注意细节,很多小的细节要处理好,不然会爆出很多莫名其妙的错误。
创建代理AiuiAgent,因为在语音识别前,AIUI会检查代理是否创建成功,如果此时出现错误码,这时你要检查你的APPID是否保持了一致,成功之后才会调用识别功能。
/**
* 检查代理是否创建成功
*/
private boolean checkAIUIAgent() {
if (null == mAIUIAgent) {
Log.e(TAG, "create aiui agent");
mAIUIAgent = AIUIAgent.createAgent(this, getAIUIParams(), mAIUIListener);
AIUIMessage startMsg = new AIUIMessage(AIUIConstant.CMD_START, 0, 0, null, null);
mAIUIAgent.sendMessage(startMsg);
updateLexicon();// 更新词典,语音拼音符合提交的文字的拼音,那么直接匹配为词典里的词语
}
if (null == mAIUIAgent) {
Log.e("tag", "HAO的方法:【checkAIUIAgent】: " + "创建 AIUI Agent 失败!");
}
return null != mAIUIAgent;
}
识别语音和语义数据则最主要在AIUIListener中操作,不多说,直接上代码:
/**
* 语音识别和语义数据监听器
*/
private class AIUIResultListener implements AIUIListener {
@Override
public void onEvent(AIUIEvent event) {
switch (event.eventType) {
case AIUIConstant.EVENT_WAKEUP:
Log.e(TAG, "on event: 进入识别状态" + event.eventType);
break;
case AIUIConstant.EVENT_RESULT: {
Log.e(TAG, "on event: " + event.eventType);
}
} catch (Throwable e) {
e.printStackTrace();
Log.e("tag", "【AIRecognizeServer】类的方法:【onEvent】:Throwable " + e.getLocalizedMessage());
}
}
break;
case AIUIConstant.EVENT_ERROR: {
Log.i(TAG, "on event: " + event.eventType + "\n" + "错误: " + event.arg1 + "\n" + event.info);
}
break;
case AIUIConstant.EVENT_VAD: {
if (AIUIConstant.VAD_BOS == event.arg1) {
Log.e("tag", "HAO的方法:【onEvent】: " + "找到vad_bos");
} else if (AIUIConstant.VAD_EOS == event.arg1) {
Log.e("tag", "HAO的方法的方法:【onEvent】: " + "找到vad_eos");
} else {
Log.e("tag", "HAO的方法的方法:【onEvent】: " + event.arg2);
}
}
break;
case AIUIConstant.EVENT_START_RECORD: {
Log.e(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未开启
Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_IDLE");
} else if (AIUIConstant.STATE_READY == mAIUIState) {
// AIUI已就绪,等待唤醒
Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_READY");
} else if (AIUIConstant.STATE_WORKING == mAIUIState) {
// AIUI工作中,可进行交互
Log.e("tag", "HAO的方法:【onEvent】: " + "STATE_WORKING");
setStateResult("STATE_WORKING");
}
}
break;
case AIUIConstant.EVENT_CMD_RETURN: {
if (AIUIConstant.CMD_UPLOAD_LEXICON == event.arg1) {
Log.e("tag", "HAO的方法:【onEvent】: " + "上传" + (0 == event.arg2 ? "成功" : "失败"));
}
}
break;
default:
break;
}
}
}
监听器中对各个状态都做了详细的说名,代码在这,理解应该不难得把。语音监听结束之后就是语音合成,合成语音直接使用:SynthesizerListener synthesizerListener = new SynthesizerTTSListener(); TTS朗读状态监听器,这个时候也可能会出现一个错误,语音播放不出来,这个就是你没有加入权限和你没有导入包所导致的,此监听器中有开始播放,结束播放等几个方法,根据自己的需求在相应的方法中进行操作。
/**
* 合成监听器
*/
private class SynthesizerTTSListener implements SynthesizerListener {
@Override
public void onSpeakBegin() {
//语音开始播放
}
@Override
public void onBufferProgress(int i, int i1, int i2, String s) {
}
@Override
public void onSpeakPaused() {
}
@Override
public void onSpeakResumed() {
}
@Override
public void onSpeakProgress(int i, int i1, int i2) {
}
@Override
public void onCompleted(SpeechError speechError) {
//语音播放结束
}
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
}
}
以上就是利用AIUI实现语音播放和语音识别的基本操作思路,如有不详之处,欢迎留言,鄙人一定详细解答,谢谢大家的支持。