HoloLens开发手记 - Unity之语音输入
对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中。HoloLens上语音输入有三种形式,分别是:
- 语音命令 Voice Command
- 听写 Diction
- 语法识别 Grammar Recognition
语音命令 Voice Command
对于做过Windows Phone或许Windows Store应用开发的人来说,语音命令是经常使用到的特性。开发者可以通过为应用设定关键词,和对应的行为,来为用户提供语音命令体验。当用户说出关键词时,预设的动作就会被调用。在HoloLens上,语音命令也是此模式。
KeywordRecognizer
命名空间: UnityEngine.Windows.Speech
类: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
使用方法很简单,通过注册<关键词>来初始化KeywordRecognizer实例,同时注册语音命令事件来做后续处理。
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq; public class KeywordManager : MonoBehavior
{ KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>(); void Start()
{
//初始化关键词
keywords.Add("activate", () =>
{
// 想执行的行为
}); keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
//开始识别
keywordRecognizer.Start();
} private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
System.Action keywordAction;
// 如果识别到关键词就调用
if (keywords.TryGetValue(args.text, out keywordAction))
{
keywordAction.Invoke();
}
}
}
语法识别 Grammar Recognition
语法识别同Windows Store应用类似,依赖于实现设定好的SRGS文件,文件中定义了一系列语法规则用于语音识别。更多信息请阅读:https://msdn.microsoft.com/zh-cn/library/hh378349(v=office.14).aspx
GrammarRecognizer
命名空间:UnityEngine.Windows.Speech
类: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
在你创建好SRGS文件后,将它放进StreamingAessets文件夹:
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
使用起来也很简单,代码如下:
public class GrammarManager : MonoBehavior
{
private GrammarRecognizer grammarRecognizer; void Start()
{
//初始化
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
//开始识别
grammarRecognizer.Start();
} private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
SemanticMeaning[] meanings = args.semanticMeanings;
// 执行动作
}
}
听写 Diction
听写即语音转文字,此前我们称之为Speech to Text,同样是Windows Store应用特性之一。在HoloLens上,发挥了比其他平台更大的作用。因为HoloLens的操作特性,使用键盘操作起来十分不方便,语音则无此问题,能大大提高输入效率。
DictationRecognizer
命名空间: UnityEngine.Windows.Speech
类: DictationRecognizer, SpeechError, SpeechSystemStatus
听写特性用于将用户语音转为文字输入,同时支持内容推断和事件注册特性。Start()和Stop()方法用于启用和禁用听写功能,在听写结束后需要调用Dispose()方法来关闭听写页面。GC会自动回收它的资源,如果不Dispose会带来额外的性能开销。
完整的使用方法如下:
public class DictionManager : MonoBehavior
{
private DictationRecognizer dictationRecognizer; void Start()
{
dictationRecognizer = new DictationRecognizer();
//注册事件
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis; dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete; dictationRecognizer.DictationError += DictationRecognizer_DictationError; //开始听写识别
dictationRecognizer.Start();
} private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// 自定义行为
} private void DictationRecognizer_DictationHypothesis(string text)
{
// 自定义行为
} private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// 自定义行为
} private void DictationRecognizer_DictationError(string error, int hresult)
{
// 自定义行为
} void OnDestroy()
{
//释放资源
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError;
dictationRecognizer.Dispose();
}
}
注意:以下情况中,听写识别会自动触发超时行为:
- 如果在听写开始后第一个5秒内没听到任何声音,将会超时
- 如果识别到了一个结果但是之后20秒没听到任何声音,也会超时
同时使用以上特性
如果你想同时使用语音命令、语法识别和听写特性,那么一定要在完全关闭当前语音识别行为后再开始另一个识别动作。如果有多个KeywordRecognizer在运行,你可以使用如下代码一次性关闭它们:
PhraseRecognitionSystem.Shutdown();
为了从先前状态恢复所有的识别器,可以在听写识别完成后调用如下代码:
PhraseRecognitionSystem.Restart();
当然你也可以重新开始一个 KeywordRecognizer,这将会重启PhraseRecognitionSystem,达到上面的效果。
总结
Windows平台上的语音识别特性从Windows 8以来一直都很强大,但是在HoloLens上会有更大的用武之地。这是最基本的交互方式,从系统层级上提供了强大的支持,甚至和Cortana结合到了一起,非常有用。
HoloLens开发手记 - Unity之语音输入的更多相关文章
- HoloLens开发手记 - Unity development overview 使用Unity开发概述
Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...
- HoloLens开发手记 - Unity之摄像头篇
当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...
- HoloLens开发手记 - Unity之Keyboard input 键盘输入
虽然HoloLens支持很多种输入方式,包括蓝牙键盘在内.但是大部分应用还是不能断定用户有物理键盘可以输入,所以虚拟键盘输入还是必须要提供的. Unity提供了一个TouchScreenKeyboar ...
- HoloLens开发手记 - Unity之Gaze凝视射线
凝视是HoloLens首要输入方式,形式功能类似于桌面系统的光标,用于选择操作全息对象.然而在Unity中并没有明确的Gaze API或者组件. 实现Gaze Implementing Gaze 概念 ...
- HoloLens开发手记 - Unity之Gestures手势识别
手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层API,可以满足不同的手势定制需求.底层API能够获取手的位置和速度信息,高层API则借助手势识别器来识别预设的 ...
- HoloLens开发手记 - Unity之Spatial mapping 空间映射
本文主要讨论如何在Unity项目中集成空间映射功能.Unity内置了对空间映射功能的支持,通过以下两种方式提供给开发者: HoloToolkit项目中你可以找到空间映射组件,这可以让你便捷快速地开始使 ...
- HoloLens开发手记 - Unity之Tracking loss
当HoloLens设备不能识别到自己在世界中的位置时,应用就会发生tracking loss.默认情况下,Unity会暂停Update更新循环并显示一张闪屏图片给用户.当设备重新能追踪到位置时,闪屏图 ...
- HoloLens开发手记 - Unity之Recommended settings 推荐设置
Unity提供了大量的设置选项来满足全平台的配置,对于HoloLens,Unity可以通过切换一些特定的设置来启用HoloLens特定的行为. Holographic splash screen 闪屏 ...
- HoloLens开发手记 - Unity之Persistence 场景保持
Persistence 场景保持是HoloLens全息体验的一个关键特性,当用户离开原场景中时,原场景中全息对象会保持在特定位置,当用户回到原场景时,能够准确还原原场景的全息内容.WorldAncho ...
随机推荐
- Cordova or Xamarin 用.net开发IOS和Android程序
Visual Studio 2015 和 Apache Cordova 在开始前,问一下自己下面这些问题: 熟练掌握web技术的开发者比例是多少?(占所有开发者的比例) 熟练掌握移动开发技术(并且使用 ...
- Effective Java 21 Use function objects to represent strategies
Theory In the Java the function pointers is implemented by the declaring an interface to represent s ...
- MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片
1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...
- 使用selenium实现右键另存为保存文件
1.需要借住autoit工具和Robot类,下载地址:https://www.autoitscript.com/site/autoit/downloads/ 2.autoit的使用不再详细讲解.如下图 ...
- CBT 简介
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalI ...
- java解惑 读书笔记
表达式之谜 >奇数性 当取余操作返回一个非0的结果.他与左操作数具有相同的正负符号. >找零谜题 在需要精确答案的地方,要避免使用float和double.对于货币运算.要使用int,lo ...
- ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS
题意:给一棵树,要求找出两个点,使得所有点到这两个点中距离与自己较近的一个点的距离的最大值(所有点的结果取最大的值,即最远距离)最小. 意思应该都能明白. 解法:考虑将这棵树摆直如下: 那么我们可以把 ...
- POJ 2823 Sliding Window 再探单调队列
重新刷这个经典题,感觉跟以前不一样了,变得更加容易理解了,不讲解了,看代码.注意:要用C++提交,用G++会超时.. 代码: #include <iostream> #include &l ...
- CSU 1060 Nearest Sequence
题意:求三个序列的最长公共子序列. 思路:一开始以为只要求出前两个的LCS,然后和第三个再求一遍LCS就是答案了.但是样例就对我进行啪啪啪打脸了.实际上就跟两个序列的差不多,换成三维的就行了. 代码: ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...