我是靠谱客的博主 大意冰棍,最近开发中收集的这篇文章主要介绍Android端实现科大讯飞持续的语音监听,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

科大讯飞默认只提供单次的点击式语音监听解析,比较麻烦,所以需要我们手动实现,解放双手!

持续监听需要做到两点:

1.、 在讯飞自己检测到停止的回调中再次开启;

/**
	 * 听写监听器。
	 */
	private RecognizerListener mRecognizerListener = new RecognizerListener() {

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

		@Override
		public void onError(SpeechError error) {
			// Tips:
			// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。

            showTip(error.getPlainDescription(true));

		}

		@Override
		public void onEndOfSpeech() {
			// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
//			showTip("结束说话");
			IatStart();//在这里检测到识别完毕之后,我们再次重新启动监听!!!!!!!!!!!!
		}

		@Override
		public void onResult(RecognizerResult results, boolean isLast) {
			Log.d(TAG, results.getResultString());
			System.out.println(flg++);
			if (resultType.equals("json")) {

			    printResult(results);

			}else if(resultType.equals("plain")) {
				buffer.append(results.getResultString());
				mResultText.setText(buffer.toString());
				mResultText.setSelection(mResultText.length());
			}

			if (isLast & cyclic) {
				// TODO 最后的结果
				Message message = Message.obtain();
				message.what = 0x001;
				han.sendMessageDelayed(message,100);
			}
		}

		@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提供给技术支持人员,可用于查询会话日志,定位出错原因
			// 若使用本地能力,会话id为null
			//	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
			//		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
			//		Log.d(TAG, "session id =" + sid);
			//	}
		}
	};

 2、 在语音解析回来的回调中,先 IatStop() 停止监听,送后端做语义解析,解析完成之后再手动开启 IatStart()最后这里是开启和停止监听的方法

/**
	 * 听写UI监听器
	 */
	private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
		public void onResult(RecognizerResult results, boolean isLast) {
			IatStop();//在这里先停止监听!!!!!!!!!
		    printResult(results);
		}

		/**
		 * 识别回调错误.
		 */
		public void onError(SpeechError error) {
		    showTip(error.getPlainDescription(true));
		}
	};

private void printResult(RecognizerResult results) {
		mIatDialog.dismiss();
		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));
		}
		mResultText.setText(resultBuffer.toString());
		mResultText.setSelection(mResultText.length());
		IatStart();//在这里重新启动!!!!!!!!!
	}

最后附上开启和停止监听的方法!

/**
	 * 开始录音监听
	 * @return
	 */
	public void IatStart() {
		mIatResults.clear();
		int ret = mIat.startListening(mRecognizerListener);
		if (ret != ErrorCode.SUCCESS) {
			showTip("听写错误,错误码:" + ret);
		}
	}

	/**
	 * 停止录音监听
	 */
	public void IatStop() {
		mIat.stopListening();
	}

 

最后

以上就是大意冰棍为你收集整理的Android端实现科大讯飞持续的语音监听的全部内容,希望文章能够帮你解决Android端实现科大讯飞持续的语音监听所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部