第一步:导入libs包和jnilbs包 和
第二步:初始化(=一定不能删除)
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=id");
第三步:布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.atguigu.speechdemo2.MainActivity"> <EditText android:id="@+id/et_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" /> <Button android:id="@+id/btn_start" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="语音输入" /> <Button android:id="@+id/btn_speechtext" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="读取文字" /> </LinearLayout>
第四步:json结果解析类(科大讯飞源码里面是有的直接拷贝就可以了)
public class JsonParser { 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")); // 如果需要多候选结果,解析数组其他字段 // for(int j = 0; j < items.length(); j++) // { // JSONObject obj = items.getJSONObject(j); // ret.append(obj.getString("w")); // } } } catch (Exception e) { e.printStackTrace(); } return ret.toString(); } public static String parseGrammarResult(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"); for(int j = 0; j < items.length(); j++) { JSONObject obj = items.getJSONObject(j); if(obj.getString("w").contains("nomatch")) { ret.append("没有匹配结果."); return ret.toString(); } ret.append("【结果】" + obj.getString("w")); ret.append("【置信度】" + obj.getInt("sc")); ret.append("\n"); } } } catch (Exception e) { e.printStackTrace(); ret.append("没有匹配结果."); } return ret.toString(); } public static String parseLocalGrammarResult(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"); for(int j = 0; j < items.length(); j++) { JSONObject obj = items.getJSONObject(j); if(obj.getString("w").contains("nomatch")) { ret.append("没有匹配结果."); return ret.toString(); } ret.append("【结果】" + obj.getString("w")); ret.append("\n"); } } ret.append("【置信度】" + joResult.optInt("sc")); } catch (Exception e) { e.printStackTrace(); ret.append("没有匹配结果."); } return ret.toString(); } }第五步:代码
public class MainActivity extends Activity implements View.OnClickListener { private EditText et_input; private Button btn_start; private Button btn_speechtext; // 用HashMap存储听写结果 private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn // 请勿在“ =” 与 appid 之间添加任务空字符或者转义符 SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5795c210"); setContentView(R.layout.activity_main); et_input = (EditText) findViewById(R.id.et_input); btn_start = (Button) findViewById(R.id.btn_start); btn_speechtext = (Button) findViewById(R.id.btn_speechtext); //设置点击事件 btn_start.setOnClickListener(this); btn_speechtext.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start://语音输入 showDialog(); break; case R.id.btn_speechtext://语音合成 speechText(); break; } } private void speechText() { //1.创建 SpeechSynthesizer 对象, 第二个参数: 本地合成时传 InitListener SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null); //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类 //设置发音人(更多在线发音人,用户可参见 附录13.2 mTts.setParameter(SpeechConstant.VOICE_NAME, "vixr"); //设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围 0~100 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端 //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm” //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限 //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm"); //3.开始合成 mTts.startSpeaking(et_input.getText().toString(), mSynListener); } //合成监听器 private SynthesizerListener mSynListener = new SynthesizerListener(){ //会话结束回调接口,没有错误时, error为null public void onCompleted(SpeechError error) {} //缓冲进度回调 //percent为缓冲进度0~100, beginPos为缓冲音频在文本中开始位置, endPos表示缓冲音频在 //文本中结束位置, info为附加信息。 public void onBufferProgress(int percent, int beginPos, int endPos, String info) {} //开始播放 public void onSpeakBegin() {} //暂停播放 public void onSpeakPaused() {} //播放进度回调 //percent为播放进度0~100,beginPos为播放音频在文本中开始位置, endPos表示播放音频在文 //本中结束位置. public void onSpeakProgress(int percent, int beginPos, int endPos) {} //恢复播放回调接口 public void onSpeakResumed() {} //会话事件回调接口 public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {} }; private void showDialog() { //1.创建RecognizerDialog对象 RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()); //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"); //3.设置回调接口 mDialog.setListener(new MyRecognizerDialogListener()); //4.显示dialog,接收语音输入 mDialog.show(); } class MyRecognizerDialogListener implements RecognizerDialogListener { /** * @param recognizerResult * @param b 是否说话结束 */ @Override public void onResult(RecognizerResult recognizerResult, boolean b) { String result = recognizerResult.getResultString(); Log.e("MainActivity", "result ==" + result); String text = JsonParser.parseIatResult(result); //解析好的 Log.e("MainActivity", "text ==" + text); String sn = null; // 读取json结果中的sn字段 try { JSONObject resultJson = new JSONObject(recognizerResult.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)); } et_input.setText(resultBuffer.toString()); et_input.setSelection(et_input.length()); } /** * 出错了 * * @param speechError */ @Override public void onError(SpeechError speechError) { Log.e("MainActivity", "onError ==" + speechError.getMessage()); } } class MyInitListener implements InitListener { @Override public void onInit(int i) { if (i != ErrorCode.SUCCESS) { Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show(); } } } }