Unity3d在Window上使用SAPI进行语音识别
前言
在之前《Unity利用Sapi进行windows语音开发》中,本计划不准备继续做语音识别。因为在unity3d中已经提供了语音识别的相关方法,详见unity3d的官方文档:https://docs.unity3d.com/ScriptReference/Windows.Speech.KeywordRecognizer.html。但是有一点是这个只支持win10。对于win7用户来说,如果不使用百度语音或者科大讯飞语音的话,那么使用SAPI就是最好的方式了。同样的,由于Unity中无法直接使用SAPI,所以只能按照原来的思路,把它写到一个exe工具中,然后再由unity3d来调用。
工程变更和重构
还是继续之前的工程,但是为了规范一些,我把工程名称从SpeechTest改为了Speech。并且重构了Socket通信结构,将原本的SocketExtra分为了SocketBase,SocketServer和SocketClient。这样做的目的就是简单化,并且增加SocketServer发送信息到SocketClient的功能。
这是工程的最终结构图

通信数据结构
由于speech加入了语音识别功能,所以为了区别之前的通信信息,重新整理定义了新的通信数据结构。通信数据结构定为二进制数据,前4位是一个int32型的命令码,这些命令码有不同的含义和内容:
- 1:表示初始化,
- 2:表示文字转语音,后面紧跟着一个string
- 3:表示语音识别,后面是一个int32型,0表示结束识别,1表示开始识别
当speech收到1时,进行初始化。收到2的信息时,读取之后的文本数据,然后交由Speecher来发音。收到3时,读取后面的数据,如果是1,则开始进行录音识别,如果是0则停止录音识别。
Speech代码NetServer.cs
public bool NetReciveMsg(byte[] recivebuffer, int netID)
{
var arg = new ByteOutArg(recivebuffer);
var cmd = arg.ReadInt32();
switch ((EmCmd)cmd)
{
case EmCmd.Init:
Init();
break;
case EmCmd.Speak:
var str = arg.ReadString();
Console.WriteLine(str);
m_speecher.Speak(str);
return true;
case EmCmd.Recognize:
var scmd = arg.ReadInt32();
if (scmd == )
m_recognizer.BeginRec();
if (scmd == )
m_recognizer.EndRec();
return true;
default:
throw new ArgumentOutOfRangeException();
}
return false;
}
在unity发送的代码。(ByteInArg是一个简单地写如byte[]数据的类)
/***测试代码,可删除Start***/
public void OnGUI()
{
if (GUILayout.Button("Connect"))
{
StartCoroutine(Connect());
}
if (GUILayout.Button("InitServer"))
{
StartCoroutine(InitServer());
}
if (GUILayout.Button("Speak"))
{
Speak("hello world");
}
if (GUILayout.Button("Recognize Start"))
{
Recognize(true);
}
if (GUILayout.Button("Recognize End"))
{
Recognize(false);
}
}
/***测试代码,可删除End***/
private void Recognize(bool tf)
{
var arg = new ByteInArg();
arg.Write();
arg.Write(tf ? : );
NetSendMsg(arg.GetBuffer());
}
public IEnumerator Connect()
{
m_socket = new SocketClient(this);
m_socket.Connect("127.0.0.1", );
while (!m_socket.Connected)
{
yield return ;
}
}
public IEnumerator InitServer()
{
var arg = new ByteInArg();
arg.Write();
NetSendMsg(arg.GetBuffer());
yield return ;
}
public void Speech(string str)
{
if (m_socket.Connected)
{
var arg = new ByteInArg();
arg.Write();
arg.Write(str);
//var bytes = Encoding.Default.GetBytes(str);
NetSendMsg(arg.GetBuffer());
}
}
封装SAPI语音识别模块
封装SAPI的语音识别模块这方面的代码很多,也比较简单。这里创建的Recognizer类,代码更改自http://kevin19900306.iteye.com/blog/1206534,其中的含义可以查阅SAPI的相关文档。Recognizer类有构造函数,两个接口,一个回调向外提供。这两个接口为开始识别BeginRec和停止识别EndRec,当识别完成时,使用回调,将识别的文字传出。
在speech的NetServer.cs中,回调相关的代码如下
public void Init()
{
m_speecher = new Speecher();
m_recognizer = new Recognizer
{
OnRecognized = OnRecognized
};
Console.WriteLine("初始化完成");
} private void OnRecognized(string text)
{
var arg = new ByteInArg();
arg.Write(text);
NetSendMsg(arg.GetBuffer());
}
测试
运行unity3d,画面中出现5个按钮,分别为Connect,InitServer,Speak,Recognize Start,Recognize End。依次点击Connect,InitServer。然后点击Speak,听到“hello world”语音。点击Recognize Start,对麦克风说任何中文,可以看到debug输出对应的文字。点击Recognize End停止识别。
Github源代码
源代码下载https://github.com/CodeGize/UnitySapi/
转载声明
转载请保留
Unity3d在Window上使用SAPI进行语音识别的更多相关文章
- window上利用pip安装pandas
官网推荐的是直接使用Anoconda,它集成了pandas,可以直接使用.安装挺简单的,有windows下的安装包.如果不想安装庞大的Anoconda,那就一步一步用pip来安装pandas.下面我主 ...
- 在window上安装pandas
之前在ubuntu上安装pandas,用的easy_install.这次在window上同样方法装遇到"unable to find vcvarsall.bat",看一些网上帖子好 ...
- iOS UIButton加在window上点击无效果问题
UIButton加在window上,点击没有效果,找了很久,原来是没有加上这名:[self.window makeKeyAndVisible]; self.window = [[UIWindow al ...
- 【原】window上安装elasticserach
[window上安装elasticserach] 系统环境:2008R2 x64测试安装用的服务器IP:192.168.12.52elasticsearch版本:2.3.4JDK版本:jdk 1.8. ...
- 关于Windows高DPI的一些简单总结(Window上一般默认是96 dpi 作为100% 的缩放比率)
我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已 ...
- 尽量避免把弹窗加在window上,可以考虑把弹窗封装到控制器里面
封装自定义弹窗,一般来说有两种选择: 在[[[UIApplication sharedApplication] delegate] window]上add自定义view: present一个模态Con ...
- Window上安装—Docker 笔记
本文转自:http://cnodejs.org/topic/55a24267419f1e8a23a64367 需求 想玩nodeClub 源码跑起来,结果window 上各种报错,各种依赖软件要装的感 ...
- window上安装 MongoDB 及其 PHP扩展
window上安装 MongoDB 及其 PHP扩展 工具/原料 window MongoDB MongoDB 方法/步骤 MongoDB 下载 MongoDB提供了可用于32位和64 ...
- Window 上安装Node.js
Window 上安装Node.js 1.Windows安装包下载地址 https://nodejs.org/en/ 2.下载好后,按照默认设置即可,安装路径可以更改 3.安装好后,检测PATH环境变量 ...
随机推荐
- TFS实现需求工作项自动级联保存
目前在一个大型的金融客户软件研发平台项目实施和支持过程中,客户的质量管理团队基于该平台以及结合其它的平台数据,针对需求管理和业务过程需要拟定了一套完整的需求提出.评审.设计以及实现的流程.基于这套流程 ...
- PickerController 添加照片---iOS
前言 添加照片我们常用的地方有,更换头像,发布状态,朋友圈的时候等等,那我们接下来看看怎么添加上照片吧~ github: 效果图: 正文 1.你可以直接写,也可以声明一个属性.我习惯声明一个属性. @ ...
- Swift 2.2 最基本的多线程
昨天晚上苹果召开了发布会,第二天除了知道 iPhone SE 和 IOS9.3 之外,你还记住了什么,这一天还是老样子,继续着我们的Swift的基本学习,但出现了许多的警告,进去看看文档宝宝才知道 S ...
- AFNetworking2.0和AFNetworking3.0 的HTTPS的配置
前言: 由于苹果声明在前说是2017.01.01之后提交审核的APP,必须使用HTTPS请求,要不就直接驳回审核,吓得我们年前赶紧提交了一个版本,想着年后在弄这个https,结果又有消息说是苹果推迟了 ...
- 关于github中的README.md文件
0x01 README.md文件是用Markdown语言编写的,md=Markdown; 在线编辑工具: https://stackedit.io/editor# https://maxiang.io ...
- 复杂的1秒--图解Google搜索技术
谷歌(Google),一个非常成功,但又十分神秘,而且带有几分理想化色彩的互联网搜索巨人,它还是一家相当了不起的广告公司,谷歌首页上的那个搜索按钮是其年赢利200亿美元的杀手级应用,也是Interne ...
- Ansible之 Inventory 资源清单介绍
一.Inventory 库存清单文件 1.Inventory 作用 Ansible 可以在同一时间针对多个系统设施进行管理工作.它通过选择Ansible 资源清单文件中列出的系统,该清单文件默认是在/ ...
- NHibernate的常见问题及解决方案
问题1 : 异常:in expected: <end-of-text> (possibly an invalid or unmapped class name was used in th ...
- libviso中的姿态解算【转载】
这篇关于libviso的文章,本人已投稿在泡泡机器人微信公众号中,放到这里,作学习笔记用. libviso一直以来被称为在视觉里程计(VO)中的老牌开源算法.它通过corner,chessboard两 ...
- MySQL 修改最大连接数
方法一:进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MySQ ...