HoloLens开发手记 - Unity之语音输入

对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中。HoloLens上语音输入有三种形式,分别是:

  • 语音命令 Voice Command
  • 听写 Diction
  • 语法识别 Grammar Recognition

语音命令 Voice Command



对于做过Windows Phone或许Windows Store应用开发的人来说,语音命令是经常使用到的特性。开发者可以通过为应用设定关键词,和对应的行为,来为用户提供语音命令体验。当用户说出关键词时,预设的动作就会被调用。在HoloLens上,语音命令也是此模式。

KeywordRecognizer

命名空间UnityEngine.Windows.Speech

KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

使用方法很简单,通过注册<关键词>来初始化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

类: GrammarRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

在你创建好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

: DictationRecognizerSpeechErrorSpeechSystemStatus

听写特性用于将用户语音转为文字输入,同时支持内容推断和事件注册特性。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();
    }
}

注意:以下情况中,听写识别会自动触发超时行为:

  1. 如果在听写开始后第一个5秒内没听到任何声音,将会超时
  2. 如果识别到了一个结果但是之后20秒没听到任何声音,也会超时

同时使用以上特性



如果你想同时使用语音命令、语法识别和听写特性,那么一定要在完全关闭当前语音识别行为后再开始另一个识别动作。如果有多个KeywordRecognizer在运行,你可以使用如下代码一次性关闭它们:

PhraseRecognitionSystem.Shutdown();

为了从先前状态恢复所有的识别器,可以在听写识别完成后调用如下代码:

PhraseRecognitionSystem.Restart();

当然你也可以重新开始一个 KeywordRecognizer,这将会重启PhraseRecognitionSystem,达到上面的效果。

总结



Windows平台上的语音识别特性从Windows 8以来一直都很强大,但是在HoloLens上会有更大的用武之地。这是最基本的交互方式,从系统层级上提供了强大的支持,甚至和Cortana结合到了一起,非常有用。

时间: 2024-09-29 22:08:23

HoloLens开发手记 - Unity之语音输入的相关文章

HoloLens开发手记 - Unity development overview 使用Unity开发概述

Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必要的工具,包括Unity HoloLens Technical Preview.Unity HoloLens Technical Preview是基于Unity 5.4 Beta版本来构建的,记得定期检查版本更新. 使用Unity是构建HoloLens全息应用最快的方式.推荐你花点时间来学习Unit

HoloLens开发手记 - Unity之摄像头篇

当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Holographic"后,Unity的摄像头组件会自动进行立体渲染,也会自动跟随你而移动或者旋转. 尽管如此,为了保证全息体验,以下选项需要你手动为所有摄像头设定: 混合现实渲染 Mixed Reality Rendering 摄像头定位 Positioning the Camera 视锥范围调整 Clip P

HoloLens开发手记 - Unity之Gestures手势识别

手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层API,可以满足不同的手势定制需求.底层API能够获取手的位置和速度信息,高层API则借助手势识别器来识别预设的手势(包括,单击.双击.长按.平移等等). 手势输入 Gesture Input 本部分为高级API使用,通过输入源来识别手势.每个手势对应一个SourceKind输入源,大部分手势事件都是系统预设的事件,有些事件会提供额外的上下文信息. 只需要很少的步骤就能使用GestureRecognizer集

HoloLens开发手记 - Unity之Locatable camera 使用相机

Enabling the capability for Photo Video Camera 启用相机能力 为了使用摄像头,我们必须启用WebCam能力. 在Unity中打开Player settings 展开Windows Store标签页 在"Publishing Settings > Capabilities"部分勾选WebCam能力 同一时刻只能执行一次相机操作.为了识别当前相机处在哪种模式下(拍照还是视频),你可以通过UnityEngine.VR.WSA.WebCam.

HoloLens开发手记 - Unity之Spatial Sounds 空间声音

本文主要讲述如何在项目中使用空间声音特性.我们主要讲述必须的插件组件和Unity声音组件和属性的设置来确保空间声音的实现. Enabling Spatial Sound in Unity 在Unity中启用空间声音 我们需要在Unity中使用声音插件来实现空间声音.这个插件(audio spatalizer plugin)被打包到了Unity,所以只需要在设置菜单中 Edit > Audio > Spatializer 启用Microsoft HRTF拓展就好.因为微软空间声音组件目前取样频率

HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity

佩戴HoloLens的多个用户可以使用场景共享特性来获取集合视野,并可以与固定在空间中某个位置的同一全息对象进行交互操作.这一切是通过空间锚共享(Anchor Sharing)来实现的. 为了使用共享服务,在AppxManifest文件中必须要启用SpatialPerception能力. Anchor Sharing 空间锚共享 在HoloLens扫描空间环境后,用户可以通过手动或者编程来选择建立一些空间锚.空间锚对象的信息的可以被序列化并传递给其他HoloLens设备,每一个设备都可以反序列化

HoloLens开发手记 - Unity之Persistence 场景保持

Persistence 场景保持是HoloLens全息体验的一个关键特性,当用户离开原场景中时,原场景中全息对象会保持在特定位置,当用户回到原场景时,能够准确还原原场景的全息内容.WorldAnchorStore类是实现此特性的关键API,这保证了用户能够将任何全息对象贴到任何他们想要放置的位置. How to persist holograms across sessions 如何在整个会话中保持全息对象 WorldAnchorStore能够允许你保持场景中空间锚的位置,为了能够真正保持全息对

HoloLens开发手记 - Unity之World Anchor空间锚

World Anchor空间锚提供了一种能够将物体保留在特定位置和旋转状态上的方法.这保证了全息对象的稳定性,同时提供了后续在真实世界中保持全息对象位置的能力.简单地说,你可以为全息物体来添加空间锚点,这样就能在后续步骤中将全息物体准确恢复到它原来的位置. Adding a World Anchor 添加空间锚 命名空间: UnityEngine.VR.WSA 类型: WorldAnchor Unity中添加空间锚的方式很简单,如下: WorldAnchor anchor = gameObjec

HoloLens开发手记 - HoloLens真机上手简评

千呼万唤始出来,终于今天拿到了HoloLens真机. 设备概览 包装盒 本体 试戴 实际效果 GalaxyExplorer试玩 全息图像贴到现实场景表面 优点 宣传视频中的核心特性均已具备,而且正如前几天发出的<HoloLens开发手记-硬件细节 Hardware Detail>一文内容,HoloLens硬件细节均一致. 硬件性能略有提升,比西雅图时试用的体验机流畅了很多 修复了频繁重启的bug,发热略有降低 场景匹配流畅,准确率高 更多细节仍待发现 缺点 虽然HoloLens开发者版本好用了