科大讯飞语义

讯飞语义

效果图

科大讯飞语义_第1张图片

源码

下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9064463

语义测试接口

地址:http://osp.voicecloud.cn/index.php/default/quicktest/index

科大讯飞语义_第2张图片

开通服务,下载SDK

之前已经介绍过,地址:http://blog.csdn.net/q4878802/article/details/47762169#t8

这里说一下,进入到SDK的下载界面,你发现找不到语义的服务,而在我们开通服务的时候都是默认就帮我们把语义的服务开启了,可能是因为语义是只能用网络的,没有本地的资源,所以只要选择一个在线的功能,使用的jar包应该都是一样的,为什么没有直接下载语义的SDK我也不是很清楚,但是都可以用。

说明

之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然导入jar包和so库的过程可能不太一样,但是整体的流程是一样的。

将jar包和so库导入Android Studio工程

将jar包copy到libs目录下

在main目录下创建jniLibs目录,将so文件copy过来

科大讯飞语义_第3张图片

初始化

在清单文件中application标签下添加name属性

android:name=".InitApplication"

初始化

package com.example.kongqw.kqwunderstanddemo;

import android.app.Application;
import android.widget.Toast;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;

/** * Created by kongqw on 2015/8/29. */
public class InitApplication extends Application {
    @Override
    public void onCreate() {
        Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show();
        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
        // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton
        // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
        // 参数间使用“,”分隔。
        // 设置你申请的应用appid
        StringBuffer param = new StringBuffer();
        param.append("appid=55d33f09");
        param.append(",");
        param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);
        // param.append(",");
        // param.append(SpeechConstant.FORCE_LOGIN + "=true");
        SpeechUtility.createUtility(InitApplication.this, param.toString());

        super.onCreate();
    }
}

语义理解工具类

package com.example.kongqw.kqwunderstanddemo.engine;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.TextUnderstander;
import com.iflytek.cloud.TextUnderstanderListener;
import com.iflytek.cloud.UnderstanderResult;

/** * 科大讯飞语义理解 * * @author kongqw */
public abstract class KqwUnderstander {

    public abstract void result(String json);

    // 上下文
    private Context mContext;
    // Log标记
    private static final String TAG = "KqwUnderstander";
    // 语义理解对象(文本到语义)。
    private TextUnderstander mTextUnderstander;

    /** * 构造方法 * * @param context */
    public KqwUnderstander(Context context) {
        // 上下文
        mContext = context;

        // 初始化语义理解对象
        mTextUnderstander = TextUnderstander.createTextUnderstander(context, textUnderstanderListener);
    }

    // TODO 返回科大讯飞返回Json的实体类的对象
    public String textUnderstander(String text) {
        if (mTextUnderstander.isUnderstanding()) {
            mTextUnderstander.cancel();
        } else {
            int ret = mTextUnderstander.understandText(text, textListener);
            if (ret != 0) {
                Toast.makeText(mContext, "语义理解失败,错误码:" + ret, Toast.LENGTH_SHORT).show();
            }
        }

        return null;
    }

    /** * 初始化监听器(文本到语义)。 */
    private InitListener textUnderstanderListener = new InitListener() {

        @Override
        public void onInit(int code) {
            Log.d(TAG, "textUnderstanderListener init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
                Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
            }
        }
    };

    private TextUnderstanderListener textListener = new TextUnderstanderListener() {

        @Override
        public void onResult(final UnderstanderResult result) {

            if (null != result) {
                // 显示
                Log.d(TAG, "understander result:" + result.getResultString());
                // Toast.makeText(mContext, "understander result:" + result.getResultString(), Toast.LENGTH_SHORT).show();
                String text = result.getResultString();
                if (!TextUtils.isEmpty(text)) {
                    result(text);
                }
            } else {
                Log.d(TAG, "understander result:null");
                Toast.makeText(mContext, "识别结果不正确。", Toast.LENGTH_SHORT).show();
            }

        }

        @Override
        public void onError(SpeechError error) {
            Toast.makeText(mContext, "onError Code:" + error.getErrorCode(), Toast.LENGTH_SHORT).show();
        }
    };
}

测试类

package com.example.kongqw.kqwunderstanddemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.kongqw.kqwunderstanddemo.engine.KqwUnderstander;

public class MainActivity extends Activity {

    private EditText mEtText;
    private KqwUnderstander mKqwUnderstander;
    private TextView mTvShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEtText = (EditText) findViewById(R.id.et_text);

        mTvShow = (TextView) findViewById(R.id.tv_show);

        // 初始化语音合成对象
        mKqwUnderstander = new KqwUnderstander(this) {
            @Override
            public void result(String json) {
                mTvShow.setText(json);
                // Toast.makeText(MainActivity.this, "json = " + json, Toast.LENGTH_SHORT).show();
            }
        };

    }

    /** * 语义理解 * * @param view */
    public void start(View view) {
        Toast.makeText(this, "语义理解 : " + mEtText.getText().toString().trim(), Toast.LENGTH_SHORT).show();
        mKqwUnderstander.textUnderstander(mEtText.getText().toString().trim());
    }
}

XML页面布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText  android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="上帝到西二旗怎么走" android:textSize="20dp" />

    <Button  android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/et_text" android:gravity="center" android:onClick="start" android:text="语义理解" android:textSize="20dp" />

    <ScrollView  android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/button">

        <TextView  android:id="@+id/tv_show" android:layout_width="match_parent" android:layout_height="match_parent" />
    </ScrollView>
</RelativeLayout>

注意

在使用语义之前一定要开通对应的语义场景

你可能感兴趣的:(android,android,语义,Studio,科大讯飞)