#科大讯飞-语音识别开发
##在线语音识别
将连续语音快速识别为文字
语音识别在模拟器上是无法测试的,虚拟机mac接收不到声音或者语音识别是访问云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别!
##效果图
##源码
新下载地址(Android Studio工程):https://download.csdn.net/download/kwunyamshan/11259989
由于旧下载地址下载次数过多分数已经超高所以新建了一个内容一样,放心下载
注意:源码中是我的sdk,只有三个装机量35天试用期限,你们试用需要替换掉SpeechApp中配置的Appid以及so库!
旧下载地址(Android Studio工程):http://download.csdn.net/detail/kwunyamshan/9692791
##集成步骤
开通服务,下载SDK
之前介绍过,地址:http://blog.csdn.net/kwunyamshan/article/details/53320164
Step 1. 导入so库
eclipse将so库导入到libs目录下
AS用户将so导入到jniLibs目录下
下载的官方SDK中有七个so库目前已经支持市面上98%的手机
armeabi目录下libmsc.so只支持市面上百分之八十的手机,如果不需要做适配的话导入这一个so库也是极好的
Step 2. 拷贝资产文件
将 SDK 资源包assets 路径下的资源文件拷贝至 Android 工程 asstes 目录下
Step 3. 初始化
这是很重要并且是必须的一步操作,实际上初始化的操作是异步进行的,如果初始化还没有完成你就开始调用了语音识别,是会出现很多问题的,建议在你程序刚刚启动的时候调用
public class SpeechApp extends Application {
@Override
public void onCreate() {
// 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
// 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton
// 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
// 参数间使用半角“,”分隔。
// 设置你申请的应用appid,请勿在'='与appid之间添加空格及空转义符
// 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误
SpeechUtility.createUtility(SpeechApp.this, "appid=" + getString(R.string.app_id));
// 以下语句用于设置日志开关(默认开启),设置成false时关闭语音云SDK日志打印
// Setting.setShowLog(false);
super.onCreate();
}
}
Step 4. 添加用户权限,官方给的API中不规范有几条权限中间有空格导致编译不通过 ,注意一下
<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限, 构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位, 提供更精准的服务-->
<!--定位信息是敏感信息, 可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限, 拍照需要用到-->
<uses-permission android:name="android.permission.CAMERA" />
Step 5. 代码
public class MainActivity extends Activity {
private StringBuffer mBuffer;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv_translate_text);
}
public void startVoice(View view) {
//1.创建RecognizerDialog对象
RecognizerDialog mDialog = new RecognizerDialog(this, null);
//2.设置accent、 language等参数
mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
//若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解结果
// mDialog.setParameter("asr_sch", "1");
// mDialog.setParameter("nlp_version", "2.0");
mBuffer = new StringBuffer();
//3.设置回调接口
mDialog.setListener(mRecognizerDialogListener);
//4.显示dialog,接收语音输入
mDialog.show();
}
RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
//听写结果回调接口(返回Json格式结果,用户可参见附录13.1);
//一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
//关于解析Json的代码可参见Demo中JsonParser类;
//isLast等于true时会话结束。
@Override
public void onResult(RecognizerResult results, boolean isLast) {
String result = results.getResultString();//语音听写的结果
String resultString = processData(result);
mBuffer.append(resultString);
if (isLast) {
//话已经说完了
String finalResult = mBuffer.toString();
System.out.println("解析结果:" + finalResult);
tv.setText(finalResult);
}
}
@Override
public void onError(SpeechError error) {
}
};
//解析json
protected String processData(String result) {
Gson gson = new Gson();
VoiceBean voiceBean = gson.fromJson(result, VoiceBean.class);
StringBuffer sb = new StringBuffer();
ArrayList<VoiceBean.WsBean> ws = voiceBean.ws;
for (VoiceBean.WsBean wsBean : ws) {
String word = wsBean.cw.get(0).w;
sb.append(word);
}
return sb.toString();
}
}
layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:padding="5dip"
android:layout_width="match_parent"
android:layout_height="230dip"
android:id="@+id/tv_translate_text"
android:background="#fff"
android:textSize="22sp"
android:textColor="#000"
android:hint="请点击按钮"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#F1AF5A"
android:gravity="center"
>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button"
android:onClick="startVoice"
/>
</LinearLayout>
</LinearLayout>
Step 6. 目录结构
遇到问题可以留言探讨会尽快回复,也可以访问官方地址
网址:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=13040&fromuid=86908