我使用的服务是: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
个赞
请登录后评论
TOP
切换版块
可能原因是录音机被占用了。