浅谈AndroidStudio2.3.3添加讯飞语音功能
目前很多安卓应用都用到语音识别功能,通常情况下,我们都是通过接入第三方API来实现的。本人最近写了一个简易的快递查询,在Androidstudio(版本2.3.3)嵌入讯飞语音功能时遇到了点问题,现分享讯飞语音功能的添加,以及出现问题的解决方案给大家,希望对大家有所帮助。本人小白一枚,文章中有讲的不对的,还请多多指教。
首先你应该去科大讯飞的开发平台:http://www.xfyun.cn/ 注册账号获取Sdk开发工具包以及APPID,后面会用到。具体步骤百度上都有。
讯飞语音开发前的准备工作:
接下来我们创建一个新的安卓项目,然后把我们下载好的Sdk里面的Msc.jar以及Sunflower.jar放到app->libs目录下(如果没有libs文件夹,自行创建一个)。放入目录有的版本不能自动添加依赖,你要自己手动添加。在Msc.jar右键选择Add As Library,点击进去再点ok,等待一会。当再次点击Msc.jar时有出现以下文件夹,说明添加依赖成功。另一个Sunflower.jar同样进行相同的步骤。
图一、添加依赖步骤 (图中其他jar包是我其他项目的,你们不用添加)
图二、添加依赖成功图
之后在app->src->main目录下新建assets文件夹(若本来就有这两个文件就不用再新建),以及jniLibs文件夹,分别放入如下文件,这些文件都是从官网下载下来的sdk工具包里面拷贝过来的。
开始进入讯飞语音开发:
首先编写一个简单的xml布局用来测试语音的实现,布局如下:
然后新建一个BaseApplication类继承于Application 用于讯飞APPKey验证注册:
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 讯飞语音的初始化
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=appkey");
}
}
注意里面的APPID,这个是刚开始我们去讯飞开发平台自己注册的APPID。然后再AndroidManifest的Application中添加属性
即如图所示:。
接下来在AndroidManifest中添加权限:
<!-- 连接网络权限,用于执行云端语音能力 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
新建一个Contast 工具类,用于存放讯飞语音结果集转换:
public static String parseIatResult(String json) { StringBuffer ret = new StringBuffer(); try { JSONTokener tokener = new JSONTokener(json); JSONObject joResult = new JSONObject(tokener); JSONArray words = joResult.getJSONArray("ws"); for (int i = 0; i < words.length(); i++) { // 听写结果词,默认使用第一个结果 JSONArray items = words.getJSONObject(i).getJSONArray("cw"); JSONObject obj = items.getJSONObject(0); ret.append(obj.getString("w")); } } catch (Exception e) { e.printStackTrace(); } return ret.toString(); }
接下来在MainActivity.java中首先编写点击语音图标的点击事件:
case R.id.imageView_xunfeiyuyin://语音 //1.创建dialog对象 RecognizerDialog iatDialog = new RecognizerDialog(mContext, null); iatDialog.setListener(mRecognizerDialogListener); //2.设置回调接口 iatDialog.show(); //3.开始听写 显示窗口 break;
接下来编写语音输入后的结果集转换:
RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() { public void onResult(RecognizerResult results, boolean isLast) { // 打印结果 当isLast为true时,说明结果结束 Log.i("huark", "讯飞语音"); String expressNum = Contast .parseIatResult(results.getResultString()); // 拼接 if (!isLast) { mExpressNum.append(expressNum); } } public void onError(SpeechError error) { // 出错 Toast.makeText(mContext, "您没有说话,请重新点击语音按钮", Toast.LENGTH_SHORT).show(); } };
接下来运行虚拟机,运行成功:
可能出现的一些问题:
1、如果出现以下情况,即jniLlibs文件夹未创建以及里面的文件没有拷贝进去:
2、 若出现以下情况,即APPID出错,相应的APPID对应的jniLlibs文件要一样(即从官网下载下来用你自己注册的APPID和sdk开发工具包)
3、 有时会出现以下错误:
需在build.gradle(Module:app)的dependencies下添加如下代码:
compile files('libs/Msc.jar')
compile files('libs/Sunflower.jar')
4、未加<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>权限出现以下问题:
时间匆忙,加上技术不是很强,有哪里出错的还望各位大佬指出,谢谢各位。 想要这个简单项目源码的私聊我QQ:184188719。