最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别、语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不到人帮忙解决(地图开发者群里都是潜水的)...不得不说,科大讯飞在语音这块尤其是中文识别方面做的真心不错,而且Android还支持离线识别。
讯飞官方给的文档内容很详细,在这我就不赘述了。在开发中,由于一些原因需要用到离线识别这块,就学习了一下。讯飞离线识别只支持Android系统,使用时需要安装讯飞语音+,同时还要自己写离现实别的字典(BNF)。关于BNF的文档,我会在后面放出下载连接。在这里先给个简单的BNF样例:
1 #BNF+IAT 1.0 utf-8; 2 !grammar call; 3 !slot <list>; 4 !start <speech>; 5 <speech>:<list>; 6 <list>:盲人听书|在线音乐|影音播放|小说;
当要更新BNF时,确切的说应该是更新某个槽(<slot>)时,可以调用SpeechRecognize的updateLexicon。例如更新以上BNF的槽,用如下代码即可:
1 String grammar = "你好\n我好\n大家好\n广州好迪\n"; 2 mSpeechRecognize.updateLexicon("<list>",grammar,mLexiconListener); 3 /** 4 * 初始化词典更新完成回调接口 5 */ 6 private LexiconListener mLexiconListener = new LexiconListener() { 7 8 @Override 9 public void onLexiconUpdated(String grammarId, SpeechError errorCode) { 10 if (errorCode == null) { 11 Log.d(TAG, "词典更新成功!Grammar ID:" + grammarId); 12 } else { 13 Log.d(TAG, "词典更新失败!Error Code:" + errorCode.getErrorCode()); 14 } 15 } 16 17 };
嗯,就是这样,语法文件其实不难写,离线词典动态更新其实也不难。
相关资源:BNF开发文档