在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR、测距、加载三维白模、可扩展浮动操作和录音效果;今天抽空再来分享一下最近摸索的基于讯飞的离线语音识别效果,其实就简单用了一下离线命令词识别,看效果:
1、先去控制台创建应用:
https://console.xfyun.cn/app/myapp
2、去组合下载SDK(根据自己需求搭配):
https://www.xfyun.cn/sdk/dispatcher
3、然后就是参考文档了:
https://www.xfyun.cn/doc/asr/commandWord/Android-SDK.html
4、最关键的一步绑定第三方库(请大佬“大白”给处理的):
Xamarin.Android.IFlyMSC.1.1140.0-pre.6.nupkg
5、在MainActivity设置Appid:
SpeechUtility.CreateUtility(this, Com.Iflytek.Cloud.SpeechConstant.Appid + "=自己的id");
6、接下来就和前一篇录音异曲同工,共享代码定义接口:
//开始识别
void StartRecognize();
//停止识别
void StopRecognize();
//获取识别结果事件
event GetResultData GetResultDataEvent;
7、实现开始识别:
/// <summary>
/// 开始识别
/// </summary>
public void StartRecognize()
{if(Android.Content.PM.Permission.Denied == Context.CheckSelfPermission(Android.Manifest.Permission.RecordAudio)){MainActivity.Instance.RequestPermissions(new string[]{Android.Manifest.Permission.RecordAudio}, 100);Toast.MakeText(Context, "请开启录音权限", ToastLength.Long).Show();return;}//初始化监听器MyIInitListener myIInitListener = new MyIInitListener();//初始化识别对象mAsr = SpeechRecognizer.CreateRecognizer(MainActivity.Instance, myIInitListener);//构建语法词BuildGrammar();//设置参数bool result = SetParam();if(!result){Console.WriteLine("请先构建语法.");return;}MyIRecognizerListener myIRecognizerListener = new MyIRecognizerListener();//获取识别结果委托myIRecognizerListener.ResultAcion += GetResultData;//开始监听int mRet = mAsr.StartListening(myIRecognizerListener);if(mRet != ErrorCode.Success){Console.WriteLine($ "识别失败,错误码:{mRet}");}
}
8、创建命令词:
private void BuildGrammar()
{//简单几个命令词string mContent = @"#BNF+IAT 1.0 UTF-8;!grammar call;!slot<sendCode>;!start<sendCode>;<callStart>:[<sendCode>];<sendCode>:开机|关机|开灯|关灯|呼叫十年|呼叫AY|呼叫龙哥|呼叫大白;";//清空参数mAsr.SetParameter(SpeechConstant.Params, null);// 设置文本编码格式mAsr.SetParameter(SpeechConstant.TextEncoding, "utf-8");// 设置引擎类型mAsr.SetParameter(SpeechConstant.EngineType, mEngineType);// 设置语法构建路径mAsr.SetParameter(ResourceUtil.GrmBuildPath, grmPath);// 设置资源路径mAsr.SetParameter(ResourceUtil.AsrResPath, getResourcePath());构建语法监听器MyGrammarListener myGrammarListener = new MyGrammarListener();int mRet = mAsr.BuildGrammar(GRAMMAR_TYPE_BNF, mContent, myGrammarListener);if(mRet != ErrorCode.Success){Console.WriteLine("语法构建失败,错误码:" + mRet);}
}
9、设置参数:
public bool SetParam()
{bool result = false;// 清空参数mAsr.SetParameter(SpeechConstant.Params, null);// 设置识别引擎类型mAsr.SetParameter(SpeechConstant.EngineType, mEngineType);//设置本地识别资源mAsr.SetParameter(ResourceUtil.AsrResPath, getResourcePath());//设置语法构建路径,以在本地识别时使用mAsr.SetParameter(ResourceUtil.GrmBuildPath, grmPath);// 设置返回结果格式mAsr.SetParameter(SpeechConstant.ResultType, mResultType);// 设置本地识别使用语法idmAsr.SetParameter(SpeechConstant.LocalGrammar, "call");// 设置识别的门限值mAsr.SetParameter(SpeechConstant.MixedThreshold, "30");mAsr.SetParameter(SpeechConstant.Domain, "iat");mAsr.SetParameter(SpeechConstant.NlpVersion, "2.0");mAsr.SetParameter("asr_sch", "1");result = true;// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限mAsr.SetParameter(SpeechConstant.AudioFormat, "wav");string asrAudioPath = Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath + "/asr.wav";mAsr.SetParameter(SpeechConstant.AsrAudioPath, asrAudioPath);return result;}
10、关于停止识别:
public void StopRecognize(){mAsr.StopListening();Console.WriteLine("停止识别");}
11、关于SDK&API 错误码查询:
https://www.xfyun.cn/document/error-code
最终简单的效果先这样吧;以后有时间的话,可以再去摸索一下更复杂的效果;编程不息、Bug不止、无Bug、无生活;改bug的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧;今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法,可以在留言板随意留言;我看到后会第一时间回复大家,多谢大家的一直默默的关注和支持!如果觉得不错,那就伸出您的小手点个赞并关注一下,多谢您的支持!