讯飞离线语音命令词识别
2017-12-28 17:58
393 查看
讯飞离线语音命令词识别
1、注册并下载sdk2、创建工程
3、权限
4、拷贝jar包
5、初始化引擎
6、功能代码
7、打赏
1、注册并下载sdk
讯飞官网地址:http://www.xfyun.cn/
*选择立即开通并登录*
弹出对话框,选择创建应用。
按照提示填写。
应用创建完毕,接下来就是开通服务,以及获取AppID了。
Yancy是我创建的应用名称,记住AppID,选择开通服务为离线命令词识别。
2、创建工程
Android studio创建工程就不说了。
3、权限
拷贝权限到功能清单文件中。
<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"/>
4、拷贝jar包
下载的SDK文档中so库太多,离线命令词识别只需要用到 Msc.jar和libmsc.so。
上传的资源下载需要积分,这里就放百度云。
地址:https://pan.baidu.com/s/1hsanJBe
密码:523z
记得关联jar包与.so库
5、初始化引擎
public class SpeechApp extends Application { @Override public void onCreate() { // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误 // 5a4448f4更换成自己的appID. StringBuffer param = new StringBuffer(); param.append("appid=5a4448f4"); param.append(","); // 设置使用v5+ param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC); SpeechUtility.createUtility(SpeechApp.this, param.toString()); super.onCreate(); } }
别忘了,在功能清单中申明Application 。
<application android:name=".SpeechApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application>
6、功能代码
package hyco_voice.hyco.com.hycovoicedemo; import android.content.SharedPreferences; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.iflytek.cloud.ErrorCode; import com.iflytek.cloud.GrammarListener; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.RecognizerListener; import com.iflytek.cloud.RecognizerResult; import com.iflytek.cloud.Spee eab8 chConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechRecognizer; import com.iflytek.cloud.util.ResourceUtil; import static com.iflytek.cloud.SpeechConstant.TYPE_LOCAL; public class MainActivity extends AppCompatActivity { private static final String TAG = "yancy"; private EditText message; // 语音识别对象 private SpeechRecognizer mAsr; private Toast mToast; //引擎类型 本地 private String mEngineType = TYPE_LOCAL; // 本地语法构建路径 private String grmPath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/msc/test"; // 返回结果格式,支持:xml,json private String mResultType = "json"; // 本地语法文件 private String mLocalGrammar = null; private final String GRAMMAR_TYPE_BNF = "bnf"; // 缓存 private SharedPreferences mSharedPreferences; private final String KEY_GRAMMAR_ABNF_ID = "grammar_abnf_id"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); message = findViewById(R.id.message); // 1.初始化识别对象 mAsr = SpeechRecognizer.createRecognizer(this, mInitListener); mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); //2.构件语法 build(); } /** * 1.1 初始化监听器。 */ private InitListener mInitListener = new InitListener() { @Override public void onInit(int code) { Log.e(TAG, "SpeechRecognizer init() code = " + code); if (code != ErrorCode.SUCCESS) { showTip("初始化失败,错误码:" + code); } } }; String mContent;// 语法、词典临时变量 //2.构件语法 public void build() { mLocalGrammar = FucUtil.readFile(this, "call.bnf", "utf-8"); mSharedPreferences = getSharedPreferences(getPackageName(), MODE_PRIVATE); message.setText(mLocalGrammar); mContent = new String(mLocalGrammar); 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); //使用8k音频的时候请解开注释 // mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000"); // 设置资源路径 mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath()); ret = mAsr.buildGrammar(GRAMMAR_TYPE_BNF, mContent, grammarListener); if (ret != ErrorCode.SUCCESS) { showTip("语法构建失败,错误码:" + ret); } } /** * 2.1 构建语法监听器。 */ private GrammarListener grammarListener = new GrammarListener() { @Override public 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(); } showTip("语法构建成功:" + grammarId); } else { showTip("语法构建失败,错误码:" + error.getErrorCode()); } } }; int ret = 0;//返回值 /** * 点击事件 * * @param view */ public void onClick(View view) { if (null == mAsr) { // 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688 this.showTip("创建对象失败,请确认 libmsc.so 放置正确,\n 且有调用 createUtility 进行初始化"); return; } // 设置参数 if (!setParam()) { showTip("请先构建语法。"); return; } ret = mAsr.startListening(mRecognizerListener); if (ret != ErrorCode.SUCCESS) { showTip("识别失败,错误码: " + ret); } } /** * toast 消息 * * @param str */ private void showTip(final String str) { runOnUiThread(new Runnable() { @Override public void run() { mToast.setText(str); mToast.show(); } }); } /** * 识别监听器。 */ private RecognizerListener mRecognizerListener = new RecognizerListener() { @Override public void onVolumeChanged(int volume, byte[] data) { showTip("当前正在说话,音量大小:" + volume); Log.d(TAG, "返回音频数据:" + data.length); } @Override public void onResult(final RecognizerResult result, boolean isLast) { if (null != result && !TextUtils.isEmpty(result.getResultString())) { Log.d(TAG, "recognizer result:" + result.getResultString()); String text = ""; if (mResultType.equals("json")) { text = JsonParser.parseGrammarResult(result.getResultString(), mEngineType); }/* else if (mResultType.equals("xml")) { text = XmlParser.parseNluResult(result.getResultString()); }*/ // 显示 message.setText(text); } else { Log.d(TAG, "recognizer result : null"); } } @Override public void onEndOfSpeech() { // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 showTip("结束说话"); } @Override public void onBeginOfSpeech() { // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 showTip("开始说话"); } @Override public void onError(SpeechError error) { showTip("onError Code:" + error.getErrorCode()); } @Override public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 // 若使用本地能力,会话id为null // if (SpeechEvent.EVENT_SESSION_ID == eventType) { // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); // Log.d(TAG, "session id =" + sid); // } } }; public boolean setParam() { boolean result = false; // 清空参数 mAsr.setParameter(SpeechConstant.PARAMS, null); // 设置识别引擎 mAsr.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType); if (TYPE_LOCAL.equalsIgnoreCase(mEngineType)) { // 设置本地识别资源 mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath()); // 设置语法构建路径 mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath); // 设置返回结果格式 mAsr.setParameter(SpeechConstant.RESULT_TYPE, mResultType); // 设置本地识别使用语法id mAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, "call"); // 设置识别的门限值 mAsr.setParameter(SpeechConstant.MIXED_THRESHOLD, "30"); // 使用8k音频的时候请解开注释 // mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000"); result = true; } // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 mAsr.setParameter(SpeechConstant.AUDIO_FORMAT, "wav"); mAsr.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/asr.wav"); return result; } //获取识别资源路径 private String getResourcePath() { StringBuffer tempBuffer = new StringBuffer(); //识别通用资源 tempBuffer.append(ResourceUtil.generateResourcePath(this, 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(); } }
DEMO下载:http://download.csdn.net/download/weixin_39923324/10178489
转注注明出处。
相关文章推荐
- 使用科大讯飞语音SDK实现文字在线合成语音
- 讯飞语音输入法iPhone公测版发布
- android-studio 离线安装
- Android零基础之环境Android Studio安装
- Could not resolve all dependencies for configuration ':app:retrolambdaConfi
- Android Studio 依赖注入框架 butterknife
- Android Studio AIDL实现跨进程通信
- Unity 和 Android 交互实践与总结(Unity5.6 和 Eclipse 及 AndroidStudio2.3.1)
- AndroidStudio之NDK与JNI配置详解
- Duplicate files copied in APK META-INF/DEPENDENCIES File
- Jni的笔记一,简单的通信
- Gradle —— 使用 Gradle 打包多个变体(variant)
- 电话拨号器错误打包运行错误
- idea插件 监听编辑板块切换
- 欢迎使用CSDN-markdown编辑器
- android APK升级
- 交通车路拥挤预警(LetuAPP)
- 欢迎使用CSDN-markdown编辑器
- 发送有序广播
- AndroidStudio 安装以及环境配置