Xamarin效果第二十三篇之离线语音识别

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin效果第二十三篇之离线语音识别相关的知识,希望对你有一定的参考价值。

在前面文章中简单玩了玩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的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧;今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法,可以在留言板随意留言;我看到后会第一时间回复大家,多谢大家的一直默默的关注和支持!如果觉得不错,那就伸出您的小手点个赞并关注一下,多谢您的支持!

以上是关于Xamarin效果第二十三篇之离线语音识别的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin效果第二十二篇之录音效果

STM32F429第二十三篇之电容按键

Linux从青铜到王者第二十三篇:Linux网络基础第四篇之kcp协议

WPF效果第一百八十三篇之无缝循环滚动

Xamarin效果第二十一篇之GIS中可扩展浮动操作按钮

Xamarin效果第二十篇之GIS中加载三维白模