Android开发基于科大讯飞实现语音识别
简介
通过使用科大讯飞的API开发Android APP实现语音识别
下载相应SDK
访问https://www.xfyun.cn/?jump=login进行注册,然后创建一个应用并进行相应SDK下载
添加相应的包
打开刚刚下载的SDK,找到libs,将两个jar包复制到Android工程里
右键libs进行添加
在main下创建jinLibs
将刚刚下载的SDK包libs里剩下的复制进去
OK,环境配置完成,现在就可以开始写代码了
参考代码
实现通过按下一个按钮,进行语音输入,然后将语音转换成文本显示在TextView里
在AndroidManifest.xml添加相应权限
<!--连接网络权限,用于执行云端语音能力 -->
<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" />
初始化
初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
将代码放在主Activity的
protected void onCreate(Bundle savedInstanceState)
里
主Activity代码
public class MainActivity extends AppCompatActivity {
private TextView tv_content;
// 用HashMap存储听写结果
private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_content = (TextView) findViewById(R.id.textView_content);
SpeechUtility.createUtility(this, SpeechConstant.APPID +"=111111");
}
public void startSpeechClick(View view) {
//初始化识别无UI识别对象
//使用SpeechRecognizer对象,可根据回调消息自定义界面;
SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);
//设置参数
mIat.setParameter(SpeechConstant.PARAMS, "iat"); //应用领域
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); //语音
mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); //普通话
mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//引擎
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");//返回结果格式
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
mIat.setParameter(SpeechConstant.VAD_EOS,"1000");
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT, "0");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
//mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
//开始听写
mIat.startListening(mRecoListener);
}
private RecognizerListener mRecoListener= new RecognizerListener() {
//音量0-30
@Override
public void onVolumeChanged(int i, byte[] bytes) {
}
//开始录音
@Override
public void onBeginOfSpeech() {
}
//结束录音
@Override
public void onEndOfSpeech() {
}
//返回结果
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
System.out.println(recognizerResult.getResultString());
printResult(recognizerResult);
}
@Override
public void onError(SpeechError speechError) {
}
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
}
};
//输出结果
private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
String sn = null;
// 读取json结果中的sn字段
try {
JSONObject resultJson = new JSONObject(results.getResultString());
sn = resultJson.optString("sn");
} catch (JSONException e) {
e.printStackTrace();
}
mIatResults.put(sn, text);
StringBuffer resultBuffer = new StringBuffer();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
tv_content.setText(resultBuffer.toString());
}
}
添加json进行解析
将刚刚下载的SDK里的JsonParser.java添加到java里
activity_main.xml参考代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startSpeechClick"
android:text="@string/button_input"
android:layout_centerHorizontal="true"
/>
<TextView
android:id="@+id/textView_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:layout_below="@id/button_input"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
现在可以将代码下载到手机里进行测试了
注: 1.需要用真机 2.需要联网