在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 科大讯飞语音测评插件

科大讯飞语音测评插件

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:16.34M
  • 下载次数:43
  • 浏览次数:2254
  • 发布时间:2016-07-06
  • 实例类别:Android平台开发
  • 发 布 人:coolwei
  • 文件格式:.zip
  • 所需积分:2

实例介绍

【实例简介】
【实例截图】

【核心代码】

package com.cool.ise;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.UUID;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.gson.Gson;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.EvaluatorListener;
import com.iflytek.cloud.EvaluatorResult;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechEvaluator;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.record.c;
import com.iflytek.ise.result.LastResult;
import com.iflytek.ise.result.Result;
import com.iflytek.ise.result.xml.XmlResultParser;
import com.iflytek.speech.util.JsonParser;
import com.iflytek.speech.util.LatResult;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

/**
 * 语音测评插件
 * 
 * @author cool
 *
 */
public class IsePlugin extends CordovaPlugin {

	private SpeechEvaluator mSpeechEvaluator;
	private String mLastResult = "";
	CallbackContext callbackContext;
	private CordovaInterface cordova;
	private SharedPreferences sp;
	private String uuid = "";
	private Toast mToast;
	private SpeechRecognizer mIat;
	private int ret = 0; // 函数调用返回值
	private String voiceResult;
	
	// 用HashMap存储听写结果
	private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();

	@Override
	public void initialize(CordovaInterface cordova, CordovaWebView webView) {
		super.initialize(cordova, webView);
		this.cordova = cordova;
		SpeechUtility.createUtility(cordova.getActivity(), "appid=57109849");
		mSpeechEvaluator = SpeechEvaluator.createEvaluator(cordova.getActivity(), null);

		sp = cordova.getActivity().getSharedPreferences("config", Context.MODE_PRIVATE);
	}

	@Override
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
		this.callbackContext = callbackContext;
		if ("voice2Text".equals(action)) {// 解析测评
			showToast("语音识别");
			String vadEosRecognizer = args.getString(0);
			if (TextUtils.isEmpty(vadEosRecognizer)) {
				vadEosRecognizer = "3000";
			}
			mIat = SpeechRecognizer.createRecognizer(cordova.getActivity(), null);
			uuid = FileUtils.generateShortUuid();
			setSpeechRecognizerParam(uuid,vadEosRecognizer);
			ret = mIat.startListening(mRecognizerListener);
			if (ret != ErrorCode.SUCCESS) {
				showToast("听写失败,错误码:"   ret);
			} else {
				showToast("请开始说话…");
			}
			return true;
		} else if ("wordEvaluator".equals(action)) {
			showToast("开始测评");
			sp.edit().putString("category", "read_word").commit();
			uuid = FileUtils.generateShortUuid();
			String text = args.getString(0);
			String vad_eos = args.getString(1);
			Log.e("399", "vad_eos"   vad_eos);
			if (TextUtils.isEmpty(vad_eos)) {
				vad_eos = "3000";
			}
			setParams(uuid,vad_eos);// 设置参数
			mSpeechEvaluator.startEvaluating("[word]"   text, null, mEvaluatorListener);
			return true;
		} else if ("sentenceEvaluator".equals(action)) {
			showToast("开始测评");
			sp.edit().putString("category", "read_sentence").commit();
			uuid = FileUtils.generateShortUuid();
			String text = args.getString(0);
			String vad_eos = args.getString(1);
			Log.e("399", "vad_eos"   vad_eos);
			if (TextUtils.isEmpty(vad_eos)) {
				vad_eos = "3000";
			}
			setParams(uuid,vad_eos);// 设置参数
			mSpeechEvaluator.startEvaluating(text, null, mEvaluatorListener);
			return true;
		}

		callbackContext.error("error");
		return false;
	}

	/**
	 * 语音测评listener
	 */
	private EvaluatorListener mEvaluatorListener = new EvaluatorListener() {

		@Override
		public void onVolumeChanged(int volume, byte[] data) {
			showToast("当前音量  "   volume);
			Log.e("399", "当前音量  "   volume);
		}

		@Override
		public void onResult(EvaluatorResult result, boolean isLast) {
			if (isLast) {
				showToast("评测结束");
				StringBuilder builder = new StringBuilder();
				builder.append(result.getResultString());
				mLastResult = builder.toString();
				if (!TextUtils.isEmpty(builder)) {

					if (!TextUtils.isEmpty(mLastResult)) {
						XmlResultParser resultParser = new XmlResultParser();
						Result backResult = resultParser.parse(mLastResult);
						LastResult lastResult = new LastResult();
						lastResult.result = backResult;
						lastResult.path = FileUtils.getCachePath(cordova.getActivity())   "msc/"   uuid   ".wav";

						if (null != lastResult) {
							Gson gson = new Gson();
							callbackContext.success(gson.toJson(lastResult));
						} else {
							showToast("结析结果为空");
							callbackContext.error("结析结果为空");
						}
					}

					// callbackContext.success(builder.toString());
				}

				Log.e("399", "mLastResult = "   builder.toString());

			}
		}

		@Override
		public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {

		}

		@Override
		public void onError(SpeechError error) {
			if (error != null) {
				showToast("error:"   error.getErrorCode()   ","   error.getErrorDescription());
				callbackContext.error("error:"   error.getErrorCode()   ","   error.getErrorDescription());
			} else {
				Log.e("399", "evaluator over");
				callbackContext.error("evaluator over");
			}
		}

		@Override
		public void onEndOfSpeech() {
			Log.e("399", "结束说话");
		}

		@Override
		public void onBeginOfSpeech() {
			Log.e("399", "开始说话");
		}
	};

	/**
	 * 设置语音测评参数
	 */
	private void setParams(String fileName,String vadeos) {
		String category = sp.getString("category", "read_sentence");
//		String vad_eos = sp.getString("vad_eos", "1800");
		// 设置评测语种
		mSpeechEvaluator.setParameter(SpeechConstant.LANGUAGE, "en_us");
		// 设置评测题型
		mSpeechEvaluator.setParameter(SpeechConstant.ISE_CATEGORY, category);
		// 设置试题编码类型
		mSpeechEvaluator.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
		// 设置前、后端点超时
		mSpeechEvaluator.setParameter(SpeechConstant.VAD_BOS, "5000");
		mSpeechEvaluator.setParameter(SpeechConstant.VAD_EOS, vadeos);
		// 设置录音超时,设置成-1 则无超时限制
		mSpeechEvaluator.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, "-1");
		// 设置结果等级,不同等级对应不同的详细程度
		mSpeechEvaluator.setParameter(SpeechConstant.RESULT_LEVEL, "complete");
		// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
		// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
		mSpeechEvaluator.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
		mSpeechEvaluator.setParameter(SpeechConstant.ISE_AUDIO_PATH,
				FileUtils.getCachePath(cordova.getActivity())   "msc/"   fileName   ".wav");
	}

	/**
	 * 设置语音识别参数
	 */
	private void setSpeechRecognizerParam(String fileName,String vadEosRecognizer) {

		// 清空参数
		mIat.setParameter(SpeechConstant.PARAMS, null);

		// 设置听写引擎
		mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
		// 设置返回结果格式
		mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

		// 设置语言
		mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");

		// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
		mIat.setParameter(SpeechConstant.VAD_BOS, "4000");

		// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
		mIat.setParameter(SpeechConstant.VAD_EOS, vadEosRecognizer);

		// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
		mIat.setParameter(SpeechConstant.ASR_PTT, "0");

		// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
		// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
		mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
		mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
				FileUtils.getCachePath(cordova.getActivity())   "msc/"   fileName   ".wav");
	}

	/**
	 * 打印吐司
	 * 
	 * @param msg
	 */
	private void showToast(final String msg) {
		// cordova.getActivity().runOnUiThread(new Runnable() {
		//
		// @Override
		// public void run() {
		// // TODO Auto-generated method stub
		// if (mToast == null) {
		// mToast = Toast.makeText(cordova.getActivity(), "",
		// Toast.LENGTH_SHORT);
		// }
		// mToast.setText(msg);
		// mToast.show();
		// }
		// });
		// Toast.makeText(cordova.getActivity(), msg,
		// Toast.LENGTH_SHORT).show();

	}

	/**
	 * 语音识别听写监听器。
	 */
	private RecognizerListener mRecognizerListener = new RecognizerListener() {

		@Override
		public void onBeginOfSpeech() {
			// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
			showToast("开始说话");
		}

		@Override
		public void onError(SpeechError error) {
			// Tips:
			// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
			// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
			showToast(error.getPlainDescription(true));
			callbackContext.error(error.getPlainDescription(true));
		}

		@Override
		public void onEndOfSpeech() {
			// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
			showToast("结束说话");
			Log.e("399", "结束说话");
		}

		@Override
		public void onResult(RecognizerResult results, boolean isLast) {

			printResult(results);
			Log.e("399", results.getResultString());

			if (isLast) {
				// TODO 最后的结果
				Log.e("399", "LastResult"   voiceResult);
				LatResult latResult = new LatResult();
				latResult.result = voiceResult;
				latResult.path = FileUtils.getCachePath(cordova.getActivity())   "msc/"   uuid   ".wav";
				callbackContext.success(new Gson().toJson(latResult));
			}
		}

		@Override
		public void onVolumeChanged(int volume, byte[] data) {
			showToast("当前正在说话,音量大小:"   volume);
			// Log.e("399", "返回音频数据:" data.length);
		}

		@Override
		public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
			// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
			// 若使用本地能力,会话id为null
			// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
			// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
			// Log.d(TAG, "session id ="   sid);
			// }
		}
	};

	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));
		}
		voiceResult = resultBuffer.toString();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		if (null != mSpeechEvaluator) {
			mSpeechEvaluator.destroy();
			mSpeechEvaluator = null;
		}

		if (mIat != null) {
			// 退出时释放连接
			mIat.cancel();
			mIat.destroy();
		}
	}

}

实例下载地址

科大讯飞语音测评插件

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 lingdu0001 发表于: 2017-01-09 18:46 23
ios 的不行啊 报10111

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警