概述
科大讯飞默认只提供单次的点击式语音监听解析,比较麻烦,所以需要我们手动实现,解放双手!
持续监听需要做到两点:
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端实现科大讯飞持续的语音监听所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复