今天更新unity讯飞的语音唤醒功能,由于之前使用的是语音识别,识别出唤醒词来做了一个假的语音唤醒。
缺点:语音识别一直处于识别中。结果可想而知,一天的识别量达到了1W次,这次多么恐怖的一件事啊。
要想知道1000元购买的20W次。20天就能用完,那是多么可怕的事,所以我决定加上语音唤醒功能。

那么我们进入正题

  1. 先把我们所需要的SDK接口完善到之前文章的MSCDLL中
 public class MSCDLL{#region 语音唤醒//定义回调函数[UnmanagedFunctionPointer(CallingConvention.Cdecl)]public delegate int ivw_ntf_handler(IntPtr sessionID, int msg, int param1, int param2, IntPtr info, IntPtr userData);//调用 QIVWSessionBegin(...)开始一次语音唤醒[DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]public static extern IntPtr QIVWSessionBegin(string grammarList, string _params, ref int errorCode);//调用 QIVWAudioWrite(...) 分块写入音频数据[DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]public static extern int QIVWAudioWrite(IntPtr sessionID, byte[] waveData, uint waveLen, AudioStatus audioStatus);[DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]public static extern int QIVWGetResInfo(string resPath, string resInfo, uint infoLen, string _params);//调用 QIVWRegisterNotify(...) 注册回调函数到msc。//如果唤醒成功,msc 调用回调函数通知唤醒成功息同时给出相应唤醒数据。如果出错,msc 调用回调函数给出错误信息[DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]public static extern int QIVWRegisterNotify(IntPtr sessionID, [MarshalAs(UnmanagedType.FunctionPtr)]ivw_ntf_handler msgProcCb, IntPtr userData);//调用 QIVWSessionEnd(...) 主动结束本次唤醒[DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]public static extern int QIVWSessionEnd(IntPtr sessionID, string hints);#endregion}public enum AudioStatus{MSP_AUDIO_SAMPLE_INIT = 0x00,MSP_AUDIO_SAMPLE_FIRST = 0x01,MSP_AUDIO_SAMPLE_CONTINUE = 0x02,MSP_AUDIO_SAMPLE_LAST = 0x04,}

2.然后我们根据官网提供的流程图来写

登录部分我就不写了,前面的文章里有。

        string path = (Application.streamingAssetsPath + "/wakeupresource.jet").Replace("/", "\\");string qivw_session_begin_params = "ivw_threshold=0:1450,sst=wakeup,ivw_res_path =fo|" + path;private void MSCAwaken()
{sessionID = MSCDLL.QIVWSessionBegin(null, qivw_session_begin_params, ref errorCode);if (errorCode != (int)Errors.MSP_SUCCESS){Debug.LogError("初始化语音唤醒失败!错误信息:" + errorCode);return;}//这个是Unity 自动录音并截取音频保存 章节的方法byte[] playerClipByte = AudioClipToByte(Player.clip, start, end);//语音文件byte[]message = MSCDLL.QIVWRegisterNotify(sessionID, cb_ivw_msg_proc, IntPtr.Zero);if (message != (int)Errors.MSP_SUCCESS){Debug.LogError("语音唤醒注册通知!错误信息:" + message);return;}Thread.Sleep(150);//防止频繁占用cpumessage = MSCDLL.QIVWAudioWrite(sessionID, playerClipByte, (uint)playerClipByte.Length, AudioStatus.MSP_AUDIO_SAMPLE_CONTINUE);if (message != (int)Errors.MSP_SUCCESS){Debug.LogError("写入语音唤醒失败!错误信息:" + message);return;}message = MSCDLL.QIVWAudioWrite(sessionID, null, 0, AudioStatus.MSP_AUDIO_SAMPLE_LAST);if (message != (int)Errors.MSP_SUCCESS){Debug.LogError("写入语音唤醒失败!错误信息:" + message);return;}message = MSCDLL.QIVWSessionEnd(sessionID, hints);if (message != (int)Errors.MSP_SUCCESS){Debug.LogError("语音唤醒结束失败!错误信息:" + message);return;}
}/// <summary>/// 回调函数/// </summary>/// <param name="sessionID"></param>/// <param name="msg"></param>/// <param name="param1"></param>/// <param name="param2"></param>/// <param name="info"></param>/// <param name="userData"></param>/// <returns></returns>private int cb_ivw_msg_proc(IntPtr sessionID, int msg, int param1, int param2, IntPtr info, IntPtr userData){if (msg == (int)IvwStatus.MSP_IVW_MSG_ERROR) //唤醒出错消息{Debug.LogError("MSP_IVW_MSG_ERROR error code:" + param1);}else if (msg == (int)IvwStatus.MSP_IVW_MSG_WAKEUP)//唤醒成功消息{Debug.Log("唤醒成功");}return 0;}

代码部分就算完成了。

下面我来说说我遇到的问题,避免大家在入坑。

一.下载下来的SDK中的wakeupresource.jet路径问题:

1.ivw_res_path也就是wakeupresource.jet存放的路径不能有中文。报错:10102
2.路径需要将"/“替换成”\",不然会报错:10102

二.QIVWAudioWrite接口需要调用两次的问题:

1.一次MSP_AUDIO_SAMPLE_CONTINUE,一次MSP_AUDIO_SAMPLE_LAST。不懂为什么需要用两次,有点鸡肋。

三.QIVWRegisterNotify接口后面需要使用Sleep问题:

1.多次唤醒会出现空指针,QIVWSessionBegin 报错:10132

最后发个成功唤醒图

Unity 科大讯飞语音唤醒相关推荐

  1. 科大讯飞语音唤醒功能(1)

    第一步前去科大讯飞开放平台注册后,下载图中SDK 因为选择语音唤醒,下载之前你要设置唤醒词 设置完之后下载后的文件是这样的 他们具体的含义不用多说,如果你要重新做一个demo出来,只识别语音唤醒功能, ...

  2. 说话就能轻松操控,科大讯飞语音唤醒技术带来便利体验!

    如果,紧箍咒失灵了,孙悟空还会听唐僧的话吗? 如果,专注驾驶途中,一声呼唤便可响应需求是否很方便? 如果,手机落在卧室的某个角落,轻轻唤醒便能找到是否心情舒畅? 现实生活中的这一切,都可以通过语音唤醒 ...

  3. android 科大讯飞语音唤醒demo

    demo地址:https://gitee.com/longlyblack_admin/VoiceCallSecondDemo API文档地址:http://mscdoc.xfyun.cn/androi ...

  4. 科大讯飞Windows麦克风监听语音唤醒+语音识别demo

    最近在学习如何应用API来实现语言交互系统的功能,所以打算写一篇文章来整理和记录自己了解API使用的过程. 有很多平台提供语音识别等功能的API,文章使用的是科大讯飞开发的API. 使用讯飞开放平台S ...

  5. 10、记录使用科大讯飞的语音唤醒硬件生成PCM文件,通过ffmpeg库去生成MP3音频文件

    基本思想:不太会ffmpeg解析pcm的音频文件,所以记录一下结合具体的场景和具体的应用 具体生成的pcm使用的官方代码,不详细叙述,官方的唤醒模块将会产生一个pcm文件,可使用下列命令或者代码将pc ...

  6. ROS 科大讯飞语音(三)识别篇

    ROS 科大讯飞语音(三)识别篇 环境准备 安装声卡驱动库 sudo apt-get install libasound2-dev 将demo里面的call.bnf拷贝到/Robot/voice/ca ...

  7. ROS 科大讯飞语音 (一)环境搭建与准备

    ROS+科大讯飞语音=让你的机器人能听会说---(一)环境搭建与准备 概述 ROS介绍 ROS是是用于机器人的一种次级操作系统.它提供类似操作系统所提供的功能,包含硬件抽象描述.底层驱动程序管理.共用 ...

  8. 语音唤醒真香警告,轻松开启与Siri、小度和小爱的畅聊

    "Hey Siri,给我讲个故事吧",这时Siri熟悉的机械女声从你手机传出,娓娓讲述起一段故事. "Hey Siri"是iOS8中新添加的唤醒Siri的方式, ...

  9. 讯飞语音--唤醒Demo

    写的第一篇博客,因为最近姐姐说起了一个段子, 一男子在地铁站手机找不到了,但是带了蓝牙耳机,耳机还有内容,男子想手机一定还在附近,随即大喊一句,悟空你在哪儿, 手机循环回答,我在这.....这时,拿手 ...

最新文章

  1. java开发checklist,Java API设计CheckList
  2. 后台开发实用书籍--后台开发:核心技术与应用实践
  3. NSObject中的常用方法
  4. cache + db 性能
  5. 函数调用关系图如何画_乌鲁木齐126中一校三址关系图出炉!佳源和绿谷应该如何选择?...
  6. C++描述杭电OJ 2017.字符串统计||
  7. lodash和debounce
  8. CentOS7.5搭建k8s集群
  9. python numpy中对ndarry按照index(位置下标)增删改查
  10. django之orm的高级操作以及xcc安全攻击
  11. 机器学习调参-模型选择
  12. 快解析v6.5.3版本,添加端口映射教程
  13. 计算机工作表中按升序排列,表格打乱顺序怎么按顺序排列_怎么把表格内容按顺序排列图文步骤...
  14. UVA 10041-Vito's Family
  15. 【2022春秋杯】两个题wp
  16. Android 屏幕适配神器ScreenMatch
  17. m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
  18. 打开电脑自带字符映射表
  19. 程序与进程的区别 和 联 系
  20. uni-app中uni-ui组件库的使用

热门文章

  1. 用C语言程序算交税,用C语言编写函数InComeTax计算七级累进税率的税后收入
  2. BS EN 438-6装饰用板材外部用压实层压板材的分类和规范
  3. The right to contest automated decisions under the General Data Protection Regulation: Beyond the so
  4. 舞象云出席泰华商城智慧营销系统上线发布会,问道传统百货新未来
  5. 生活随记 - 上海普通百姓一个月的开销记录
  6. 提前期与计划展望期------(转)
  7. 淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程
  8. 2020年第二届全国高校计算机能力挑战赛Excel模拟题
  9. java 对象和List 里面的对象判断属性是不是为空
  10. Android开发唯一的出路:进阶学习,附超全教程文档