Hololens输入——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();

有四个听写事件可以被订阅和处理以实施听写行为。

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. 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事件中检查这些超时。有两个超时要注意:
  1. 如果识别器开始并且在前5秒钟内没有听到任何音频,它将超时。
  1. 如果识别器给出了一个结果,然后听到静音二十秒钟,它将超时。

使用短语识别和听写

如果你想在你的应用程序中同时使用短语识别和口授,你需要完全关闭一个,然后才能开始另一个。如果您有多个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();
    }
}








猜你喜欢

转载自blog.csdn.net/aiyan1111111/article/details/71554314