107 lines
2.9 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Windows.Speech;
using ZXKFramework;
/// 语音命令识别
public class SpeechRecognition : MonoBehaviour
{
// 短语识别器
private PhraseRecognizer m_PhraseRecognizer;
// 关键字
string[] keywords;
// 可信度
public ConfidenceLevel m_confidenceLevel = ConfidenceLevel.Medium;
public static SpeechRecognition Instance;
public static event Action<string> callBack;
private void Start()
{
Instance = this;
DontDestroyOnLoad(this);
callBack = null;
}
/// <summary>
/// 关闭之后 只能接收到小智小智
/// </summary>
public void Close()
{
OnDestroy();
TheStart();
}
/// <summary>
/// 命令数据刷新2
/// </summary>
public void Open(string[] newKeys)
{
OnDestroy();
List<string> list = new List<string>();
for (int i = 0; i < newKeys.Length; i++)
{
if (!string.IsNullOrEmpty(newKeys[i]))
{
list.Add(newKeys[i]);
}
}
keywords = list.ToArray();
TheStart();
}
/// <summary>
/// 命令数据刷新
/// </summary>
public void Open()
{
OnDestroy();
string data = Resources.Load<TextAsset>("VoiceCommand").text;
if (!string.IsNullOrEmpty(data))
{
List<string> loAllData = new List<string>();
string[] loData = data.Split('|');
foreach (var item in loData)
{
if (!string.IsNullOrEmpty(item))
{
loAllData.Add(item.Trim());
}
}
keywords = new string[loAllData.Count];
for (int i = 0; i < loAllData.Count; i++)
{
keywords[i] = loAllData[i];
}
}
TheStart();
}
void TheStart()
{
if (m_PhraseRecognizer == null)
{
//创建一个识别器
m_PhraseRecognizer = new KeywordRecognizer(keywords, m_confidenceLevel);
//通过注册监听的方法
m_PhraseRecognizer.OnPhraseRecognized += M_PhraseRecognizer_OnPhraseRecognized;
//开启识别器
m_PhraseRecognizer.Start();
}
}
/// 当识别到关键字时,会调用这个方法
private void M_PhraseRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
_SpeechRecognition(args.text);
print(args.text);
}
private void OnDestroy()
{
//判断场景中是否存在语音识别器,如果有,释放
if (m_PhraseRecognizer != null)
m_PhraseRecognizer.Dispose();
}
/// 识别到语音的操作
void _SpeechRecognition(string msg)
{
callBack?.Invoke(msg);
}
}