简介
通过使用科大讯飞的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>();@Overrideprotected 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@Overridepublic void onVolumeChanged(int i, byte[] bytes) {}//开始录音@Overridepublic void onBeginOfSpeech() {}//结束录音@Overridepublic void onEndOfSpeech() {}//返回结果@Overridepublic void onResult(RecognizerResult recognizerResult, boolean b) {System.out.println(recognizerResult.getResultString());printResult(recognizerResult);}@Overridepublic void onError(SpeechError speechError) {}@Overridepublic 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"><Buttonandroid: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"/><TextViewandroid: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.需要联网
源码下载