关于讯飞开发平台的注册以及SDK下载:##
##请参考:
/weixin_39923324/article/details/78924892
强烈推荐
分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:/yancyang
##· 离线名命令词
##· 离线语音合成
##· 离线唤醒
##· 语音在线听写
准备工作:
1、jar包 地址:/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: /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);mit();}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: /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下载:/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:/download/weixin_39923324/10209490
转注注明出处。
强烈推荐
分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:/yancyang