日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

灵云语法识别

發布時間:2024/9/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 灵云语法识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源碼

GitHub

在線語法識別

SDK下載

靈云SDK下載

SDK集成

下載SDK以后,將jar和so導入工程

權限

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />

封裝

靈云配置類

package kong.qingwei.kqwhcidemo;/*** Created by kqw on 2016/8/12.* 靈云配置信息*/ public final class ConfigUtil {/*** 靈云APP_KEY*/public static final String APP_KEY = "3d5d5466";/*** 開發者密鑰*/public static final String DEVELOPER_KEY = "eca643ff7b3c758745d7cf516e808d34";/*** 靈云云服務的接口地址*/public static final String CLOUD_URL = "test.api.hcicloud.com:8888";/*** 需要運行的靈云能力*/// 離線語音合成public static final String CAP_KEY_TTS_LOCAL = "tts.local.synth";// 云端語音合成public static final String CAP_KEY_TTS_CLOUD = "tts.cloud.wangjing";// 云端語義識別public static final String CAP_KEY_NUL_CLOUD = "nlu.cloud";// 云端自由說public static final String CAP_KEY_ASR_CLOUD_FREETALK = "asr.cloud.freetalk";// 離線自由說public static final String CAP_KEY_ASR_LOCAL_FREETALK = "asr.local.freetalk";// 云端語音識別+語義public static final String CAP_KEY_ASR_CLOUD_DIALOG = "asr.cloud.dialog";// 離線命令詞public static final String CAP_KEY_ASR_LOCAL_GRAMMAR = "asr.local.grammar.v4";// 在線命令詞public static final String CAP_KEY_ASR_CLOUD_GRAMMAR = "asr.cloud.grammar"; }

初始化靈云語音能力的工具類

package kong.qingwei.kqwhcidemo;import android.app.Activity; import android.os.Environment; import android.util.Log; import android.widget.Toast;import com.sinovoice.hcicloudsdk.api.HciCloudSys; import com.sinovoice.hcicloudsdk.common.AuthExpireTime; import com.sinovoice.hcicloudsdk.common.HciErrorCode; import com.sinovoice.hcicloudsdk.common.InitParam;import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale;/*** Created by kqw on 2016/8/12.* 初始化靈云語音*/ public class HciUtil {private static final String TAG = "HciUtil";private Activity mActivity;private final String mConfigStr;public HciUtil(Activity activity) {mActivity = activity;// 加載信息,返回InitParam, 獲得配置參數的字符串InitParam initParam = getInitParam();mConfigStr = initParam.getStringConfig();}public boolean initHci() {// 初始化int errCode = HciCloudSys.hciInit(mConfigStr, mActivity);if (errCode != HciErrorCode.HCI_ERR_NONE && errCode != HciErrorCode.HCI_ERR_SYS_ALREADY_INIT) {Toast.makeText(mActivity, "hciInit error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();return false;}// 獲取授權/更新授權文件 :errCode = checkAuthAndUpdateAuth();if (errCode != HciErrorCode.HCI_ERR_NONE) {// 由于系統已經初始化成功,在結束前需要調用方法hciRelease()進行系統的反初始化Toast.makeText(mActivity, "CheckAuthAndUpdateAuth error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();HciCloudSys.hciRelease();return false;}return true;}/*** 釋放*/public void hciRelease(){HciCloudSys.hciRelease();}/*** 加載初始化信息** @return 系統初始化參數*/private InitParam getInitParam() {String authDirPath = mActivity.getFilesDir().getAbsolutePath();// 前置條件:無InitParam initparam = new InitParam();// 授權文件所在路徑,此項必填initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTH_PATH, authDirPath);// 是否自動訪問云授權,詳見 獲取授權/更新授權文件處注釋initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTO_CLOUD_AUTH, "no");// 靈云云服務的接口地址,此項必填initparam.addParam(InitParam.AuthParam.PARAM_KEY_CLOUD_URL, ConfigUtil.CLOUD_URL);// 開發者Key,此項必填,由捷通華聲提供initparam.addParam(InitParam.AuthParam.PARAM_KEY_DEVELOPER_KEY, ConfigUtil.DEVELOPER_KEY);// 應用Key,此項必填,由捷通華聲提供initparam.addParam(InitParam.AuthParam.PARAM_KEY_APP_KEY, ConfigUtil.APP_KEY);// 配置日志參數String sdcardState = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();String packageName = mActivity.getPackageName();String logPath = sdPath + File.separator + "sinovoice" + File.separator + packageName + File.separator + "log" + File.separator;// 日志文件地址File fileDir = new File(logPath);if (!fileDir.exists()) {fileDir.mkdirs();}// 日志的路徑,可選,如果不傳或者為空則不生成日志initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_PATH, logPath);// 日志數目,默認保留多少個日志文件,超過則覆蓋最舊的日志initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_COUNT, "5");// 日志大小,默認一個日志文件寫多大,單位為Kinitparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_SIZE, "1024");// 日志等級,0=無,1=錯誤,2=警告,3=信息,4=細節,5=調試,SDK將輸出小于等于logLevel的日志信息initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_LEVEL, "5");}return initparam;}/*** 獲取授權** @return 授權結果*/private int checkAuthAndUpdateAuth() {// 獲取系統授權到期時間int initResult;AuthExpireTime objExpireTime = new AuthExpireTime();initResult = HciCloudSys.hciGetAuthExpireTime(objExpireTime);if (initResult == HciErrorCode.HCI_ERR_NONE) {// 顯示授權日期,如用戶不需要關注該值,此處代碼可忽略Date date = new Date(objExpireTime.getExpireTime() * 1000);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);Log.i(TAG, "expire time: " + sdf.format(date));if (objExpireTime.getExpireTime() * 1000 > System.currentTimeMillis()) {// 已經成功獲取了授權,并且距離授權到期有充足的時間(>7天)Log.i(TAG, "checkAuth success");return initResult;}}// 獲取過期時間失敗或者已經過期initResult = HciCloudSys.hciCheckAuth();if (initResult == HciErrorCode.HCI_ERR_NONE) {Log.i(TAG, "checkAuth success");return initResult;} else {Log.e(TAG, "checkAuth failed: " + initResult);return initResult;}} }

語法識別的類

和之前的語音識別一樣,只不過配置了語法

在原來的基礎上添加了initGrammar方法

package kong.qingwei.kqwhcidemo;import android.app.Activity; import android.util.Log;import com.sinovoice.hcicloudsdk.android.asr.recorder.ASRRecorder; import com.sinovoice.hcicloudsdk.common.asr.AsrConfig; import com.sinovoice.hcicloudsdk.common.asr.AsrGrammarId; import com.sinovoice.hcicloudsdk.common.asr.AsrInitParam; import com.sinovoice.hcicloudsdk.common.asr.AsrRecogResult; import com.sinovoice.hcicloudsdk.recorder.ASRCommonRecorder; import com.sinovoice.hcicloudsdk.recorder.ASRRecorderListener; import com.sinovoice.hcicloudsdk.recorder.RecorderEvent;import java.io.IOException; import java.io.InputStream;/*** Created by kqw on 2016/8/15.* 語音識別類*/ public class AsrUtil {private static final String TAG = "AsrUtil";private Activity mActivity;private ASRRecorder mAsrRecorder;private AsrConfig asrConfig;private OnAsrRecogListener mOnAsrRecogListener;private String mGrammar = null;private String mCapKey = ConfigUtil.CAP_KEY_ASR_CLOUD_GRAMMAR;public AsrUtil(Activity activity) {mActivity = activity;initAsr();initGrammar(mCapKey);}/*** 初始化語音識別*/private void initAsr() {Log.i(TAG, "initAsr: ");// 初始化錄音機mAsrRecorder = new ASRRecorder();// 配置初始化參數AsrInitParam asrInitParam = new AsrInitParam();String dataPath = mActivity.getFilesDir().getPath().replace("files", "lib");asrInitParam.addParam(AsrInitParam.PARAM_KEY_INIT_CAP_KEYS, mCapKey);asrInitParam.addParam(AsrInitParam.PARAM_KEY_DATA_PATH, dataPath);asrInitParam.addParam(AsrInitParam.PARAM_KEY_FILE_FLAG, AsrInitParam.VALUE_OF_PARAM_FILE_FLAG_ANDROID_SO);Log.v(TAG, "init parameters:" + asrInitParam.getStringConfig());// 設置初始化參數mAsrRecorder.init(asrInitParam.getStringConfig(), new ASRResultProcess());// 配置識別參數asrConfig = new AsrConfig();// PARAM_KEY_CAP_KEY 設置使用的能力asrConfig.addParam(AsrConfig.SessionConfig.PARAM_KEY_CAP_KEY, mCapKey);// PARAM_KEY_AUDIO_FORMAT 音頻格式根據不同的能力使用不用的音頻格式asrConfig.addParam(AsrConfig.AudioConfig.PARAM_KEY_AUDIO_FORMAT, AsrConfig.AudioConfig.VALUE_OF_PARAM_AUDIO_FORMAT_PCM_16K16BIT);// PARAM_KEY_ENCODE 音頻編碼壓縮格式,使用OPUS可以有效減小數據流量asrConfig.addParam(AsrConfig.AudioConfig.PARAM_KEY_ENCODE, AsrConfig.AudioConfig.VALUE_OF_PARAM_ENCODE_SPEEX);// 其他配置,此處可以全部選取缺省值asrConfig.addParam("intention", "weather");}/*** 初始化語法** @param capKey CapKey*/public void initGrammar(String capKey) {// 語法相關的配置,若使用自由說能力可以不必配置該項if (capKey.contains("local.grammar")) {mGrammar = loadGrammar("stock_10001.gram");// 加載本地語法獲取語法IDAsrGrammarId id = new AsrGrammarId();ASRCommonRecorder.loadGrammar("capkey=" + capKey + ",grammarType=jsgf", mGrammar, id);Log.d(TAG, "grammarid=" + id);// PARAM_KEY_GRAMMAR_TYPE 語法類型,使用自由說能力時,忽略以下此參數asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_TYPE, AsrConfig.GrammarConfig.VALUE_OF_PARAM_GRAMMAR_TYPE_ID);asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_ID, "" + id.getGrammarId());} else if (capKey.contains("cloud.grammar")) {mGrammar = loadGrammar("stock_10001.gram");// PARAM_KEY_GRAMMAR_TYPE 語法類型,使用自由說能力時,忽略以下此參數asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_TYPE, AsrConfig.GrammarConfig.VALUE_OF_PARAM_GRAMMAR_TYPE_JSGF);}}/*** 開始語音識別*/public void start(OnAsrRecogListener listener) {mOnAsrRecogListener = listener;if (mAsrRecorder.getRecorderState() == ASRRecorder.RECORDER_STATE_IDLE) {asrConfig.addParam(AsrConfig.SessionConfig.PARAM_KEY_REALTIME, "no");mAsrRecorder.start(asrConfig.getStringConfig(), mGrammar);} else {Log.i(TAG, "start: 錄音機未處于空閑狀態,請稍等");}}private class ASRResultProcess implements ASRRecorderListener {@Overridepublic void onRecorderEventError(RecorderEvent event, int errorCode) {Log.i(TAG, "onRecorderEventError: errorCode = " + errorCode);if (null != mOnAsrRecogListener) {mOnAsrRecogListener.onError(errorCode);}}@Overridepublic void onRecorderEventRecogFinsh(RecorderEvent recorderEvent, final AsrRecogResult arg1) {if (recorderEvent == RecorderEvent.RECORDER_EVENT_RECOGNIZE_COMPLETE) {Log.i(TAG, "onRecorderEventRecogFinsh: 識別結束");}if (null != mOnAsrRecogListener) {mActivity.runOnUiThread(new Runnable() {@Overridepublic void run() {mOnAsrRecogListener.onAsrRecogResult(arg1);}});}}@Overridepublic void onRecorderEventStateChange(RecorderEvent recorderEvent) {if (recorderEvent == RecorderEvent.RECORDER_EVENT_BEGIN_RECORD) {Log.i(TAG, "onRecorderEventStateChange: 開始錄音");} else if (recorderEvent == RecorderEvent.RECORDER_EVENT_BEGIN_RECOGNIZE) {Log.i(TAG, "onRecorderEventStateChange: 開始識別");} else if (recorderEvent == RecorderEvent.RECORDER_EVENT_NO_VOICE_INPUT) {Log.i(TAG, "onRecorderEventStateChange: 無音頻輸入");} else {Log.i(TAG, "onRecorderEventStateChange: recorderEvent = " + recorderEvent);}}@Overridepublic void onRecorderRecording(byte[] volumedata, int volume) {if (null != mOnAsrRecogListener) {mOnAsrRecogListener.onVolume(volume);}}@Overridepublic void onRecorderEventRecogProcess(RecorderEvent recorderEvent, AsrRecogResult arg1) {if (recorderEvent == RecorderEvent.RECORDER_EVENT_RECOGNIZE_PROCESS) {Log.i(TAG, "onRecorderEventRecogProcess: 識別中間反饋");}if (arg1 != null) {if (arg1.getRecogItemList().size() > 0) {Log.i(TAG, "onRecorderEventRecogProcess: 識別中間結果結果為:" + arg1.getRecogItemList().get(0).getRecogResult());} else {Log.i(TAG, "onRecorderEventRecogProcess: 未能正確識別,請重新輸入");}}}}/*** 讀取語法** @param fileName 文件名* @return 語法*/private String loadGrammar(String fileName) {String grammar = "";InputStream is = null;try {is = mActivity.getAssets().open(fileName);byte[] data = new byte[is.available()];is.read(data);grammar = new String(data);} catch (IOException e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}return grammar;}/*** 語音識別的回調接口*/public interface OnAsrRecogListener {// 識別結果void onAsrRecogResult(AsrRecogResult asrRecogResult);// 識別錯誤碼void onError(int errorCode);// 錄音音量void onVolume(int volume);} }

使用

使用和語音識別完全一致

初始化靈云的語音能力和語法識別

// 靈云語音工具類 mInitTts = new HciUtil(this); // 初始化靈云語音 boolean isInitHci = mInitTts.initHci(); if (isInitHci) { // 初始化成功……// 語音識別mAsrUtil = new AsrUtil(this); }

語法識別

/*** 語音識別(語音轉文字)** @param view view*/ public void asr(View view) {mAsrUtil.start(new AsrUtil.OnAsrRecogListener() {@Overridepublic void onAsrRecogResult(AsrRecogResult asrRecogResult) {StringBuilder stringBuffer = new StringBuilder();ArrayList<AsrRecogItem> asrRecogItemArrayList = asrRecogResult.getRecogItemList();for (AsrRecogItem asrRecogItem : asrRecogItemArrayList) {String result = asrRecogItem.getRecogResult();Log.i(TAG, "onAsrRecogResult: " + result);stringBuffer.append(result).append("\n");}showDialog("識別結果", stringBuffer.toString());}@Overridepublic void onError(int errorCode) {Log.i(TAG, "onError: " + errorCode);}@Overridepublic void onVolume(int volume) {Log.i(TAG, "onVolume: " + volume);}}); }

離線語音識別

在在線語法識別的基礎上,離線的語法識別只需要將CapKey替換,并且添加離線資源即可

離線資源的下載

下載完解壓離線資源

將里面所有的文件重命名,前面加lib,后面加.so,然后導入工程

修改CapKey為asr.local.grammar.v4

注意,靈云的離線語音功能第一次使用需要聯網激活,激活以后才可以使用離線功能。

總結

以上是生活随笔為你收集整理的灵云语法识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。