关键词识别和语音听写还是有差别的,语音听写是直接将所说的话转化成语音,至于识别的准确率看所说的话是否是常用的,如果遇到不常见的词比如
背身腿降这个指令,识别出来的就是乱七八糟的。而关键词识别也就是针对这种关键词识别有很好的效果,在于你自己构建一个.bnf文件,然后写上关键词

#BNF+IAT 1.0 UTF-8;
!grammar call;
!slot <contact>;
!slot <callPre>;
!slot <callPhone>;
!slot <callTo>;
!start <callStart>;
<callStart>:[<callPre>];
<callPre>:北盛|背升|结束|背平|北平|备品|腿升|腿伸|腿平|坐立|躺平|停止|左翻身|有翻身|右翻身|开盖|灌溉|关盖|打包|打开电源|关闭电源|调节|打包|烘干|男性清晰|男性清洗|女性清晰|女性清洗;

其实需要修改的就是后面中文。
然后下载官方的关键词识别库,包括libs里面的两个文件和Msc.jar包,然后我重新在main下面和java同级建立一个jniLibs目录,里面放的如下文件
实际上官方下载只有两个,以至于我后来测试一直报10107错误,我就百度讯飞10107错误,解释是

于是查看文章里面

可是这个类是mAsr自带的,这个参数我也没法修改,于是我在科大讯飞工作平台提交了工作单


很感谢日均两问的回复,最后我找到了最原始的也就是里面含有7个库的文件,这下语法直接构建成功了。这是我在做关键词识别的时候遇到的最大的问题
现在发一下代码
工具类构建语法BuildLocalGrammer

public abstract class BuildLocalGrammer {/*** 构建语法的回调** @param errMsg null 构造成功*/public abstract void result(String errMsg, String grammarId);// Log标签private static final String TAG = "BuildLocalGrammar";public static final String GRAMMAR_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/msc/test";// 上下文private Context mContext;// 语音识别对象private SpeechRecognizer mAsr;public BuildLocalGrammer(Context context) {mContext = context;// 初始化识别对象mAsr = SpeechRecognizer.createRecognizer(context, new InitListener() {@Overridepublic void onInit(int code) {Log.d(TAG, "SpeechRecognizer init() code = " + code);if (code != ErrorCode.SUCCESS) {result(code + "", null);Log.d(TAG, "初始化失败,错误码:" + code);Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();}}});};/*** 构建语法** @return*/public void buildLocalGrammar() {try {/** TODO 如果你要在程序里维护bnf文件,可以在这里加上你维护的一些逻辑* 如果不嫌麻烦,要一直改bnf文件,这里的代码可以不用动,不过我个人不建议一直手动修改bnf文件* ,内容多了以后很容易出错,不好找Bug,建议每次改之前先备份。 建议用程序维护bnf文件。*//** 构建语法*/String mContent;// 语法、词典临时变量String mLocalGrammar = FucUtil.readFile(mContext, "call.bnf", "utf-8");mContent = new String(mLocalGrammar);mAsr.setParameter(SpeechConstant.PARAMS, null);// 设置文本编码格式mAsr.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");// 设置引擎类型mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);// 设置语法构建路径mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, GRAMMAR_PATH);// 使用8k音频的时候请解开注释// mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000");// 设置资源路径mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());// 构建语法int ret = mAsr.buildGrammar("bnf", mContent, new GrammarListener() {@Overridepublic void onBuildFinish(String grammarId, SpeechError error) {if (error == null) {Log.d(TAG, "语法构建成功");result(null, grammarId);} else {Log.d(TAG, "语法构建失败,错误码:" + error.getErrorCode());result(error.getErrorCode() + "", grammarId);}}});if (ret != ErrorCode.SUCCESS) {Log.d(TAG, "语法构建失败,错误码:" + ret);result(ret + "", null);}} catch (Exception e) {e.printStackTrace();}}// 获取识别资源路径private String getResourcePath() {StringBuffer tempBuffer = new StringBuffer();// 识别通用资源tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "asr/common.jet"));// 识别8k资源-使用8k的时候请解开注释// tempBuffer.append(";");// tempBuffer.append(ResourceUtil.generateResourcePath(this,// RESOURCE_TYPE.assets, "asr/common_8k.jet"));return tempBuffer.toString();}}

识别类KqwSpeechRecognizer

public abstract class KqwSpeechRecognizer {/*** 初始化的回调** @param flag*            true 初始化成功 false 初始化失败*/public abstract void initListener(boolean flag);public abstract void resultData(String data);public abstract void speechLog(String log);// Log标签private static final String TAG = "KqwLocal";private Toast mToast;public static final String GRAMMAR_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/msc/test";// 上下文private Context mContext;// 语音识别对象private SpeechRecognizer mAsr;public KqwSpeechRecognizer(Context context) {mContext = context;// 初始化识别对象mAsr = SpeechRecognizer.createRecognizer(context, new InitListener() {@Overridepublic void onInit(int code) {Log.d(TAG,   code+"");if (code != ErrorCode.SUCCESS) {initListener(false);Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();} else {initListener(true);}}});}/*** 参数设置*/public void setParam() {// 清空参数mAsr.setParameter(SpeechConstant.PARAMS, null);// 设置识别引擎 本地引擎mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);// mAsr.setParameter(SpeechConstant.ENGINE_TYPE,// SpeechConstant.TYPE_MIX);// mAsr.setParameter(SpeechConstant.ENGINE_TYPE, "mixed");// // 设置本地识别资源mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());// 设置语法构建路径mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, GRAMMAR_PATH);// 设置返回结果格式mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json");// 设置本地识别使用语法idmAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, "call");// 设置识别的门限值mAsr.setParameter(SpeechConstant.MIXED_THRESHOLD, "60");// 使用8k音频的时候请解开注释// mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000");mAsr.setParameter(SpeechConstant.DOMAIN, "iat");mAsr.setParameter(SpeechConstant.NLP_VERSION, "2.0");mAsr.setParameter("asr_sch", "1");// mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json");}// 获取识别资源路径private String getResourcePath() {StringBuffer tempBuffer = new StringBuffer();// 识别通用资源tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "asr/common.jet"));// 识别8k资源-使用8k的时候请解开注释// tempBuffer.append(";");// tempBuffer.append(ResourceUtil.generateResourcePath(this,// RESOURCE_TYPE.assets, "asr/common_8k.jet"));return tempBuffer.toString();}int ret = 0;// 函数调用返回值/*** 开始识别*/public void startListening() {// 设置参数setParam();ret = mAsr.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {Log.i(TAG, "识别失败,错误码: " + ret);}}public void stopListening(){mAsr.stopListening();}/*** 识别监听器。*/private RecognizerListener mRecognizerListener = new RecognizerListener() {StringBuffer stringBuffer = new StringBuffer();public void onVolumeChanged(int volume) {Log.i(TAG, "当前正在说话,音量大小:" + volume);speechLog("当前正在说话,音量大小:" + volume);}@Overridepublic void onResult(final RecognizerResult result, boolean isLast) {/** TODO 拼接返回的数据** 这里返回的是Json数据,具体返回的是离线名命令词返回的Json还是语义返回的Json,需要做判断以后在对数据数据进行拼接*/stringBuffer.append(result.getResultString()).append("\n\n");// isLast为true的时候,表示一句话说完,将拼接后的完整的一句话返回if (isLast) {// 数据回调resultData(stringBuffer.toString());}}@Overridepublic void onEndOfSpeech() {showTip("结束说话");speechLog("结束说话");}@Overridepublic void onVolumeChanged(int i, byte[] bytes) {}@Overridepublic void onBeginOfSpeech() {stringBuffer.delete(0, stringBuffer.length());showTip("开始说话");speechLog("开始说话");}@Overridepublic void onError(SpeechError error) {Log.i(TAG, "error = " + error.getErrorCode());if (error.getErrorCode() == 20005) {// 本地命令词没有识别,也没有请求到网络resultData("没有构建的语法");speechLog("没有构建的语法");/** TODO* 当网络正常的情况下是不会回调20005的错误,只有当本地命令词识别不匹配,网络请求也失败的情况下,会返回20005* 这里可以自己再做处理,例如回复“没有听清”等回复*/} else {/** TODO* 其他错误有很多,需要具体问题具体分析,正常在程序没有错误的情况下,只会回调一个没有检测到说话的错误,没记错的话错误码是10118*/}}@Overridepublic void onEvent(int eventType, int arg1, int arg2, Bundle obj) {Log.i(TAG, "eventType = " + eventType);}};private void showTip(final String str) {new Thread (new Runnable() {@Overridepublic void run() {mToast.setText(str);mToast.show();}});}}

然后再mainActivity就可以直接使用了

public class MainActivity extends Activity {private TextView mTvResult;private TextView mTvLog;private BuildLocalGrammar buildLocalGrammar;private KqwSpeechRecognizer kqwSpeechRecognizer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);SpeechUtility.createUtility(this, SpeechConstant.APPID+"=5de9a6f7");mTvResult = (TextView) findViewById(R.id.tv_result);mTvLog = (TextView) findViewById(R.id.tv_log);/*** 初始化本地语法构造器*/buildLocalGrammar = new BuildLocalGrammar(this) {@Overridepublic void result(String errMsg, String grammarId) {// errMsg为null 构造成功if (TextUtils.isEmpty(errMsg)) {Toast.makeText(MainActivity.this, "构造成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "构造失败", Toast.LENGTH_SHORT).show();}}};/*** 初始化离线命令词识别器*/kqwSpeechRecognizer = new KqwSpeechRecognizer(this) {@Overridepublic void speechLog(String log) {// 录音Log信息的回调mTvLog.setText(log);}@Overridepublic void resultData(String data) {// 是识别结果的回调mTvResult.setText(data);}@Overridepublic void initListener(boolean flag) {// 初始化的回调if (flag) {Toast.makeText(MainActivity.this, "初始化成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show();}}};/*** 构造本地语法文件,只有语法文件有变化的时候构造成功一次即可,不用每次都构造*/buildLocalGrammar.buildLocalGrammar();}/*** 开始识别按钮** @param view*/public void start(View view) {mTvResult.setText(null);// 开始识别kqwSpeechRecognizer.startListening();}}

项目代码上传到Github上

科大讯飞离线关键词识别(语法识别)(2)相关推荐

  1. 科大讯飞离线语音命令词识别的使用说明

        最近因为项目的需求,需要在无网络的情况下实现语音识别的功能,因为之前在线识别一直用的科大的,所以经理就和我说,你花半天时间简单熟悉一下,然后出一个Demo,下午有人过来看:因为之前科大在线SR ...

  2. 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别

    0x00 离线命令词识别简介 语音识别技术(Auto Speech Recognize,简称ASR),就是把人的自然语言音频数据转换成文本数据的技术.理论上在线ASR是可以把所有的语音转换成对应的文本 ...

  3. 科大讯飞离线命令词识别

    一.进入科大讯飞官网,下载自己所需要的SDK----以离线命令词识别为例: 二.分析代码-----主要有以下四大函数 const char *get_audio_file(void); //选择进行离 ...

  4. 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)

    QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...

  5. ROS 科大讯飞语音(三)识别篇

    ROS 科大讯飞语音(三)识别篇 环境准备 安装声卡驱动库 sudo apt-get install libasound2-dev 将demo里面的call.bnf拷贝到/Robot/voice/ca ...

  6. 讯飞离线语音命令词识别

    讯飞离线语音命令词识别 强烈推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang ...

  7. 讯飞语音——离线命令词+语义识别

    讯飞语音--离线命令词+语义识别 意思就是先走离线命令词识别,如果离线命令词识别没有识别到结果,那么就再走语义接口,如果已开通对应场景,则转为语义,如果没有开通对应场景,则将语音转为文字 效果图 说的 ...

  8. UniAPP离线车牌实时扫描识别

    插件说明 Android离线车牌实时扫描识别 标签:车牌实时识别 车牌离线识别 车牌实时扫描 车牌离线扫描 车牌实时离线识别 车牌实时离线扫描 特点: 1.使用方便,引入即可: 2.响应快速,原生体验 ...

  9. Umi-OCR,可离线使用的OCR识别工具

    一款纯粹的本地化的离线OCR识别,在Github上开源免费,你不需联网,运行软件后即可识别. 主要特性 免费:Github上开源免费软件. 方便:绿色版,不需安装,解压即可使用,不需要联网 准确:采用 ...

最新文章

  1. JavaScript数组去重算法实例
  2. ice mac 安装
  3. 万万没想到,分布式存储系统的一致性是......
  4. Mac 终端提示:The default interactive shell is now zsh.
  5. python的多行语句可以使用反斜杠_python 为什么不用分号作终止符?
  6. 解决ora-00054 Oracle锁表问题
  7. 腾讯校招开奖,总包拿了 68w!
  8. 解决2345劫持主页的办法--火绒2345专杀
  9. open62541中文文档
  10. H5+springboot(集成ffmpeg)实现前端视频录制以及webm格式转mp4
  11. KNN分类USPS, USI sonar及USI iris
  12. java spring security详解
  13. 简单几招,教你将GIF动图转换为JPG图片
  14. HONOR Magicbook 进不了系统
  15. 左耳朵耗子:从“打工人”到技术创业者,我是如何作死的
  16. [教程]安装青鸟云Web服务器
  17. python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论
  18. 这款台灯,不仅能护眼,还能点读和互动
  19. ifc文件转换成obj和mtl文件
  20. 币圈人警惕!5大错误足以摧毁你的一切

热门文章

  1. 全球最大的搜索引擎 Google 推出的站长赚钱计划,看了就知道!
  2. Unity Draw Call
  3. 关于怎么降低drawcall
  4. Java学习四阶段-09 Sentinel限流熔断
  5. 【生物信息】ecDNA染色体外环状DNA的识别——AmpliconArchitect算法
  6. FastDFS,Redis,Solr,ActiveMQ核心技术整合一
  7. 迷宫的非递归求解 C语言 数据结构课程设计
  8. 【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题
  9. flex vue 垂直居中居上_vue 弹性布局 实现长图垂直居上,短图垂直居中
  10. malloc与kmalloc