
在本文中3D天堂将介绍如何使用Windows语音API在unity中实现语音识别,示例中给出的实现也可用于虚拟现实 (VR) 应用程序。
从Unity5.4.0开始,Unity引擎添加了Windows语音识别API(UnityEngine.Windows.Speech)用于识别语音输入,所有类型的Windows平台都支持这些API,但仅适用于Windows 10及以上操作系统。
关键信息
- 命名空间:UnityEngine.Windows.Speech
- Unity3d支持:Unity 5.4.0或更高版本
- 操作系统支持:Windows 10及以上
语音识别
语音识别API可以分为两类:
- 词组识别、关键字识别器、语法识别器
- 听写识别、听写识别器
3D天堂网提示:不能同时使用词组识别和听写识别,在单个时间实例中,只有一个识别应该在应用程序中处于活动状态。
词组识别
短语识别用于识别用户说出的特定短语,如果想为Windows Store构建应用程序,则启用麦克风功能以利用应用程序的语音输入。
- 在Unity软件中转到播放器设置。
- 编辑 → 项目设置 → 播放器
- 选择Windows Store选项卡。
- 检查发布设置中的麦克风功能。
- 发布设置 → 功能
短语识别器可分为两种类型:关键字识别器和语法识别器。
关键字识别器
关键字识别器用于侦听给定字符串的数组,让看看如何实现关键字识别器。
- 定义字符串数组。
- 订阅和处理OnPhraseRecognized事件,当给定的短语被识别时,将调用此事件。
- 启动关键字识别器。
下面给出了实现关键字识别器的完整脚本,将此脚本复制到项目中并附加到任何游戏对象。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Windows.Speech;
public class KeyWordRecognizerBehaviour : MonoBehaviour {
KeywordRecognizer keywordRecognizer;
// keyword array
public string[] Keywords_array;
// Use this for initialization
void Start () {
// Change size of array for your requirement
Keywords_array = new string[2];
Keywords_array [0] = "hello";
Keywords_array [1] = "I am from Zhejiang";
// instantiate keyword recognizer, pass keyword array in the constructor
keywordRecognizer = new KeywordRecognizer(Keywords_array);
keywordRecognizer.OnPhraseRecognized += OnKeywordsRecognized;
// start keyword recognizer
keywordRecognizer.Start ();
}
void OnKeywordsRecognized(PhraseRecognizedEventArgs args)
{
Debug.Log ("Keyword: " + args.text + "; Confidence: " + args.confidence + "; Start Time: " + args.phraseStartTime + "; Duration: " + args.phraseDuration);
// write your own logic
}
}
最终结果:

可以同时有多个关键字识别器,但它们不应该监听共同的关键字。
如果在项目中使用多个关键字识别器,那么可以使用PhraseRecognitionSystem类通过单行代码停止并重新启动所有关键字识别器。
如下所示:
// shut down phrase recognition system. All keyword recognizer will be stopped
PhraseRecognitionSystem.Shutdown();
// restore all recognizer in the previous state
PhraseRecognitionSystem.Restart();
语法识别器
如果使用定义要侦听的特定语法的SRGS XML文件,则使用语法识别器,可以在这里找到有关SRGS XML文件格式的详细信息。
获得SRGS XML语法后,将其放入项目的流文件夹中,如果与关键字识别器相同,则语法识别器的实现。
- 加载SRGS语法
- 处理OnPhraseRecognized事件
- 启动语法识别器
using UnityEngine;
using UnityEngine.Windows.Speech;
using System;
public class GrammerRecognizerBehaviour : MonoBehaviour {
GrammarRecognizer grammerRecognizer;
// Use this for initialization
void Start () {
// pass path of your grammar XML in the constructor
grammerRecognizer = new GrammarRecognizer ("Grammer path from streaming asset folder");
grammerRecognizer.OnPhraseRecognized += OnGrammerRecognized;
grammerRecognizer.Start ();
}
void OnGrammerRecognized(PhraseRecognizedEventArgs args)
{
// write your own logic
}
}
听写识别
听写识别用于收听用户将发音的任何单词或语音,可以向用户显示正在说的内容的语音文本,它是对语音的连续识别。
Windows商店构建的发布设置:
如果想要为Windows商店构建的应用程序,则启用互联网和麦克风功能以利用听写识别。
- 在Unity软件中转到播放器设置。
- 编辑 → 项目设置 → 播放器
- 选择Windows Store选项卡。
- 在发布设置中检查麦克风、互联网功能。
- 发布设置 → 功能
听写识别器
听写识别器用于将语音转换为文本,在使用听写识别器之前,需要连接到互联网,否则将收到网络故障错误。
现在来看看如何实现听写识别器,首先创建听写识别器对象。
DictationRecognizer dictationRecognizer = new DictationRecognizer();
接着处理听写事件
听写识别器提供四种类型的事件来注册。
- 听写结果
- 听写完成
- 听写假说
- 听写错误
听写结果
当用户在说话时停顿时会触发此事件,完整的识别字符串将在此处返回。
需要先订阅听写结果事件:
dictationRecognizer.DictationResult += onDictationResult;
然后处理事件:
void onDictationResult(string text, ConfidenceLevel confidence)
{
// write your logic here
}
听写假说
用户说话时会连续触发此事件,当识别器收听时,它将为此提供文本,因此需要先订阅听写结果事件:
dictationRecognizer.DictationHypothesis += onDictationHypothesis;
然后处理事件:
void onDictationHypothesis(string text)
{
// write your logic here
}
听写完成
当听写识别器停止时会触发此事件,识别器可能会通过调用Stop()方法、超时或遇到的任何错误而停止。
需要先订阅听写结果事件:
dictationRecognizer.DictationComplete += onDictationComplete;
然后处理事件:
void onDictationComplete(DictationCompletionCause cause)
{
// write your logic here
}
超时条件:
- 如果识别器启动但五秒钟内没有收听任何内容,它将超时。
- 如果识别器给出结果,然后在二十秒内没有收听任何内容,它将超时。
听写错误
出现任何错误时都会触发此事件,则需要先订阅听写结果事件:
ictationRecognizer.DictationError += onDictationError;
然后处理事件:
void onDictationError(string error, int hresult)
{
// write your logic here
}
启动识别器
dictationRecognizer.Start();
下面给出了实现听写识别器的完整脚本,将此脚本复制到项目中并附加到任何游戏对象。
using UnityEngine;
using System.Collections;
using UnityEngine.Windows.Speech;
public class DictationRecognizerBehaviour : MonoBehaviour {
DictationRecognizer dictationRecognizer;
// Use this for initialization
void Start () {
dictationRecognizer = new DictationRecognizer();
dictationRecognizer.DictationResult += onDictationResult;
dictationRecognizer.DictationHypothesis += onDictationHypothesis;
dictationRecognizer.DictationComplete += onDictationComplete;
dictationRecognizer.DictationError += onDictationError;
dictationRecognizer.Start();
}
void onDictationResult(string text, ConfidenceLevel confidence)
{
// write your logic here
Debug.LogFormat("Dictation result: " + text);
}
void onDictationHypothesis(string text)
{
// write your logic here
Debug.LogFormat("Dictation hypothesis: {0}", text);
}
void onDictationComplete(DictationCompletionCause cause)
{
// write your logic here
if (cause != DictationCompletionCause.Complete)
Debug.LogErrorFormat ("Dictation completed unsuccessfully: {0}.", cause);
}
void onDictationError(string error, int hresult)
{
// write your logic here
Debug.LogErrorFormat("Dictation error: {0}; HResult = {1}.", error, hresult);
}
}
当运行上面的脚本时,可以对着麦克风说“Hello, how are you”。
输出结果:

可能的错误:
当运行上面的代码时,出现错误 → ERROR: StartAsync on the continuous recognition session failed unexpectedly! [Operation has failed with error 0x80045509: (null)]。

如果遇到同样的错误,那么要解决此问题,需要更改机器中语音系统的策略设置。
请导航至系统设置 → 隐私。

从左侧面板中选择墨迹书写和键入个性化,然后单击开始了解你选项,开启语音听写的策略选项。
如果打开,则Windows可以了解你的声音和文字,从而提供更好的建议。

如何同时使用短语和听写识别?
在语音识别处3D天堂做了标注,在同一应用程序中是不能同时使用听写和短语识别的。
因此,如果希望这两个功能都出现在应用程序中,那么在启动另一个之前先停止一个就行啦。
…
以上是3D天堂关于Unity的语音识别教程的全部内容,如果你有任何反馈,请随时在本页面下方留言。