網(wǎng)站怎么做推廣和優(yōu)化seo推廣知識(shí)
目錄
一、語(yǔ)音喚醒部分
1、首先在科大訊飛官網(wǎng)注冊(cè)開(kāi)發(fā)者賬號(hào)
2、配置喚醒詞然后下載sdk
3、選擇對(duì)應(yīng)功能下載
4、語(yǔ)音喚醒lib包全部復(fù)制到工程目錄下
5、把語(yǔ)音喚醒詞文件復(fù)制到工程的assets目錄
6、復(fù)制對(duì)應(yīng)權(quán)限到AndroidManifest.xml中
7、喚醒工具類封裝
二、語(yǔ)音識(shí)別
1、工具類
2、使用
一、語(yǔ)音喚醒部分
1、首先在科大訊飛官網(wǎng)注冊(cè)開(kāi)發(fā)者賬號(hào)
控制臺(tái)-訊飛開(kāi)放平臺(tái)
2、配置喚醒詞然后下載sdk
3、選擇對(duì)應(yīng)功能下載
4、語(yǔ)音喚醒lib包全部復(fù)制到工程目錄下
5、把語(yǔ)音喚醒詞文件復(fù)制到工程的assets目錄
6、復(fù)制對(duì)應(yīng)權(quán)限到AndroidManifest.xml中
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- App 需要使用的部分權(quán)限 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 科大訊飛 --><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"tools:ignore="ProtectedPermissions" /><uses-permissionandroid:name="android.permission.READ_PRIVILEGED_PHONE_STATE"tools:ignore="ProtectedPermissions" /><uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ProtectedPermissions" /><uses-permissionandroid:name="android.permission.READ_PHONE_NUMBERS"tools:ignore="ProtectedPermissions" />
7、喚醒工具類封裝
?其中IflytekAPP_id為科大訊飛平臺(tái)的應(yīng)用id
public abstract class WakeUpUtil {private static AutoTouch autoTouch = new AutoTouch();//自動(dòng)點(diǎn)擊屏幕/*** 喚醒的回調(diào)*/public abstract void wakeUp(String resultString);// Log標(biāo)簽private static final String TAG = "WakeUpUtil";// 上下文private static Context mContext;// 語(yǔ)音喚醒對(duì)象private VoiceWakeuper mIvw;//喚醒門(mén)限值//門(mén)限值越高,則要求匹配度越高,才能喚醒//值范圍:[0,3000]//默認(rèn)值:1450private static int curThresh = 1450;public WakeUpUtil(Context context) {initKedaXun(context);mContext = context;// 初始化喚醒對(duì)象mIvw = VoiceWakeuper.createWakeuper(context, null);Log.d("initLogData", "===進(jìn)入喚醒工具類====");}/*** 獲取喚醒詞功能** @return 返回文件位置*/private static String getResource() {final String resPath = ResourceUtil.generateResourcePath(mContext, RESOURCE_TYPE.assets, "ivw/" + "cf22564a" + ".jet");return resPath;}/*** 喚醒*/public void wake() {Log.d("initLogData", "===進(jìn)入喚醒工具類====");// 非空判斷,防止因空指針使程序崩潰VoiceWakeuper mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {// textView.setText(resultString);// 清空參數(shù)mIvw.setParameter(SpeechConstant.PARAMS, null);// 設(shè)置喚醒資源路徑mIvw.setParameter(SpeechConstant.IVW_RES_PATH, getResource());// 喚醒門(mén)限值,根據(jù)資源攜帶的喚醒詞個(gè)數(shù)按照“id:門(mén)限;id:門(mén)限”的格式傳入mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + curThresh);// 設(shè)置喚醒模式mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");// 設(shè)置持續(xù)進(jìn)行喚醒mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");mIvw.startListening(mWakeuperListener);Log.d("initLogData", "====喚醒====");} else {Log.d("initLogData", "===喚醒未初始化11====");
// Toast.makeText(mContext, "喚醒未初始化1", Toast.LENGTH_SHORT).show();}}public void stopWake() {mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {mIvw.stopListening();} else {Log.d("initLogData", "===喚醒未初始化222====");
// Toast.makeText(mContext, "喚醒未初始化2", Toast.LENGTH_SHORT).show();}}String resultString = "";private WakeuperListener mWakeuperListener = new WakeuperListener() {@Overridepublic void onResult(WakeuperResult result) {try {String text = result.getResultString();JSONObject object;object = new JSONObject(text);StringBuffer buffer = new StringBuffer();buffer.append("【RAW】 " + text);buffer.append("\n");buffer.append("【操作類型】" + object.optString("sst"));buffer.append("\n");buffer.append("【喚醒詞id】" + object.optString("id"));buffer.append("\n");buffer.append("【得分】" + object.optString("score"));buffer.append("\n");buffer.append("【前端點(diǎn)】" + object.optString("bos"));buffer.append("\n");buffer.append("【尾端點(diǎn)】" + object.optString("eos"));resultString = buffer.toString();stopWake();autoTouch.autoClickPos( 0.1, 0.1);wakeUp(resultString);
// MyEventManager.postMsg("" + resultString, "voicesWakeListener");} catch (JSONException e) {MyEventManager.postMsg("" + "結(jié)果解析出錯(cuò)", "voicesWakeListener");resultString = "結(jié)果解析出錯(cuò)";wakeUp(resultString);e.printStackTrace();}// Logger.d("===開(kāi)始說(shuō)話==="+resultString);}@Overridepublic void onError(SpeechError error) {MyEventManager.postMsg("" + "喚醒出錯(cuò)", "voicesWakeListener");}@Overridepublic void onBeginOfSpeech() {Log.d("initLogData", "===喚醒onBeginOfSpeech====");}@Overridepublic void onEvent(int eventType, int isLast, int arg2, Bundle obj) {
// Log.d("initLogData", "===喚醒onEvent===" + eventType);}@Overridepublic void onVolumeChanged(int i) {
// Log.d("initLogData", "===開(kāi)始說(shuō)話==="+i);}};/*** 科大訊飛* 語(yǔ)音sdk* 初始化*/public void initKedaXun(Context context) {// 初始化參數(shù)構(gòu)建StringBuffer param = new StringBuffer();//IflytekAPP_id為我們申請(qǐng)的Appidparam.append("appid=" + context.getString(R.string.IflytekAPP_id));param.append(",");// 設(shè)置使用v5+param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);SpeechUtility.createUtility(context, param.toString());Log.d("initLogData", "===在appacation中初始化=====");}}
使用直接調(diào)用即可
/*** 科大訊飛* 語(yǔ)音喚醒* 對(duì)象*/private WakeUpUtil wakeUpUtil;private void voiceWake() {Log.d("initLogData", "===執(zhí)行喚醒服務(wù)====");wakeUpUtil = new WakeUpUtil(this) {@Overridepublic void wakeUp(String result) {MyEventManager.postMsg("" + "喚醒成功", "voicesWakeListener");Log.d("initLogData", "====喚醒成功===========" + result);// 開(kāi)啟喚醒wakeUpUtil.wake();}};wakeUpUtil.wake();}
到此語(yǔ)音喚醒已經(jīng)集成結(jié)束,接下來(lái)是語(yǔ)音識(shí)別。
二、語(yǔ)音識(shí)別
1、工具類
/*** 科大訊飛* 語(yǔ)音識(shí)別* 工具類*/
public class KDVoiceRegUtils {private SpeechRecognizer mIat;private RecognizerListener mRecognizerListener;private InitListener mInitListener;private StringBuilder result = new StringBuilder();// 函數(shù)調(diào)用返回值private int resultCode = 0;/*** 利用AtomicReference*/private static final AtomicReference<KDVoiceRegUtils> INSTANCE = new AtomicReference<KDVoiceRegUtils>();/*** 私有化*/private KDVoiceRegUtils() {}/*** 用CAS確保線程安全*/public static final KDVoiceRegUtils getInstance() {for (; ; ) {KDVoiceRegUtils current = INSTANCE.get();if (current != null) {return current;}current = new KDVoiceRegUtils();if (INSTANCE.compareAndSet(null, current)) {return current;}Log.d("initLogData", "===科大訊飛實(shí)例化===大哥大哥==");}}/*** 初始化* 監(jiān)聽(tīng)*/public void initVoiceRecorgnise(Context ct) {if (mInitListener != null || mRecognizerListener != null) {return;}mInitListener = new InitListener() {@Overridepublic void onInit(int code) {
// Log.e(TAG, "SpeechRecognizer init() code = " + code);Log.d("initLogData", "===科大訊飛喚醒初始化===" + code);if (code != ErrorCode.SUCCESS) {
// showToast("初始化失敗,錯(cuò)誤碼:" + code + ",請(qǐng)點(diǎn)擊網(wǎng)址https://www.xfyun.cn/document/error-code查詢解決方案");}}};//識(shí)別監(jiān)聽(tīng)mRecognizerListener = new RecognizerListener() {@Overridepublic void onBeginOfSpeech() {// 此回調(diào)表示:sdk內(nèi)部錄音機(jī)已經(jīng)準(zhǔn)備好了,用戶可以開(kāi)始語(yǔ)音輸入Log.d("initLogData", "=====開(kāi)始說(shuō)話======");}@Overridepublic void onError(SpeechError error) {// Tips:// 錯(cuò)誤碼:10118(您沒(méi)有說(shuō)話),可能是錄音機(jī)權(quán)限被禁,需要提示用戶打開(kāi)應(yīng)用的錄音權(quán)限。
// Log.d("initLogData", "====錯(cuò)誤說(shuō)話=====" + error.getPlainDescription(true));senVoicesMsg(300, "識(shí)別錯(cuò)誤 ");//100啟動(dòng)語(yǔ)音識(shí)別 200識(shí)別成功 300識(shí)別錯(cuò)誤mIat.stopListening();hideDialog();}@Overridepublic void onEndOfSpeech() {// 此回調(diào)表示:檢測(cè)到了語(yǔ)音的尾端點(diǎn),已經(jīng)進(jìn)入識(shí)別過(guò)程,不再接受語(yǔ)音輸入mIat.stopListening();
// Log.d("initLogData", "=====結(jié)束說(shuō)話======");hideDialog();}@Overridepublic void onResult(RecognizerResult results, boolean isLast) {String text = parseIatResult(results.getResultString());
// Log.d("initLogData", "==說(shuō)話==語(yǔ)音識(shí)別結(jié)果==initVoice==" + text);result.append(text);if (!text.trim().isEmpty() && boxDialog != null) {senVoicesMsg(200, "識(shí)別成功");//100啟動(dòng)語(yǔ)音識(shí)別 200識(shí)別成功 300識(shí)別錯(cuò)誤boxDialog.showTxtContent(result.toString());senVoicesMsg(200, "" + result.toString());}if (isLast) {result.setLength(0);}}@Overridepublic void onVolumeChanged(int volume, byte[] data) {//showToast("當(dāng)前正在說(shuō)話,音量大小:" + volume);if (volume > 0 && boxDialog != null) {boxDialog.showTxtContent("錄音中...");}Log.d("initLogData", "===說(shuō)話==onVolumeChanged:====" + volume);}@Overridepublic void onEvent(int eventType, int arg1, int arg2, Bundle obj) {// 以下代碼用于獲取與云端的會(huì)話id,當(dāng)業(yè)務(wù)出錯(cuò)時(shí)將會(huì)話id提供給技術(shù)支持人員,可用于查詢會(huì)話日志,定位出錯(cuò)原因// 若使用本地能力,會(huì)話id為nullif (SpeechEvent.EVENT_SESSION_ID == eventType) {String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);}}};// 初始化識(shí)別無(wú)UI識(shí)別對(duì)象// 使用SpeechRecognizer對(duì)象,可根據(jù)回調(diào)消息自定義界面;mIat = SpeechRecognizer.createRecognizer(ct, mInitListener);if (mIat != null) {setIatParam();//參數(shù)配置}}/*** 執(zhí)行語(yǔ)音* 識(shí)別*/public void startVoice(Context context) {senVoicesMsg(100, "啟動(dòng)語(yǔ)音識(shí)別");//100啟動(dòng)語(yǔ)音識(shí)別 200識(shí)別成功 300識(shí)別錯(cuò)誤if (mIat != null) {showDialog(context);mIat.startListening(mRecognizerListener);}}/*** 科大訊飛* 語(yǔ)音識(shí)別* 參數(shù)配置*/private void setIatParam() {// 清空參數(shù)mIat.setParameter(com.iflytek.cloud.SpeechConstant.PARAMS, null);// 設(shè)置聽(tīng)寫(xiě)引擎mIat.setParameter(com.iflytek.cloud.SpeechConstant.ENGINE_TYPE, com.iflytek.cloud.SpeechConstant.TYPE_CLOUD);// 設(shè)置返回結(jié)果格式mIat.setParameter(com.iflytek.cloud.SpeechConstant.RESULT_TYPE, "json");// 設(shè)置語(yǔ)言mIat.setParameter(com.iflytek.cloud.SpeechConstant.LANGUAGE, "zh_cn");// 設(shè)置語(yǔ)言區(qū)域mIat.setParameter(com.iflytek.cloud.SpeechConstant.ACCENT, "mandarin");// 設(shè)置語(yǔ)音前端點(diǎn):靜音超時(shí)時(shí)間,即用戶多長(zhǎng)時(shí)間不說(shuō)話則當(dāng)做超時(shí)處理mIat.setParameter(com.iflytek.cloud.SpeechConstant.VAD_BOS, "4000");// 設(shè)置語(yǔ)音后端點(diǎn):后端點(diǎn)靜音檢測(cè)時(shí)間,即用戶停止說(shuō)話多長(zhǎng)時(shí)間內(nèi)即認(rèn)為不再輸入, 自動(dòng)停止錄音mIat.setParameter(com.iflytek.cloud.SpeechConstant.VAD_EOS, "500");// 設(shè)置標(biāo)點(diǎn)符號(hào),設(shè)置為"0"返回結(jié)果無(wú)標(biāo)點(diǎn),設(shè)置為"1"返回結(jié)果有標(biāo)點(diǎn)mIat.setParameter(com.iflytek.cloud.SpeechConstant.ASR_PTT, "0");Log.d("initLogData", "==語(yǔ)音是被==初始化成功:====");// 設(shè)置音頻保存路徑,保存音頻格式支持pcm、wav,設(shè)置路徑為sd卡請(qǐng)注意WRITE_EXTERNAL_STORAGE權(quán)限// 注:AUDIO_FORMAT參數(shù)語(yǔ)記需要更新版本才能生效
// mIatDialog.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
// mIatDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/MyApplication/" + filename + ".wav");}/*** 語(yǔ)音* 識(shí)別* 解析*/public static String parseIatResult(String json) {StringBuffer ret = new StringBuffer();try {JSONTokener tokener = new JSONTokener(json);JSONObject joResult = new JSONObject(tokener);JSONArray words = joResult.getJSONArray("ws");for (int i = 0; i < words.length(); i++) {// 轉(zhuǎn)寫(xiě)結(jié)果詞,默認(rèn)使用第一個(gè)結(jié)果JSONArray items = words.getJSONObject(i).getJSONArray("cw");JSONObject obj = items.getJSONObject(0);ret.append(obj.getString("w"));}} catch (Exception e) {e.printStackTrace();}return ret.toString();}/*** 對(duì)話框* getApplicationContext()*/private VoiceDialog boxDialog;private void showDialog(Context context) {View inflate = LayoutInflater.from(context).inflate(R.layout.donghua_layout, null, false);boxDialog = new VoiceDialog(context, inflate, VoiceDialog.LocationView.BOTTOM);boxDialog.show();}/*** 隱藏* 對(duì)話框*/private void hideDialog() {if (boxDialog != null) {boxDialog.dismiss();}}/*** 發(fā)送語(yǔ)音* 識(shí)別消息** @param code* @param conn*/private void senVoicesMsg(int code, String conn) {VoiceRecognizeResult voiceRecognizeResult = new VoiceRecognizeResult();voiceRecognizeResult.setCode(code);//100啟動(dòng)語(yǔ)音識(shí)別 200識(shí)別成功 300識(shí)別錯(cuò)誤voiceRecognizeResult.setMsg("" + conn);String std = JSON.toJSONString(voiceRecognizeResult);MyEventManager.postMsg("" + std, "VoiceRecognizeResult");}/*** 科大訊飛* 語(yǔ)音sdk* 初始化*/public void initKedaXun(Context context) {// 初始化參數(shù)構(gòu)建StringBuffer param = new StringBuffer();//IflytekAPP_id為我們申請(qǐng)的Appidparam.append("appid=" + context.getString(R.string.IflytekAPP_id));param.append(",");// 設(shè)置使用v5+param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);SpeechUtility.createUtility(context, param.toString());Log.d("initLogData", "===在appacation中初始化=====");}}
2、使用
KDVoiceRegUtils.getInstance().initKedaXun(mWXSDKInstance.getContext());KDVoiceRegUtils.getInstance().initVoiceRecorgnise(mUniSDKInstance.getContext());//語(yǔ)音識(shí)別初始化KDVoiceRegUtils.getInstance().startVoice(mUniSDKInstance.getContext());
注意其實(shí)代碼還可以優(yōu)化,由于公司業(yè)務(wù)需要,封裝的不怎么徹底,使用者可在此基礎(chǔ)上進(jìn)一步封裝。