集成讯飞SDK,实现离线命令词、离线语音合成、离线唤醒,语音在线/离线听写
关于讯飞开发平台的注册以及SDK下载:##
##请参考:
http://blog.csdn.net/weixin_39923324/article/details/78924892
强烈推荐
分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang
##· 离线名命令词
##· 离线语音合成
##· 离线唤醒
##· 语音在线听写
准备工作:
1、jar包 地址:https://pan.baidu.com/s/1hsanJBe密码:523z2、权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_SETTINGS"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3.初始化引擎我的appid已經沒有装机量,有些功能不能测试。
public void registerApp(Context context) {StringBuffer param = new StringBuffer();param.append("appid=5a4448f4");param.append(",");param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);SpeechUtility.createUtility(context, param.toString());}
别忘了,在功能清单中申明Application 。
##一、离线命令词
·Model层
离线命令的几个方法。
public interface IOcwBIZ {/*** 初始化** @param initListener*/void createRecognizer(InitListener initListener);/*** 构件语法** @param onBuildGrammar*/void localGrammar(OnBuildGrammar onBuildGrammar);/*** 开始识别** @param onResultListener* @param recognizerListener*/void onResult(OnResultListener onResultListener, RecognizerListener recognizerListener);/*** 销毁对象*/void destroyObj();
实现方法
@Overridepublic void createRecognizer(InitListener initListener) {mAsr = SpeechRecognizer.createRecognizer(context, initListener);}
@Overridepublic void localGrammar(final OnBuildGrammar onBuildGrammar) {//读取本地文件,我的离线命令词在SD卡String order = readOrderTxt(new File(SDCardUtils.getSDCardPath(), "order.hyco"));if (TextUtils.isEmpty(order)) {Log.e(TAG, "setParam: order 文件读取有误");}StringBuffer stringBuffer = new StringBuffer();try {JSONArray ja = new JSONArray(order);for (int i = 0; i < ja.length(); i++) {JSONObject jo = (JSONObject) ja.get(i);stringBuffer.append("|").append(jo.getString("order"));}} catch (JSONException e) {e.printStackTrace();Log.e(TAG, "setParam: order 文件格式有误");stringBuffer.append("|").append("西湖美景|塞外沙漠");}//采用bnf构建命令StringBuffer sb = new StringBuffer();sb.append("#BNF+IAT 1.0 UTF-8;\n").append("!grammar call;\n").append("!slot <single>;\n").append("!slot <zero>;\n").append("!start <callStart>;\n").append("<callStart>:").append("[<zero>][<zero>][<zero>][<zero>][<zero>][<zero>][<zero>][<zero>][<zero>]<zero>|<single>;\n").append("<zero>:").append(KEY_ZERO).append(";\n").append("<one>:").append(KEY_ZERO).append(";\n").append("<two>:").append(KEY_ZERO).append(";\n").append("<three>:").append(KEY_ZERO).append(";\n").append("<single>:").append(stringBuffer.toString().substring(1)).append(";\n");if (null == mAsr) {// TODO: 2017/12/29 请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化onBuildGrammar.initFailure("创建对象失败。");return;}mAsr.setParameter(SpeechConstant.PARAMS, null);// 设置文本编码格式mAsr.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");// 设置引擎类型mAsr.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);// 设置语法构建路径mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());ret = mAsr.buildGrammar(GRAMMAR_TYPE_BNF, sb.toString(), new GrammarListener() {@Overridepublic void onBuildFinish(String grammarId, SpeechError error) {if (error == null) {if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {SharedPreferences.Editor editor = mSharedPreferences.edit();if (!TextUtils.isEmpty(grammarId))editor.putString(KEY_GRAMMAR_ABNF_ID, grammarId);editor.commit();}onBuildGrammar.buildGrammarSuccess("语法构建成功:" + grammarId);} else {onBuildGrammar.buildGrammarError("语法构建失败,错误码:" + error.getErrorCode());}}});if (ret != ErrorCode.SUCCESS) {onBuildGrammar.buildGrammarError("语法构建失败,错误码:" + ret);}}
@Overridepublic void onResult(OnResultListener onResultListener, RecognizerListener recognizerListener) {if (null == mAsr) {// TODO: 2017/12/29 请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化onResultListener.initFailure("创建对象失败。");return;}// 设置参数if (!setParam()) {onResultListener.unBuildGrammar("语法未构建或构建失败");return;}ret = mAsr.startListening(recognizerListener);if (ret != ErrorCode.SUCCESS) {onResultListener.notFindOrder("识别失败,错误码: " + ret);}}
@Overridepublic void destroyObj() {if (null != mAsr) {// 退出时释放连接mAsr.cancel();mAsr.destroy();}}
上述就是主要的核心方法,在onCreat()中调用初始化方法,在实现onClick()之前调用构建语法的方法,在onClick()s时调用开始识别的方法,退出界面时调用销毁的方法。
##二、离线语音合成
这些方法可以酌情处理。
/*** 初始化** @param mTtsInitListener* @return*/boolean createSynthesizer(InitListener mTtsInitListener);/*** 开始播放** @param message* @param mTtsListener* @return*/int startSpeaking(String message, SynthesizerListener mTtsListener);/*** 取消播放*/void stopSpeaking();/*** 暂停播放*/void pauseSpeaking();/*** 继续播放*/void resumeSpeaking();/*** 销毁对象*/void destroyObj();
初始化
@Overridepublic boolean createSynthesizer(InitListener mTtsInitListener) {// 初始化合成对象mTts = SpeechSynthesizer.createSynthesizer(context, mTtsInitListener);return mTts != null;}
开始播放
@Overridepublic int startSpeaking(String message, SynthesizerListener mTtsListener) {setParam();int code = mTts.startSpeaking(message, mTtsListener);return code;}
取消播放
@Overridepublic void stopSpeaking() {mTts.stopSpeaking();}
暂停播放
@Overridepublic void pauseSpeaking() {mTts.pauseSpeaking();}
继续播放
@Overridepublic void resumeSpeaking() {mTts.resumeSpeaking();}
销毁对象
@Overridepublic void destroyObj() {if (null != mTts) {mTts.stopSpeaking();// 退出时释放连接mTts.destroy();}}
暂停播放和继续播放俩个方法,可以视情况取消,不影响操作。当然也可以读取本地的文件,这样就实现了小说朗读功能了。也可以做成服务,实现听书功能。
##三、离线唤醒
离线唤醒,就是当手机处于待机黑屏状态,还能接受到特定的语音.
目前我的唤醒词为:
1.启动语音
2.八戒醒来
3.开机开机
4.来客人了
5.浩创科技
上代码:
public interface IWakeBIZ {/*** 初始化** @return*/boolean createWakeUp();/*** 开启唤醒** @param mWakeuperListener* @param onInit*/void startWakeUp(WakeuperListener mWakeuperListener, OnInit onInit);/*** 停止唤醒*/void stopWakeUp();/*** 销毁对象*/void destroyObj();}
//初始化@Overridepublic boolean createWakeUp() {mIvw = VoiceWakeuper.createWakeuper(context, null);return null != mIvw;}//启动唤醒@Overridepublic void startWakeUp(WakeuperListener mWakeuperListener, OnInit onInit) {//非空判断,防止因空指针使程序崩溃mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {// 清空参数mIvw.setParameter(SpeechConstant.PARAMS, null);// 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + curThresh);// 设置唤醒模式mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");// 设置持续进行唤醒mIvw.setParameter(SpeechConstant.KEEP_ALIVE, keep_alive);// 设置闭环优化网络模式mIvw.setParameter(SpeechConstant.IVW_NET_MODE, ivwNetMode);// 设置唤醒资源路径mIvw.setParameter(SpeechConstant.IVW_RES_PATH, getResource());// 设置唤醒录音保存路径,保存最近一分钟的音频mIvw.setParameter(SpeechConstant.IVW_AUDIO_PATH, Environment.getExternalStorageDirectory().getPath() + "/hyco/ivw.wav");mIvw.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");// 如有需要,设置 NOTIFY_RECORD_DATA 以实时通过 onEvent 返回录音音频流字节//mIvw.setParameter( SpeechConstant.NOTIFY_RECORD_DATA, "1" );// 启动唤醒mIvw.startListening(mWakeuperListener);} else {onInit.InitError("初始化唤醒对象失败");}}//停止唤醒@Overridepublic void stopWakeUp() {mIvw.stopListening();}//销毁对象@Overridepublic void destroyObj() {mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {mIvw.destroy();}}
##三、语音在线听写
讯飞很早以前关闭了离线语音听写,但是使用以前的jar可以实现离线听写功能。但是二者不可混淆:离线语音demo下载:http://download.csdn.net/download/weixin_39923324/10209576言归正传,还是说在线听写:
public interface IRecBIZ {/*** 初始化** @param mTtsInitListener* @return*/boolean createRec(InitListener mTtsInitListener);/*** 开始听写** @param mRecognizerListener* @return*/int startSpeaking(RecognizerListener mRecognizerListener);/*** 停止听写*/void stopSpeaking();/*** 取消听写*/void cancelSpeaking();/*** 销毁对象*/void destroyObj();
}
@Overridepublic boolean createRec(InitListener mTtsInitListener) {mIat = SpeechRecognizer.createRecognizer(context, mTtsInitListener);return mIat != null;}@Overridepublic int startSpeaking(RecognizerListener mRecognizerListener) {setParam();return mIat.startListening(mRecognizerListener);}@Overridepublic void stopSpeaking() {mIat.stopListening();}@Overridepublic void cancelSpeaking() {mIat.cancel();}@Overridepublic void destroyObj() {if (null != mIat) {// 退出时释放连接mIat.cancel();mIat.destroy();}}
想象一下,自己的手机由自己所写的语音控制,那成就感有多么棒。
DEMO:http://download.csdn.net/download/weixin_39923324/10209490
转注注明出处。
强烈推荐
分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang
集成讯飞SDK,实现离线命令词、离线语音合成、离线唤醒,语音在线/离线听写相关推荐
- Android Studio快速集成讯飞SDK实现文字朗读功能
今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即"从文 ...
- 讯飞语音——离线命令词+语义识别
讯飞语音--离线命令词+语义识别 意思就是先走离线命令词识别,如果离线命令词识别没有识别到结果,那么就再走语义接口,如果已开通对应场景,则转为语义,如果没有开通对应场景,则将语音转为文字 效果图 说的 ...
- 讯飞语音——离线命令词识别
离线命令词识别 效果图 示例源码 地址:http://download.csdn.net/detail/q4878802/9023825 步骤: 1. 下载SDK 前面文章有,就不在复述了.这里要选择 ...
- 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)
QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...
- java 集成讯飞语音 pc_【报Bug】sdk集成 讯飞语音输入jar包报错
sdk集成 讯飞语音输入jar包报错 Caused by: org.gradle.api.internal.artifacts.transform.TransformException: Execut ...
- 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别
0x00 离线命令词识别简介 语音识别技术(Auto Speech Recognize,简称ASR),就是把人的自然语言音频数据转换成文本数据的技术.理论上在线ASR是可以把所有的语音转换成对应的文本 ...
- android 科大讯飞离线命令词的使用
这篇博客主要讲解如何实现离线命令词的功能 科大讯飞离线命令词这个功能还是比较好用的 , 它可以配合着语音唤醒一起使用,这个时候就可以做出来你想要的效果 ,如智能音响什么的 ! 不多说, 直接上代码! ...
- 科大讯飞离线命令词的使用
公司内部有需求,需要在项目中加上离线命令词的使用,之前做过了在线语音识别,而离线的语音识别和在线的最大区别是离线需要对应的离线资源包!当然,离线识别的识别度和在线是有一定的差距的,很多时候识别不准,不 ...
- 科大讯飞离线命令词识别
一.进入科大讯飞官网,下载自己所需要的SDK----以离线命令词识别为例: 二.分析代码-----主要有以下四大函数 const char *get_audio_file(void); //选择进行离 ...
最新文章
- java+script+当前日期_javascript获取当前时间
- 程序员必读10本算法书推荐
- XML publisher 填充空白行数
- 卸载 插件_永远都不会卸载的CAD插件,好用到怀疑人生
- 如何使用 FFmpeg 减小视频大小
- Web browser的发展演变
- 更改hadoop集群yarn的webui中的开始时间和结束时间为本地时间
- linux之同时监控多个日志文件变化
- DVD-Cloner 2022 for mac(DVD光盘刻录工具)
- iview2.0 bug之+8 区的 DatePicker
- Windows 定时关机命令
- matlab中的求导函数diff
- Laravel模型中的fillable和guarded属性
- Spring Boot 接入支付宝,实战来了
- HDUOJ 1847 Good Luck in CET-4 Everybody!(尼姆博奕)
- python支持使用字典的键作为下标,Python 支持使用字典的“键”作为下标来访问字典中的值。...
- iMazing2023官网中文版下载及许可证附使用教程
- java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统
- 【学习资料】红蓝紫队视角下的实战攻防演习
- 2009年学术造假事件汇总,纯洁的几片圣土已经沦陷