讯飞语音离线命令词识别

最近买了个小米电视,开机啊、打开爱奇艺啊,都不用遥控板,挺方便,于是想给我们自己的上位机软件也增加一些语音提示、语音控制的功能。简单罗列如下:

一、语音提示功能

        设备状态变化、报警等,通过将语音将报警文本读出来。

二、语音指令控制功能

  • 1. 设备启动和停止

  • 操作人员可以通过简单的语音指令实现设备的启动和停止。例如,“启动生产线一”、“停止压缩机”等。
  • 2. 环境控制

  • 支持通过语音指令控制空调、灯光等设备的开关和调节。例如,“打开空调”、“关闭车间灯光”。
  • 3.故障复位

  • 在设备发生故障时,操作人员可以通过语音指令快速执行复位操作,减少停机时间,提高生产效率。例如,“复位CNC机器”。
  • 4.指令组成:

  • 操作类型+设备编号+设备类型。
  • 其中操作类型比如:启动、停止、复位、报警、打开、关闭;前进、后退、左转、右转;增加、减少、提升、下降等,一般一个操作场景估计20种以内。
  • 设备类型比如:小车、提升机、堆垛机、AGV、皮带机、空压机;阀门、门禁、空调、灯光、电视;估计一个场景也是20种以内。
  • 设备编号就不一定了,有的类型只有几个,有的类型几十个,我们常用的一种设备,一条产线200个左右。
  • 这样组合起来,一个应用系统指令最多可以几万个,根据和讯飞技术群沟通的理解,目前无限制指令数,但我猜测指令数量越多,准确性可能会受到影响,但我没测试。最终使用时,将识别指令限定在自己应用的最小范围。

三、曲折的实现过程

因为现场工控上位机操作系统都是Windows系统,目前基本是Win10,开发语言为C#,开发环境为VS2022。所以后续方案都采用C#实现,暂未考虑其他编程语言和操作系统平台。

一、语音提示,采用微软System.Speech.Synthesis,轻松实现。

二、至于语音指令控制,实现过程就曲折了。

1. 百度了一波,System.Speech带语音识别,也叫语音装文本。但自由识别和预设词识别,准确度不高,可能是我们参与测试的几个小伙伴普通话都不太标准吧,读数字编号时,容易错误。整体指令识别率在60%以上。

2. 国内做语音识别听到比较多的是讯飞,当然百度阿里这些大佬肯定也是很牛的。

为了安全,现场工控上位机平常不能连外网,只有特殊时候才打开用一下,所以得考虑离线的。

首先讯飞列表有个离线命令词识别,百度没找到,阿里没仔细找。

讯飞SDK下载,离线命令词识别demo没有C#的,只有C++的,苦了不会C++的我。

以前用过百度的图像识别,调用方法挺简单,于是咨询百度有没有内网离线方案。百度那边说有的,可以将他们的语音识别服务部署在内网,看到这个回复挺开心,有戏啊。后面问到价格,说一套最便宜在20W左右,好像有个同时访问的数量限制,但不限时间和次数访问。因为我们访问数量比较少,一个项目就10几个上位机而已,没关注访问量(可能是50或100吧)。这个价格一出,就把我打退了。

继续讯飞,加了讯飞的官方微信支持群,也没问到C#的demo,给后台发工单,也说没有C#demo,给了我一个语音唤醒的demo,说让我参考。md我连语音换醒概念都还没搞明白,咋参考啊。

这时候,csdn帮助就大了,搜索下载了好多demo,还好开了会员,一年几百个下载随便造。但这些C#例程运行起来,都没能成功识别过。突然有一个离线例程能成功识别了,而且还是自由识别,不需要限定预设指令之类,挺开心。就开始倒腾各种指令测试,感觉还行。突然有天测试时居然识别不成功了,找了半天也没找到啥问天。然后发现是谁把wifi那里搞断电了。md,说好的离线识别例程啊,诚信在哪里。。。

继续折腾下载源码,开始下收费的源码,即使有能下几百个下载的vip,这些源码还是需要另外付费。想到付费嘛,总是靠谱点的,但没啥用,付费的下载了,也是用不了。想到既然付费的,问问卖家点拨下总是行的吧。于是私信卖家,无回复。有天无意看到卖家头像下面,资源1万+,点进去,这些资源都是收费的。因为没下,其他资源能不能用我不知道,但卖家肯定是没空回复我的了。

其中一个大佬的头像下长这样,这里不放具体id,万一是我不会用,有诽谤嫌疑:

 下次买资源,还是要看看数量,如果太多数量的,再想想怎么评估风险吧

WC,啰啰嗦嗦了那么多了,还没进入正题啊

四、实现方法

1. 购买appid、下载sdk

 首先在讯飞官网,购买离线命令识别能力,有试用版。

下载SDK。这个sdk包含msc.dll库,这个库绑定了购买的appid,在应用这个库时,初始化方法中需要填入这个appid。

参考链接:运行科大讯飞离线命令词识别的SDK使用_讯飞sdk 分词-CSDN博客

2. 初始化注意的地方

  初始化语法,有个bnf文件,官方demo叫call.bnf。

    注意其中的engine_type = local表示本地。我就在这个语法配置位置耗费太多时间,后面硬着头皮去查看C++的demo,找到了。

3. 主要代码:

//初始化app,appid就是讯飞提供的购买id

public bool Login(string appID,string bnfFileName)

    bool ret= false;
    string login_params =string.Format("appid = {0}, work_dir = .",appID);   // 登录参数,appid与msc库绑定,请勿随意改动            
     
    int retInt = MSPLogin(null, null, login_params);//第一个参数是用户名,第二个参数是密码,均传NULL即可,第三个参数是登录参数            

    if(retInt == 0)
    {
        if (BuildGrammar(bnfFileName))
        {
            ret = true;
        }
    }

    return ret;

}

//构建语法,grm_parm

private bool  BuildGrammar(string bnfFileName)
{
    bool ret = false;
    // 构建语法
    string grm_content = "";
    uint grm_cnt_len = 0;
    FileInfo fi = new FileInfo(bnfFileName);
    grm_content = File.ReadAllText(bnfFileName, Encoding.Default);
    grm_cnt_len = (uint)Encoding.UTF8.GetBytes(grm_content).Length;
    //UserData bgdata = getUserData();
    string userDataString = "Some user data";
    IntPtr userData = Marshal.StringToHGlobalAnsi(userDataString);
    string grm_parm = "engine_type = local, asr_res_path = fo|res/asr/common.jet, sample_rate = 16000, grm_build_path = res/asr/GrmBuilld,";   
    int retInt = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_parm, GrammarBuildCallback, userData);
    ret= (retInt == 0);
    return ret;
}

4. 测试界面

测试界面,主要是启动sdk开始识别,做了一个简单测试,根据自己设置的命令词库,随机挑选一个指令,人工读这个指令,检查识别准确率。在笔记本上测试,我自己90%以上,主要是一些数字读不准确(比如14,44之类),有普通话标准的朋友测试可以到100%准确率。

5. 测试源码参考:

      https://download.csdn.net/download/ASDC001/90090334

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值