执行onTouch方法,没有说话就报错:识别失败:"没有匹配的识别结果:7
iOS祁伟鹏 发布于2016-10 浏览:1573 回复:1
0
收藏

我使用的服务是:Android语音识别离在线

调用的接口是:

// 创建识别器
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context, new ComponentName(context, VoiceRecognitionService.class));
// 注册监听器
speechRecognizer.setRecognitionListener(this); Intent intent = new Intent();
bindParams(intent);
speechRecognizer.startListening(intent);

参数设置情况:


开发平台和机型:安卓 oppo R7

SDK版本号:2.1.20

代码或日志截图(上传截图能帮助您更快解决问题):

public class SpeakButton extends Button implements RecognitionListener {
Context context;
   private SpeechRecognizer speechRecognizer;

   public SpeakButton(Context context) {
this(context,null);
   }

public SpeakButton(Context context, AttributeSet attrs) {
this(context, attrs,0);
   }

public SpeakButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
       this.context = context;
       // 创建识别器
       speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context, new ComponentName(context, VoiceRecognitionService.class));
       // 注册监听器
       speechRecognizer.setRecognitionListener(this);
   }

private static final String TAG = "SpeakButton";
   @Override
   public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "onTouch开始识别Event: " );

               startASR();

               break;
           case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
//停止录音
               speechRecognizer.stopListening();
               //停止识别
               speechRecognizer.cancel();
               break;

       }
return super.onTouchEvent(event);
   }

// 开始识别
   void startASR() {
Intent intent = new Intent();
       bindParams(intent);
       speechRecognizer.startListening(intent);
   }

/**
    * 准备就绪
    * 只有当此方法回调之后才能开始说话,否则会影响识别结果。
    * @param params 识别参数
    */
   @Override
   public void onReadyForSpeech(Bundle params) {

}

/**
    * 开始说话
    * 当用户开始说话,会回调此方法。
    */
   @Override
   public void onBeginningOfSpeech() {

}

/**
    * 音量变化
    * 引擎将对每一帧语音回调一次该方法返回音量值
    * @param rmsdB 音量值
    */
   @Override
   public void onRmsChanged(float rmsdB) {

}

/**
    * 获取原始语音
    * 此方法会被回调多次,buffer是当前帧对应的PCM语音数据,拼接后可得到完整的录音数据
    * @param buffer pcm语音数据
    */
   @Override
   public void onBufferReceived(byte[] buffer) {

}

/**
    * 说话结束
    * 当用户停止说话后,将会回调此方法。
    */
   @Override
   public void onEndOfSpeech() {

}

/**
    * 识别出错
    * 识别出错,将会回调此方法,调用该方法之后将不再调用onResults方法
    * @param error
    */
   @Override
   public void onError(int error) {
StringBuilder sb = new StringBuilder();
       switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
sb.append("音频问题");
               break;
           case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
sb.append("没有语音输入");
               break;
           case SpeechRecognizer.ERROR_CLIENT:
sb.append("其它客户端错误");
               break;
           case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
sb.append("权限不足");
               break;
           case SpeechRecognizer.ERROR_NETWORK:
sb.append("网络问题");
               break;
           case SpeechRecognizer.ERROR_NO_MATCH:
sb.append("没有匹配的识别结果");
               break;
           case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
sb.append("引擎忙");
               break;
           case SpeechRecognizer.ERROR_SERVER:
sb.append("服务端错误");
               break;
           case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
sb.append("连接超时");
               break;
       }
sb.append(":" + error);
       Log.e(TAG, "onResults: \"识别失败:\"" + sb.toString());
   }

/**
    * 识别最终结果
    * 返回最终识别结果,将会回调此方法。
    * @param results 识别结果
    */
   @Override
   public void onResults(Bundle results) {
Log.e(TAG, "onResults: \"识别成功:\"" );
       String json_res = results.getString("origin_result");
   }

/**
    * 识别临时结果
    * 返回临时识别结果,将会回调此方法。
    * @param partialResults 临时识别结果
    */
   @Override
   public void onPartialResults(Bundle partialResults) {

}

/**
    * 识别事件返回
    * 返回识别事件,将会回调此方法。
    * @param eventType 事件类型
    * @param params 参数
    */
   @Override
   public void onEvent(int eventType, Bundle params) {

}

public void bindParams(Intent intent) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
       if (sp.getBoolean("tips_sound", true)) {
intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);
           intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);
           intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);
           intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);
           intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);
       }
if (sp.contains(Constant.EXTRA_INFILE)) {
String tmp = sp.getString(Constant.EXTRA_INFILE, "").replaceAll(",.*", "").trim();
           intent.putExtra(Constant.EXTRA_INFILE, tmp);
       }
if (sp.getBoolean(Constant.EXTRA_OUTFILE, false)) {
intent.putExtra(Constant.EXTRA_OUTFILE, "sdcard/outfile.pcm");
       }
if (sp.getBoolean(Constant.EXTRA_GRAMMAR, false)) {
intent.putExtra(Constant.EXTRA_GRAMMAR, "assets:///baidu_speech_grammar.bsg");
       }
if (sp.contains(Constant.EXTRA_SAMPLE)) {
String tmp = sp.getString(Constant.EXTRA_SAMPLE, "").replaceAll(",.*", "").trim();
           if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_SAMPLE, Integer.parseInt(tmp));
           }
}
if (sp.contains(Constant.EXTRA_LANGUAGE)) {
String tmp = sp.getString(Constant.EXTRA_LANGUAGE, "").replaceAll(",.*", "").trim();
           if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_LANGUAGE, tmp);
           }
}
if (sp.contains(Constant.EXTRA_NLU)) {
String tmp = sp.getString(Constant.EXTRA_NLU, "").replaceAll(",.*", "").trim();
           if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_NLU, tmp);
           }
}

if (sp.contains(Constant.EXTRA_VAD)) {
String tmp = sp.getString(Constant.EXTRA_VAD, "").replaceAll(",.*", "").trim();
           if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_VAD, tmp);
           }
}
String prop = null;
       if (sp.contains(Constant.EXTRA_PROP)) {
String tmp = sp.getString(Constant.EXTRA_PROP, "").replaceAll(",.*", "").trim();
           if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_PROP, Integer.parseInt(tmp));
               prop = tmp;
           }
}

// offline asr
       {
intent.putExtra(Constant.EXTRA_OFFLINE_ASR_BASE_FILE_PATH, "/sdcard/easr/s_1");
           if (null != prop) {
int propInt = Integer.parseInt(prop);
               if (propInt == 10060) {
intent.putExtra(Constant.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/sdcard/easr/s_2_Navi");
               } else if (propInt == 20000) {
intent.putExtra(Constant.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/sdcard/easr/s_2_InputMethod");
               }
}
intent.putExtra(Constant.EXTRA_OFFLINE_SLOT_DATA, buildTestSlotData());
       }
}


private String buildTestSlotData()
{
JSONObject localJSONObject = new JSONObject();
       new JSONArray().put("李涌泉").put("郭下纶");
       new JSONArray().put("七里香").put("发如雪");
       new JSONArray().put("周杰伦").put("李世龙");
       new JSONArray().put("手机百度").put("百度地图");
       new JSONArray().put("关灯").put("开门");
       return localJSONObject.toString();
   }
}


复现步骤、现象及其他描述:触摸控件,不说话,就提示:识别失败:"没有匹配的识别结果:7

收藏
点赞
0
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#2水寒319回复于2016-10

可能原因是录音机被占用了。

0
TOP
切换版块