package com.iflytek.voicedemo; import com.iflytek.ise.result.Result; import com.iflytek.ise.result.xml.XmlResultParser; import com.iflytek.speech.setting.IseSettings; import com.iflytek.sunflower.FlowerCollector; import com.iflytek.cloud.EvaluatorListener; import com.iflytek.cloud.EvaluatorResult; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechEvaluator; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; /** * 语音评测demo */ public class IseDemo extends Activity implements OnClickListener { private static String TAG = IseDemo.class.getSimpleName(); private final static String PREFER_NAME = "ise_settings"; private final static int REQUEST_CODE_SETTINGS = 1; private EditText mEvaTextEditText; private EditText mResultEditText; private Button mIseStartButton; private Toast mToast; // 评测语种 private String language; // 评测题型 private String category; // 结果等级 private String result_level; private String mLastResult; private SpeechEvaluator mIse; // 评测监听接口 private EvaluatorListener mEvaluatorListener = new EvaluatorListener() { @Override public void onResult(EvaluatorResult result, boolean isLast) { Log.d(TAG, "evaluator result :" + isLast); if (isLast) { StringBuilder builder = new StringBuilder(); builder.append(result.getResultString()); if(!TextUtils.isEmpty(builder)) { mResultEditText.setText(builder.toString()); } mIseStartButton.setEnabled(true); mLastResult = builder.toString(); showTip("评测结束"); } } @Override public void onError(SpeechError error) { mIseStartButton.setEnabled(true); if(error != null) { showTip("error:"+ error.getErrorCode() + "," + error.getErrorDescription()); mResultEditText.setText(""); mResultEditText.setHint("请点击“开始评测”按钮"); } else { Log.d(TAG, "evaluator over"); } } @Override public void onBeginOfSpeech() { // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 Log.d(TAG, "evaluator begin"); } @Override public void onEndOfSpeech() { // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 Log.d(TAG, "evaluator stoped"); } @Override public void onVolumeChanged(int volume, byte[] data) { showTip("当前音量:" + volume); Log.d(TAG, "返回音频数据:"+data.length); } @Override public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 // if (SpeechEvent.EVENT_SESSION_ID == eventType) { // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); // Log.d(TAG, "session id =" + sid); // } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.isedemo); mIse = SpeechEvaluator.createEvaluator(IseDemo.this, null); initUI(); setEvaText(); } private void initUI() { findViewById(R.id.image_ise_set).setOnClickListener(IseDemo.this); mEvaTextEditText = (EditText) findViewById(R.id.ise_eva_text); mResultEditText = (EditText)findViewById(R.id.ise_result_text); mIseStartButton = (Button) findViewById(R.id.ise_start); mIseStartButton.setOnClickListener(IseDemo.this); findViewById(R.id.ise_parse).setOnClickListener(IseDemo.this); findViewById(R.id.ise_stop).setOnClickListener(IseDemo.this); findViewById(R.id.ise_cancel).setOnClickListener(IseDemo.this); mToast = Toast.makeText(IseDemo.this, "", Toast.LENGTH_LONG); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.image_ise_set: Intent intent = new Intent(IseDemo.this, IseSettings.class); startActivityForResult(intent, REQUEST_CODE_SETTINGS); break; case R.id.ise_start: if (mIse == null) { return; } String evaText = mEvaTextEditText.getText().toString(); mLastResult = null; mResultEditText.setText(""); mResultEditText.setHint("请朗读以上内容"); mIseStartButton.setEnabled(false); setParams(); mIse.startEvaluating(evaText, null, mEvaluatorListener); break; case R.id.ise_parse: // 解析最终结果 if (!TextUtils.isEmpty(mLastResult)) { XmlResultParser resultParser = new XmlResultParser(); Result result = resultParser.parse(mLastResult); if (null != result) { mResultEditText.setText(result.toString()); } else { showTip("结析结果为空"); } } break; case R.id.ise_stop: if (mIse.isEvaluating()) { mResultEditText.setHint("评测已停止,等待结果中..."); mIse.stopEvaluating(); } break; case R.id.ise_cancel: { mIse.cancel(); mIseStartButton.setEnabled(true); mResultEditText.setText(""); mResultEditText.setHint("请点击“开始评测”按钮"); mLastResult = null; break; } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (REQUEST_CODE_SETTINGS == requestCode) { setEvaText(); } } @Override protected void onDestroy() { super.onDestroy(); if (null != mIse) { mIse.destroy(); mIse = null; } } // 设置评测试题 private void setEvaText() { SharedPreferences pref = getSharedPreferences(PREFER_NAME, MODE_PRIVATE); language = pref.getString(SpeechConstant.LANGUAGE, "zh_cn"); category = pref.getString(SpeechConstant.ISE_CATEGORY, "read_sentence"); String text = ""; if ("en_us".equals(language)) { if ("read_word".equals(category)) { text = getString(R.string.text_en_word); } else if ("read_sentence".equals(category)) { text = getString(R.string.text_en_sentence); } } else { // 中文评测 if ("read_syllable".equals(category)) { text = getString(R.string.text_cn_syllable); } else if ("read_word".equals(category)) { text = getString(R.string.text_cn_word); } else if ("read_sentence".equals(category)) { text = getString(R.string.text_cn_sentence); } } mEvaTextEditText.setText(text); mResultEditText.setText(""); mLastResult = null; mResultEditText.setHint("请点击“开始评测”按钮"); } private void showTip(String str) { if(!TextUtils.isEmpty(str)) { mToast.setText(str); mToast.show(); } } private void setParams() { SharedPreferences pref = getSharedPreferences(PREFER_NAME, MODE_PRIVATE); // 设置评测语言 language = pref.getString(SpeechConstant.LANGUAGE, "zh_cn"); // 设置需要评测的类型 category = pref.getString(SpeechConstant.ISE_CATEGORY, "read_sentence"); // 设置结果等级(中文仅支持complete) result_level = pref.getString(SpeechConstant.RESULT_LEVEL, "complete"); // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 String vad_bos = pref.getString(SpeechConstant.VAD_BOS, "5000"); // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音 String vad_eos = pref.getString(SpeechConstant.VAD_EOS, "1800"); // 语音输入超时时间,即用户最多可以连续说多长时间; String speech_timeout = pref.getString(SpeechConstant.KEY_SPEECH_TIMEOUT, "-1"); mIse.setParameter(SpeechConstant.LANGUAGE, language); mIse.setParameter(SpeechConstant.ISE_CATEGORY, category); mIse.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8"); mIse.setParameter(SpeechConstant.VAD_BOS, vad_bos); mIse.setParameter(SpeechConstant.VAD_EOS, vad_eos); mIse.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, speech_timeout); mIse.setParameter(SpeechConstant.RESULT_LEVEL, result_level); // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 mIse.setParameter(SpeechConstant.AUDIO_FORMAT,"wav"); mIse.setParameter(SpeechConstant.ISE_AUDIO_PATH, Environment.getExternalStorageDirectory().getAbsolutePath() + "/msc/ise.wav"); } @Override protected void onResume() { // 开放统计 移动数据统计分析 FlowerCollector.onResume(IseDemo.this); FlowerCollector.onPageStart(TAG); super.onResume(); } @Override protected void onPause() { // 开放统计 移动数据统计分析 FlowerCollector.onPageEnd(TAG); FlowerCollector.onPause(IseDemo.this); super.onPause(); } }