在前面文章中简单玩了玩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

最终简单的效果先这样吧

Android 离线语音 识别 包 离线语音识别方案_java

;以后有时间的话,可以再去摸索一下更复杂的效果

Android 离线语音 识别 包 离线语音识别方案_android_02

;编程不息、Bug不止、无Bug、无生活

Android 离线语音 识别 包 离线语音识别方案_android_03

;改bug的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧;今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法