灵云语义理解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 效果图源码GitHubSDK下载灵云SDK下载SDK集成下载SDK以后,将jar和so导入工程权限封装灵云配置类package kong.

效果图

效果图

源码

GitHub

SDK下载

灵云SDK下载

SDK集成

下载SDK以后,将jar和so导入工程

导入SDK

权限

<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 = "tts.cloud.wangjing";
    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 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) {
            // 由于系统已经初始化成功,在结束前需要调用方法hciRelease()进行系统的反初始化
            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);
        // 开发者Key,此项必填,由捷通华声提供
        initparam.addParam(InitParam.AuthParam.PARAM_KEY_DEVELOPER_KEY, ConfigUtil.DEVELOPER_KEY);
        // 应用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");
            // 日志大小,默认一个日志文件写多大,单位为K
            initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_SIZE, "1024");
            // 日志等级,0=无,1=错误,2=警告,3=信息,4=细节,5=调试,SDK将输出小于等于logLevel的日志信息
            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()) {
                // 已经成功获取了授权,并且距离授权到期有充足的时间(>7天)
                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() {
        //构造Asr初始化的帮助类的实例
        NluInitParam initParam = new NluInitParam();
        // 获取App应用中的lib的路径,放置能力所需资源文件。如果使用/data/data/packagename/lib目录,需要添加android_so的标记
        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) {
            // 开始翻译
            // 调用HciCloudMt.hciMtTrans() 方法进行合成
            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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
机器学习/深度学习 自然语言处理
词嵌入与语义表示
词嵌入与语义表示
|
1月前
|
人工智能 数据可视化 API
语义分割笔记(一):基于PaddleSeg使用Transfomer模型对航空遥感图像分割
这篇博客介绍了如何使用PaddleSeg和Transformer模型SegFormer B3对航空遥感图像进行语义分割,包括项目背景、数据集处理、训练步骤和代码实现。
87 1
语义分割笔记(一):基于PaddleSeg使用Transfomer模型对航空遥感图像分割
|
移动开发 数据可视化 算法
Pointnet语义分割任务S3DIS数据集
Pointnet语义分割任务S3DIS数据集
480 0
|
算法 搜索推荐 Ubuntu
语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse
语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse
语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse
|
机器学习/深度学习 编解码 人工智能
【计算机视觉】MaskFormer:将语义分割和实例分割作为同一任务进行训练
目标检测和实例分割是计算机视觉的基本任务,在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位,然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时,或者在每个图像的对象数量不同的情况下,这些方法通常会出现问题。
【计算机视觉】MaskFormer:将语义分割和实例分割作为同一任务进行训练
|
机器学习/深度学习 编解码 人工智能
关于语义分割的亿点思考
关于语义分割的亿点思考
244 0
|
机器学习/深度学习 编解码 数据可视化
基于深度学习的多光谱图像语义分割
基于深度学习的多光谱图像语义分割。
279 0
|
传感器 机器学习/深度学习 数据采集
CMNEXT: 基于编解码架构的强大语义分割基线,解锁多模态语义分割的正确姿势!
CMNEXT: 基于编解码架构的强大语义分割基线,解锁多模态语义分割的正确姿势!
162 0
|
机器学习/深度学习 编解码 算法
语义分割项目详解
语义分割项目详解
346 0
语义分割项目详解
|
机器学习/深度学习 算法 机器人
TMM2023 - FECANet:用特征增强的上下文感知网络增强小样本语义分割
TMM2023 - FECANet:用特征增强的上下文感知网络增强小样本语义分割
205 0
TMM2023 - FECANet:用特征增强的上下文感知网络增强小样本语义分割