在前面文章中简单玩了玩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);
// 设置本地识别使用语法id
mAsr.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的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧;今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法