Unity 中的语音输入
注意
开始之前,请考虑使用适用于认知语音服务 SDK 的 Unity 插件。 该插件具有更好的语音准确性结果并可轻松访问语音转文本解码,以及高级语音功能(例如对话、基于意向的互动、翻译、文本转语音合成和自然语言的语音识别)。 若要开始使用,请查看示例和文档。
Unity 公开三种将语音输入添加到 Unity 应用程序的方法,其中前两种属于 PhraseRecognizer 类型:
KeywordRecognizer
为应用提供要侦听的字符串命令数组GrammarRecognizer
为应用提供一个 SRGS 文件,用于定义要侦听的特定语法DictationRecognizer
可让应用侦听任何字词并向用户提供其语音的备注或其他显示内容
注意
听写和短语识别无法同时处理。 如果 GrammarRecognizer 或 KeywordRecognizer 处于活动状态,那么 DictationRecognizer 就不能处于活动状态,反之亦然。
启用语音功能
必须为应用声明 Microphone 功能,才能使用语音输入。
- 在 Unity 编辑器中,导航到“编辑”>“项目设置”>“播放器”>
- 选择“Microsoft Store”选项卡
- 在“发布设置”>“功能”部分,检查 Microphone 功能
- 授予应用权限以访问 HoloLens 设备上的麦克风
- 设备启动时会要求你执行此操作,但如果你意外单击了“否”,可以在设备设置中更改此权限
短语识别
若要使应用能够侦听用户说出的特定短语,然后采取一些措施,需要:
- 使用
KeywordRecognizer
或GrammarRecognizer
指定要侦听的短语 - 处理
OnPhraseRecognized
事件并根据识别的短语进行操作
KeywordRecognizer
命名空间:UnityEngine.Windows.Speech
类型:KeywordRecognizer、PhraseRecognizedEventArgs、SpeechError、SpeechSystemStatus
我们需要一些 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()
释放它,以释放它使用的资源。 如果之前未释放这些资源,它将在垃圾回收期间自动释放这些资源,但会产生额外的性能成本。
开始使用听写只需完成几个步骤:
- 创建新的
DictationRecognizer
- 处理听写事件
- 启动 DictationRecognizer
启用听写功能
必须为应用声明 Internet Client 和 Microphone 功能才能使用听写:
- 在 Unity 编辑器中,转到“编辑”>“项目设置”>“播放器”
- 选择“Microsoft Store”选项卡
- 在“发布设置”>“功能”部分,检查 InternetClient 功能
- (可选)如果还没有启用麦克风,请选中 Microphone 功能
- 授予应用权限以访问 HoloLens 设备上的麦克风(如果尚未这样做)
- 设备启动时会要求你执行此操作,但如果你意外单击了“否”,可以在设备设置中更改此权限
DictationRecognizer
创建 DictationRecognizer,如下所示:
dictationRecognizer = new DictationRecognizer();
要实现听写行为,可订阅和处理四个听写事件。
DictationResult
DictationComplete
DictationHypothesis
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
事件中检查这些超时。 需要注意两个超时:- 如果识别器启动后未在前五秒钟内听到任何音频,则它会超时。
- 如果识别器已给出结果,但随后听到静音 20 秒,则它会超时。
同时使用短语识别和听写
如果要在应用中同时使用短语识别和听写,则需要完全关闭其中一个,然后才能启动另一个。 如果有多个 KeywordRecognizer 正在运行,则可使用以下方法将它们全部关闭:
PhraseRecognitionSystem.Shutdown();
在 DictationRecognizer 停止后,可调用 Restart()
将所有识别器恢复到以前的状态:
PhraseRecognitionSystem.Restart();
也可只启动一个 KeywordRecognizer,这也会重启 PhraseRecognitionSystem。
混合现实工具包中的语音输入
可在以下演示场景中找到语音输入的 MRTK 示例:
下一个开发检查点
如果你遵循我们规划的 Unity 开发检查点历程,下一个任务就是探索混合现实平台功能和 API:
你可以随时返回到 Unity 开发检查点。