我是靠谱客的博主 大意冰棍,这篇文章主要介绍Android端实现科大讯飞持续的语音监听,现在分享给大家,希望可以做个参考。

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

持续监听需要做到两点:

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/** * 听写监听器。 */ 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()最后这里是开启和停止监听的方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/** * 听写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();//在这里重新启动!!!!!!!!! }

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** * 开始录音监听 * @return */ public void IatStart() { mIatResults.clear(); int ret = mIat.startListening(mRecognizerListener); if (ret != ErrorCode.SUCCESS) { showTip("听写错误,错误码:" + ret); } } /** * 停止录音监听 */ public void IatStop() { mIat.stopListening(); }

 

最后

以上就是大意冰棍最近收集整理的关于Android端实现科大讯飞持续的语音监听的全部内容,更多相关Android端实现科大讯飞持续内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部