基本信息
源码名称:科大讯飞语音测评插件
源码大小:16.34M
文件格式:.zip
开发语言:Java
更新时间:2016-07-06
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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();
		}
	}

}