效果图
源码
GitHub
SDK下载
灵云SDK下载
SDK集成
下载SDK以后,将jar和so导入工程
权限
<uses-permission android:name=
"android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name=
"android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name=
"android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name=
"android.permission.ACCESS_FINE_LOCATION" />
封装
灵云配置类
package kong.qingwei.kqwhcidemo;
/**
* Created by kqw on 2016/8/12.
* 灵云配置信息
*/
public final class ConfigUtil {
/**
* 灵云APP_KEY
*/
public static final String APP_KEY =
"3d5d5466";
/**
* 开发者密钥
*/
public static final String DEVELOPER_KEY =
"eca643ff7b3c758745d7cf516e808d34";
/**
* 灵云云服务的接口地址
*/
public static final String CLOUD_URL =
"test.api.hcicloud.com:8888";
/**
* 需要运行的灵云能力
*/
public static final String CAP_KEY =
"tts.local.synth";
public static final String CAP_KEY_NUL =
"nlu.cloud";
}
初始化灵云语音能力的工具类
package kong.qingwei.kqwhcidemo;
import android.app.Activity;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import com.sinovoice.hcicloudsdk.api.HciCloudSys;
import com.sinovoice.hcicloudsdk.common.AuthExpireTime;
import com.sinovoice.hcicloudsdk.common.HciErrorCode;
import com.sinovoice.hcicloudsdk.common.InitParam;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Created by kqw on 2016/8/12.
* 初始化灵云语音
*/
public class HciUtil {
private static final String TAG =
"HciUtil";
private Activity mActivity;
private final String mConfigStr;
public HciUtil(Activity activity) {
mActivity = activity;
InitParam initParam = getInitParam();
mConfigStr = initParam.getStringConfig();
}
public boolean initHci() {
int errCode = HciCloudSys.hciInit(mConfigStr, mActivity);
if (errCode != HciErrorCode.HCI_ERR_NONE && errCode != HciErrorCode.HCI_ERR_SYS_ALREADY_INIT) {
Toast.makeText(mActivity,
"hciInit error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();
return false;
}
errCode = checkAuthAndUpdateAuth();
if (errCode != HciErrorCode.HCI_ERR_NONE) {
Toast.makeText(mActivity,
"CheckAuthAndUpdateAuth error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();
HciCloudSys.hciRelease();
return false;
}
return true;
}
/**
* 释放
*/
public void hciRelease(){
HciCloudSys.hciRelease();
}
/**
* 加载初始化信息
*
* @return 系统初始化参数
*/
private InitParam
getInitParam() {
String authDirPath = mActivity.getFilesDir().getAbsolutePath();
InitParam initparam =
new InitParam();
initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTH_PATH, authDirPath);
initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTO_CLOUD_AUTH,
"no");
initparam.addParam(InitParam.AuthParam.PARAM_KEY_CLOUD_URL, ConfigUtil.CLOUD_URL);
initparam.addParam(InitParam.AuthParam.PARAM_KEY_DEVELOPER_KEY, ConfigUtil.DEVELOPER_KEY);
initparam.addParam(InitParam.AuthParam.PARAM_KEY_APP_KEY, ConfigUtil.APP_KEY);
String sdcardState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {
String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String packageName = mActivity.getPackageName();
String logPath = sdPath + File.separator +
"sinovoice" + File.separator + packageName + File.separator +
"log" + File.separator;
File fileDir =
new File(logPath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_PATH, logPath);
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_COUNT,
"5");
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_SIZE,
"1024");
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_LEVEL,
"5");
}
return initparam;
}
/**
* 获取授权
*
* @return 授权结果
*/
private int checkAuthAndUpdateAuth() {
int initResult;
AuthExpireTime objExpireTime =
new AuthExpireTime();
initResult = HciCloudSys.hciGetAuthExpireTime(objExpireTime);
if (initResult == HciErrorCode.HCI_ERR_NONE) {
Date date =
new Date(objExpireTime.getExpireTime() *
1000);
SimpleDateFormat sdf =
new SimpleDateFormat(
"yyyy-MM-dd", Locale.CHINA);
Log.i(TAG,
"expire time: " + sdf.format(date));
if (objExpireTime.getExpireTime() *
1000 > System.currentTimeMillis()) {
Log.i(TAG,
"checkAuth success");
return initResult;
}
}
initResult = HciCloudSys.hciCheckAuth();
if (initResult == HciErrorCode.HCI_ERR_NONE) {
Log.i(TAG,
"checkAuth success");
return initResult;
}
else {
Log.e(TAG,
"checkAuth failed: " + initResult);
return initResult;
}
}
}
语义理解的类
package kong.qingwei.kqwhcidemo;
import android.app.Activity;
import android.util.Log;
import com.sinovoice.hcicloudsdk.api.nlu.HciCloudNlu;
import com.sinovoice.hcicloudsdk.common.HciErrorCode;
import com.sinovoice.hcicloudsdk.common.Session;
import com.sinovoice.hcicloudsdk.common.nlu.NluConfig;
import com.sinovoice.hcicloudsdk.common.nlu.NluInitParam;
import com.sinovoice.hcicloudsdk.common.nlu.NluRecogResult;
/**
* Created by kqw on 2016/8/12.
* 语义理解类
*/
public class NluUtil {
private static final String TAG =
"NluUtil";
private Activity mActivity;
public NluUtil(Activity activity) {
mActivity = activity;
}
public boolean initNul() {
NluInitParam initParam =
new NluInitParam();
String dataPath = mActivity.getFilesDir().getAbsolutePath().replace(
"files",
"lib");
initParam.addParam(NluInitParam.PARAM_KEY_DATA_PATH, dataPath);
initParam.addParam(NluInitParam.PARAM_KEY_FILE_FLAG, NluInitParam.VALUE_OF_PARAM_FILE_FLAG_ANDROID_SO);
initParam.addParam(NluInitParam.PARAM_KEY_INIT_CAP_KEYS, ConfigUtil.CAP_KEY_NUL);
int errCode = HciCloudNlu.hciNluInit(initParam.getStringConfig());
Log.i(TAG,
"initNul: errCode = " + errCode);
return errCode == HciErrorCode.HCI_ERR_NONE || errCode == HciErrorCode.HCI_ERR_NLU_ALREADY_INIT;
}
public void recog(String text, OnNluRecogListener onNluRecogListener) {
NluConfig nluConfig = initConfig();
Session session =
new Session();
int errCode = HciCloudNlu.hciNluSessionStart(nluConfig.getStringConfig(), session);
if (errCode == HciErrorCode.HCI_ERR_NONE) {
NluRecogResult nluResult =
new NluRecogResult();
errCode = HciCloudNlu.hciNluRecog(session, text, nluConfig.getStringConfig(), nluResult);
if (errCode == HciErrorCode.HCI_ERR_NONE) {
onNluRecogListener.onNluResult(nluResult);
}
else {
onNluRecogListener.onError(errCode);
}
errCode = HciCloudNlu.hciNluSessionStop(session);
if (errCode != HciErrorCode.HCI_ERR_NONE) {
onNluRecogListener.onError(errCode);
}
}
else {
onNluRecogListener.onError(errCode);
}
}
private NluConfig
initConfig() {
NluConfig nluConfig =
new NluConfig();
nluConfig.addParam(NluConfig.SessionConfig.PARAM_KEY_CAP_KEY, ConfigUtil.CAP_KEY_NUL);
nluConfig.addParam(
"intention",
"weather");
return nluConfig;
}
public interface OnNluRecogListener {
void onNluResult(NluRecogResult nluRecogResult);
void onError(
int errorCode);
}
}
使用
初始化灵云的语音能力和语义理解
mInitTts =
new HciUtil(
this);
boolean isInitHci = mInitTts.initHci();
if (isInitHci) {
……
mNluUtil =
new NluUtil(
this);
boolean isInitNul = mNluUtil.initNul();
if (isInitNul) {
Toast.makeText(
this,
"语义理解 初始化成功", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(
this,
"语义理解 初始化失败", Toast.LENGTH_SHORT).show();
}
}
语义理解
/**
* 语义理解
*
* @param view
*/
public void recog(View view) {
final String text = mEditText2.getText().toString();
if (TextUtils.isEmpty(text)) {
Toast.makeText(
this,
"理解句子内容为空", Toast.LENGTH_SHORT).show();
return;
}
mNluUtil.recog(text,
new NluUtil.OnNluRecogListener() {
@Override
public void onNluResult(NluRecogResult nluRecogResult) {
StringBuilder stringBuffer =
new StringBuilder();
ArrayList<NluRecogResultItem> nluRecogResultItems = nluRecogResult.getRecogResultItemList();
for (NluRecogResultItem nluRecogResultItem : nluRecogResultItems) {
String result = nluRecogResultItem.getResult();
stringBuffer.append(result).append(
"\n");
Log.i(TAG,
"onNluResult: " + result);
}
showDialog(text, stringBuffer.toString());
}
@Override
public void onError(
int errorCode) {
Log.i(TAG,
"onError: errorCode = " + errorCode);
}
});
}
Dialog
/**
* 显示Dialog
*
* @param title title
* @param message message
*/
private void showDialog(String title, String message) {
AlertDialog.Builder builder =
new AlertDialog.Builder(
this);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(
"确认",
null);
builder.create().show();
}
注意
灵云的语义,想要识别哪个场景,必须要先开通对应场景,然后做配置以后才可以使用,类似这样
nluConfig.addParam(
"intention",
"weather");
这里的天气,对应的参数是weather,了解更多场景和对应场景参数可以查看捷通华声灵云公有云能力平台NLU结果开发手册.pdf