说明:
本篇文章翻译来自Hololens官方文档—— Unity语音输入( https://developer.microsoft.com/en-us/windows/mixed-reality/voice_input_in_unity)
翻译如下:
前沿:
Unity公开了将Voice输入添加到Unity应用程序的三种方法。
使用KeywordRecognizer(两种类型的PhraseRecognizers之一),您的应用程序可以被赋予一系列要监听的字符串命令。使用GrammarRecognizer(另一种类型的PhraseRecognizer),您的应用程序可以被赋予一个定义特定语法的SRGS文件进行监听。使用DictationRecognizer,您的应用程序可以听任何单词,并向用户提供其语音的音符或其他显示。
注意:只有听写或词组识别才能立即处理。这意味着如果语法识别器或关键字识别器处于活动状态,则DictationRecognizer不能处于活动状态,反之亦然。
步骤如下所示:
启动语音功能
Unity必须启用Microphone 功能,才能使用语音功能,启用步骤如下所示:
Unity——Edit——Project Settings——Capabilitees——勾选Microphone选项
词组识别——KeywordRecognizer
要使您的应用程序听取用户使用的特定短语,然后采取一些措施,您需要:
- 指定使用KeywordRecognizer或GrammarRecognizer侦听哪些短语
- 处理OnPhraseRecognized事件,并采取与识别的短语相对应的操作
所需命名空间:UnityEngine.Windows.Speech
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
然后用一个Dictionary存储需要进行语音识别的关键字:
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
添加任意字符串作为关键词,并添加进字典(比如下面所示以activete作为关键词):
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
然后创建一个keywordRecogizer让它作为识别:
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
最后添加一个识别事件:
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();
整体简单案例如下所示:
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// Made By Bruce
/// </summary>
public class AudioCommond : MonoBehaviour
{
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
public GameObject cube;
void Start()
{
var t = CoroutineWrapper.Inst;
keywords.Add("MoveUp", () =>
{
cube.transform.localPosition += new Vector3(0, 1, 0);
});
keywords.Add("MoveDown", () =>
{
cube.transform.localPosition += new Vector3(0, -1, 0);
});
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();
}
}
}
语言输入——Dictation
所需命名空间——UnityEngine.Windows.Speech
使用DictationRecognizer将用户的语音转换为文本。DictationRecognizer公开了听写功能,并支持注册和聆听假设和短语完成的事件,因此您可以在发言和以后给您的用户反馈。Start()和Stop()方法分别启用和禁用听写识别。使用识别器完成后,应使用Dispose()方法来释放其使用的资源。如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。
开始使用录音只需要几个步骤:
- 创建一个新的DictationRecognizer
- 处理听写事件
- 启动DictationRecognizer
启用支持语言听写功能:
Unity——Edit——Project Settings——Capabilitees——勾选InternetClient选项
语音输入——DictationRecognizer
创建一个DictationRecognizer,如下所示:
dictationRecognizer = new DictationRecognizer();
有四个听写事件可以被订阅和处理以实施听写行为。
- DictationResult
- DictationComplete
- DictationHypothesis
- DictationError
DictationResult
用户暂停之后,通常在句子结尾处触发此事件。完整识别的字符串在这里返回。
注册DictationResult事件:
dictationRecognizer.DictationResult + = DictationRecognizer_DictationResult;
然后处理其回调:
private void DictationRecognizer_DictationResult(string text,ConfidenceLevel confidence)
{
//do something
}
DictationHypothesis
这个事件在用户正在说话时被持续触发。当识别器侦听时,它提供了迄今为止所听到的内容。
DictationComplete
无论从Stop()被调用,是否发生超时或其他错误,识别器将停止此事件。
DictationError
发生错误时触发此事件。
提示
- Start()和Stop()方法分别启用和禁用听写识别。
- 使用识别器完成后,必须使用Dispose()方法进行处理,以释放其使用的资源。如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。
- 超时发生在一段时间后。您可以在DictationComplete事件中检查这些超时。有两个超时要注意:
- 如果识别器开始并且在前5秒钟内没有听到任何音频,它将超时。
- 如果识别器给出了一个结果,然后听到静音二十秒钟,它将超时。
使用短语识别和听写
如果你想在你的应用程序中同时使用短语识别和口授,你需要完全关闭一个,然后才能开始另一个。如果您有多个KeywordRecognizer运行,您可以一次关闭它们:
PhraseRecognitionSystem.Shutdown();
为了将所有识别器恢复到之前的状态,在DictationRecognizer停止之后,您可以调用:
PhraseRecognitionSystem.Restart();
您也可以启动一个KeywordRecognizer,这将重新启动PhraseRecognitionSystem。
简单案例如下所示:
using UnityEngine;
using UnityEngine.Windows.Speech;
using UnityEngine.UI;
public class AudioDiction : MonoBehaviour
{
private DictationRecognizer dictationRecognizer;
public Text showResultText;
void Start()
{
dictationRecognizer = new DictationRecognizer();
//This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
//This event is fired while the user is talking. As the recognizer listens, it provides text of what it‘s heard so far.
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
//This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
//This event is fired when an error occurs.
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
//开始听写识别
dictationRecognizer.Start();
}
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// 自定义行为
showResultText.text = text;
}
private void DictationRecognizer_DictationHypothesis(string text)
{
// 自定义行为
showResultText.text = text;
}
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// 自定义行为
showResultText.text = "Complete!";
}
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();
}
}