讯飞语义
效果图
源码
下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9064463
语义测试接口
地址:http://osp.voicecloud.cn/index.php/default/quicktest/index
开通服务,下载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过来
初始化
在清单文件中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>
注意
在使用语义之前一定要开通对应的语义场景