Unity 中的语音输入

注意

开始之前,请考虑使用适用于认知语音服务 SDK 的 Unity 插件。 该插件具有更好的语音准确性结果并可轻松访问语音转文本解码,以及高级语音功能(例如对话、基于意向的互动、翻译、文本转语音合成和自然语言的语音识别)。 若要开始使用,请查看示例和文档

Unity 公开三种将语音输入添加到 Unity 应用程序的方法,其中前两种属于 PhraseRecognizer 类型:

  • KeywordRecognizer 为应用提供要侦听的字符串命令数组
  • GrammarRecognizer 为应用提供一个 SRGS 文件,用于定义要侦听的特定语法
  • DictationRecognizer 可让应用侦听任何字词并向用户提供其语音的备注或其他显示内容

注意

听写和短语识别无法同时处理。 如果 GrammarRecognizer 或 KeywordRecognizer 处于活动状态,那么 DictationRecognizer 就不能处于活动状态,反之亦然。

启用语音功能

必须为应用声明 Microphone 功能,才能使用语音输入

  1. 在 Unity 编辑器中,导航到“编辑”>“项目设置”>“播放器”>
  2. 选择“Microsoft Store”选项卡
  3. 在“发布设置”>“功能”部分,检查 Microphone 功能
  4. 授予应用权限以访问 HoloLens 设备上的麦克风
    • 设备启动时会要求你执行此操作,但如果你意外单击了“否”,可以在设备设置中更改此权限

短语识别

若要使应用能够侦听用户说出的特定短语,然后采取一些措施,需要:

  1. 使用 KeywordRecognizerGrammarRecognizer 指定要侦听的短语
  2. 处理 OnPhraseRecognized 事件并根据识别的短语进行操作

KeywordRecognizer

命名空间:UnityEngine.Windows.Speech
类型:KeywordRecognizerPhraseRecognizedEventArgsSpeechErrorSpeechSystemStatus

我们需要一些 using 语句来保存一些击键:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

然后,让我们向类添加几个字段来存储识别器和关键字 -> 操作字典:

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

现在,向字典添加关键字,例如在 Start() 方法中。 我们在本示例中添加“activate”关键字:

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

创建关键字识别器,并告知识别器我们想要识别的内容:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

接下来注册 OnPhraseRecognized 事件

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

示例处理程序如下所示:

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    System.Action keywordAction;
    // if the keyword recognized is in our dictionary, call that Action.
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
        keywordAction.Invoke();
    }
}

最后,开始识别!

keywordRecognizer.Start();

GrammarRecognizer

命名空间:UnityEngine.Windows.Speech
类型:、PhraseRecognizedEventArgs、SpeechError、SpeechSystemStatus

如果要使用 SRGS 指定识别语法,则使用 GrammarRecognizer。 如果应用不只是包含几个关键字,如果你想识别更复杂的短语,或者如果你想轻松打开和关闭命令集,这将非常有用。 有关文件格式信息,请参阅使用 SRGS XML 创建语法

创建 SRGS 语法后,该语法位于项目的 StreamingAssets 文件夹中:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

创建 GrammarRecognizer 并将其传递到 SRGS 文件的路径:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

接下来注册 OnPhraseRecognized 事件

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

你将获得一个回调,其中包含 SRGS 语法中指定的信息,你可适当地处理这些信息。 semanticMeanings 数组中将提供大部分重要信息。

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

最后,开始识别!

grammarRecognizer.Start();

听写

命名空间:UnityEngine.Windows.Speech
类型:DictationRecognizer、SpeechError、SpeechSystemStatus

使用 DictationRecognizer 将用户的语音转换为文本。 DictationRecognizer 公开 听写功能并支持注册和侦听假设和短语完成的事件,因此你可以在用户说话时和说完之后向他们提供反馈。 Start()Stop() 方法分别用于启用和禁用听写识别。 使用识别器完成后,应使用 Dispose() 释放它,以释放它使用的资源。 如果之前未释放这些资源,它将在垃圾回收期间自动释放这些资源,但会产生额外的性能成本。

开始使用听写只需完成几个步骤:

  1. 创建新的 DictationRecognizer
  2. 处理听写事件
  3. 启动 DictationRecognizer

启用听写功能

必须为应用声明 Internet Client 和 Microphone 功能才能使用听写

  1. 在 Unity 编辑器中,转到“编辑”>“项目设置”>“播放器”
  2. 选择“Microsoft Store”选项卡
  3. 在“发布设置”>“功能”部分,检查 InternetClient 功能
    • (可选)如果还没有启用麦克风,请选中 Microphone 功能
  4. 授予应用权限以访问 HoloLens 设备上的麦克风(如果尚未这样做)
    • 设备启动时会要求你执行此操作,但如果你意外单击了“否”,可以在设备设置中更改此权限

DictationRecognizer

创建 DictationRecognizer,如下所示:

dictationRecognizer = new DictationRecognizer();

要实现听写行为,可订阅和处理四个听写事件。

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. DictationError

DictationResult

此事件在用户暂停后触发,通常位于句子末尾。 此处返回完整识别的字符串。

首先,订阅 DictationResult 事件:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

然后处理 DictationResult 回调:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

DictationHypothesis

此事件在用户说话时持续触发。 当识别器侦听时,它会提供到目前为止听到的内容的文本。

首先,订阅 DictationHypothesis 事件:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

然后处理 DictationHypothesis 回调:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

DictationComplete

当识别器停止时,无论是调用 Stop () 时出错、发生超时还是出现其他错误,都会触发此事件。

首先,订阅 DictationComplete 事件:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

然后处理 DictationComplete 回调:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

DictationError

发生错误时,将触发此事件。

首先,订阅 DictationError 事件:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

然后处理 DictationError 回调:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

订阅并处理你关心的听写事件后,启动听写识别器以开始接收事件。

dictationRecognizer.Start();

如果不再想要保留 DictationRecognizer,则需要取消订阅事件并释放 DictationRecognizer。

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

提示

  • Start()Stop() 方法分别用于启用和禁用听写识别。
  • 使用识别器完成后,必须使用 Dispose() 释放它,以释放它使用的资源。 如果之前未释放这些资源,它将在垃圾回收期间自动释放这些资源,但会产生额外的性能成本。
  • 超时发生在设置的时间段之后。 可在 DictationComplete 事件中检查这些超时。 需要注意两个超时:
    1. 如果识别器启动后未在前五秒钟内听到任何音频,则它会超时。
    2. 如果识别器已给出结果,但随后听到静音 20 秒,则它会超时。

同时使用短语识别和听写

如果要在应用中同时使用短语识别和听写,则需要完全关闭其中一个,然后才能启动另一个。 如果有多个 KeywordRecognizer 正在运行,则可使用以下方法将它们全部关闭:

PhraseRecognitionSystem.Shutdown();

在 DictationRecognizer 停止后,可调用 Restart() 将所有识别器恢复到以前的状态:

PhraseRecognitionSystem.Restart();

也可只启动一个 KeywordRecognizer,这也会重启 PhraseRecognitionSystem。

混合现实工具包中的语音输入

可在以下演示场景中找到语音输入的 MRTK 示例:

下一个开发检查点

如果你遵循我们规划的 Unity 开发检查点历程,下一个任务就是探索混合现实平台功能和 API:

你可以随时返回到 Unity 开发检查点