在使用UE4整合科大讯飞唤醒功能的时候,发现个问题。应该算是科大讯飞唤醒功能代码的不足之处,下面就说一下这个问题。
官方的Demo
按照官网的正常流程下载唤醒SDK,设置唤醒词。然后自己录制一段PCM(内含一再Web上定好的唤醒词汇)。运行,没问题。可以正常唤醒。
自己新建的Win32工程
按照官方的文档设置相关VS配置,运行,也没问题。
UE4工程中的引用
上面第二步的代码完全Copy到UE4自己的工程中,运行。返回错误10102.刚开始2,3天我百思不得其解。找了很多资料,貌似都没有清晰的答案。也在论坛里发了贴询问,很遗憾的是论坛里官方回答是答非所问。
先看看10102错误的官方解释:
这个解释从科大讯飞的角度来看当然没有任何问题。当时如果从开发者的角度来看就有几个问题需要澄清:
第四列是官方给出的解决方案:
1. 检查资源路径是否正确设置
所谓的资源路径是否正确,指的是什么资源?是离线环境下自己录制的PCM还是.jet文件,甚至其它文件。很模糊的解释.很不专业,完全没有从用户的角度来考虑。因为同时我也在使用mysql的库引用。非常顺利,文档解释的很好。通俗易懂。我就在想国内的技术人员重开发,轻文档的日子什么时候才能完结。。这是一件很让人遗憾的事情
2. 检查文件是否可读或者是否损坏
和上面的解释类似,文件指的是那一类文件。文件多了去了,你最起码给划定个范围。当然我这个小项目只有几个可疑文件 .PCM和.jet
我按照官方的解释各种怀疑和修改,没用。依然报10102,后来我仔细调试了几遍代码。发现有可能出问题的地方就是在下面这些代码部分
const char *lgi_param = "appid = xxxxx,engine_start = ivw,ivw_res_path =fo|res/ivw/wakeupresource.jet, work_dir = ."; const char *ssb_param = "ivw_threshold = 0:-20; 1:-20; 2:-20; 3:-20; 4:-20; sst = wakeup"; /* 用户登录 */ ret = MSPLogin(NULL, NULL, lgi_param); //第一个参数是用户名,第二个参数是密码,第三个参数是登录参数,用户名和密码可在http://www.xfyun.cn注册获取 if (MSP_SUCCESS != ret) { printf("MSPLogin failed, error code: %d.\n", ret); goto exit;//登录失败,退出登录 }
准确的说是这两句
const char *lgi_param = "appid = xxxxx,engine_start = ivw,ivw_res_path =fo|res/ivw/wakeupresource.jet, work_dir = ."; const char *ssb_param = "ivw_threshold = 0:-20; 1:-20; 2:-20; 3:-20; 4:-20; sst = wakeup";
因为第二句是设置词汇门槛,只要id和Web上设置的词汇对应即可。所以这一块和10102错误没有理论上的关系。那么排除这句,就剩下第一句了。其实问题就出在了第一句
const char *lgi_param = "appid = xxxxx,engine_start = ivw,ivw_res_path =fo|res/ivw/wakeupresource.jet, work_dir = .";
那么我们就来剖析下这句的几个部分:
appid = xxxx; 只要appid对应Web上建好的应用ID即可,这句不会有错误。排除
engine_start = ivw;启动的是离线唤醒引擎ivw。官方函数说明的设置。也没问题。排除
ivw_res_path =fo|res/ivw/wakeupresource.jet;这句官方函数的说明是设置唤醒引擎的资源原路径 .jet文件中存储了制作好的唤醒词汇以及一些其他东西,因为是二进制,看不到细节。那么我们再分解这句fo|是什么意思?我们看看官方的函数解释:
这个说明中没有给出解释,只是让你按照这样的格式设置就行。甚至还有[offset]这种东西,谁知道你这是什么东西啊,对于这种文档简直让人无语。所以大部分的人只能按照例子这种格式进行设置。那么再看下res/ivw/wakeupresource.jet这句;这句明显就是wakeupresource.jet文件路径关系。事实也是如此,让我们看下官方Demo的文件夹结构截图
上图中的ivw文件夹中存放着wakeupresource.jet文件。那么res/ivw/wakeupresource.jet这句的意思只的就是.jet文件的部分路径关系。看起来没有什么问题。一切都是安排的很妥当。事实上按照官网的配置文档。在win32工程下。确实如此。好,我们暂且放过这句,看下一句
work_dir = . 这一句从字面意思来看指的是工作目录。当然它写个.的意思和cmd中的cd.是一个意思.就是指当前目录。也就是说对于单一的win32工程来说,按照官方文档http://doc.xfyun.cn/msc_windows/412367 做就行了。
那么问题来了,如果自定义项目的可执行文件并不存在于bin目录下。那么work_dir = .这句就应该修改为可执行文件所在的目录,譬如下面这样
work_dir = ../../../../xxx/xxx/xxx/ 这里要说明下work_dir等号后面有个空格。
大家可以看到,从我当前执行文件到访问res/ivw/wakeupresource.jet。需要 ../../../../xxx/xxx/xxx/这么深的目录结构。也就是说设置这个work_dir的目的就是为了能访问到wakeupresource.jet这个文件。这是真正的意义所在。
完整的访问路径其实是work_dir + res/ivw/wakeupresource.jet拼凑起来的。只有这样设置正确,唤醒的时候才能启动唤醒引擎wakeupresource.jet。
上面看似都没问题了,当唤醒引擎启动的时候会在work_dir这个目录下生成一个msc文件夹,里面包含了启动的log和.cfg文件。这都是运行过程中自动产生的。返回结果还是10102.卧槽
这什么几把玩意啊。垃圾SDK。我开始骂了很久,开始怀疑人生。抱怨为啥国内的开发环境如此恶劣。。。等等等。
好吧,说最终的解决办法吧。自己先新建一个msc文件夹。然后将res/ivw/wakeupresource.jet这个文件结构整体copy到其里面。这个新建的msc文件夹的位置位于work_dir 设置的目录后面(注意别搞错,work_dir中并不包含msc/)
当唤醒引擎按照工作目录的设置启动的时候,会在工作目录中生成一个msc,正好覆盖了我们之前新建的msc文件家。然后能顺利的访问msc文件夹下的res/ivw/wakeupresource.jet文件来唤醒之前设置好的词汇了。

说一说科大讯飞Windows版本唤醒功能10102功能的问题相关推荐

  1. WDM在不同Windows版本上的音频支持

    "Windows音频驱动"翻译系列总目录: https://blog.csdn.net/danteLiujie/article/details/102530417 目录 1. 实现 ...

  2. 关于89 jb2上的自动设置按键唤醒系统的功能以及L版本上设置唤醒键

    [Description] 目前89 jb2版本上是默认实现打电话状态下实现按键唤醒系统的功能的,这样可以满足电话过程中的音量键有效等需求, 但是这套机制同时限制了一般状态下的按键唤醒系统的实现,因此 ...

  3. WinDocks发布Windows版本的Docker引擎

    WinDocks发布了一个Windows版本的Docker引擎,它可以运行在作为底层宿主的Windows Server 2012或Windows Server 2012 r2系统上.它可以运行MS S ...

  4. VC.NET扩展Windows磁盘清理工具的功能

    介绍了Windows磁盘清理工具二次开发的扩展接口,对其COM接口加以分解,并运用ATL库具体实现了清理"*.tmp"临时文件的功能. 关键词 磁盘清理工具.ATL库.COM接口. ...

  5. xhprof在windows下面的安装和使用[上](windows版本)

    1.xhprof到底能干啥? xhprof是Facebook放出的轻量级调试工具.和Xdebug相比xhprof更加易用和可控.尤其是生成流程图和调试数据对比的功能很好很强大. 2.如何安装xhpro ...

  6. Windows 7备份、还原功能详解

    备份.还原从来都是系统中的关键组件.在Vista中,系统备份.还原功能得到了加强.那么,在Windows 7中提供了什么样的备份.还原方案呢?本文将就这一方面和大家进行一番体验. 1.使用系统还原轻松 ...

  7. 桌面显示激活windows_愚蠢的怪胎技巧:如何在桌面上显示Windows版本

    桌面显示激活windows Have you ever noticed during all the beta releases of Windows, there's always a Window ...

  8. 【转】Windows版本,OS内核版本,Windows SDK之间的关系

    转自:Windows版本,OS内核版本,Windows SDK之间的关系 - 知乎 前言:我们经常会会被几个概念弄混淆,什么是Windows版本号,什么又是操作同内核版本,开发C++的时候什么又是Wi ...

  9. 局域网linux唤醒windows,局域网唤醒 (WOL - Wake on LAN) | 远程启动计算机- ManageEngine OpUtils...

    局域网唤醒(WoL) - 远程启动计算机 什么是局域网唤醒? 局域网唤醒(WoL)是一个远程启动或关闭设备的工具, 需要使用一个特别设计的框架,其中包含目标计算机的MAC地址, 可以连接到网络的设备来 ...

  10. 刚刚,微软发出警告:这个 IE 0day 影响所有 Windows 版本,已遭用且无补丁!

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 微软刚刚发布安全公告(ADV200001)称,一个 IE 0day (CVE-2020-0674) 已遭利用,而且暂无补丁,仅有应变措施 ...

最新文章

  1. extjs4.0视频教程下载
  2. 13篇文章,教你学会ES6知识点
  3. linux 镜像文件名,linux – 使用wget镜像具有相同名称的路径和子文件夹的网站
  4. mysql case when then 函数_MySQL case when then 语句使用和时间函数使用
  5. 抽象工厂设计模式解释
  6. Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件
  7. query.exec报QSqlQuery::exec: database not open
  8. 学会这个技能,让你的Fitnesse锦上添花
  9. stm32f103振镜_基于振镜扫描的生物芯片荧光信号光强校正
  10. php行为和事件是什么,Yii Framework框架中事件和行为的区别及应用实例分析
  11. Unity子线程编程无法报错
  12. Matlab三维绘图plot3按二维数组分类区分颜色
  13. 大数据-Kafka容错性
  14. python学习2——if 条件检查
  15. 一號倉:《漫》--《3D》
  16. spring boot + gateway + nacos 网关统一代理
  17. Xilinx Zynq-7000嵌入式系统设计与实现-电子书下载-pdf
  18. EOFError: marshal data too short
  19. Redis配置文件redis.conf内容完整版
  20. 1800: 少水群多刷题

热门文章

  1. CAN网络基础知识_20220727
  2. C / C++ function - rand
  3. 在Ubuntu下安装Visual Studio Code
  4. 电商数据分析常用的四种方法,数据分析必备
  5. GNN-图卷积模型-2017:GAT【消息传递(前向传播):聚合函数+更新函数】【聚合函数:attention(邻域所有节点根据注意力机制进行加权)】【训练更新函数的参数】【直推式归纳式】【同质图】
  6. 【软件实战】5分钟拥有一款自己的软件(教程+成品展示)
  7. vue姓名动态输入三种方式、前端密码加密
  8. 服务器抓取MIUI ota信息,官方科普|关于MIUI系统OTA
  9. 笔记本电脑里计算机未响应,win10系统笔记本word程序总是未响应的详细方案
  10. 计算机系统应用属于ei,2018年度中心成员发表论文清单(SCI、EI收录)