文章目录[x]
- 1:简介
- 2:关键字识别
- 3:关键字识别代码
简介
Unity3D为Windows平台提供了语音识别功能,语音识别种类包括:关键字识别、语法识别和听写识别。关键字识别、语法识别可以离线使用,听写识别需要联网。如有离线听写识别的需求可以使用OpenAI开源的whisper项目,在本地部署whisper然后自行添加Web接口。
从Unity 5.4.0开始,Unity引擎添加了windows语音识别API (UnityEngine.Windows.Speech)来识别语音输入。这些api支持所有类型的windows平台(windows editor、windows independent和windows Store),但只支持windows 10及以上操作系统,支持中文语音识别。
- 操作系统要求: Window10、Windows11 (需要在设置中开启语音识别功能)
- Unity版本:5.4以上
- 引用命名空间: UnityEngine.Windows.Speech
关键字识别
- 1定义要识别的关键字 字符串数组
- 2订阅和处理OnPhraseRecognized事件。当给定短语被识别时,将调用此事件
- 3开始关键字识别
关键字识别代码
为了方便使用,为关键字识别做一个基类WOV(Wake of voice的缩写,我主要用关键字识别后做唤醒操作)
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// Wake-on-voice 语音唤醒 base类 /// </summary> public class WOV : MonoBehaviour { /// <summary> /// 关键词回调 /// </summary> protected Action<string> OnKeywordRecognizer; /// <summary> /// 绑定唤醒回调 /// </summary> /// <param name=""></param> /// <param name="_callback"></param> public virtual void OnBindAwakeCallBack(Action<string> _callback) { OnKeywordRecognizer += _callback; } /// <summary> /// 开始识别 /// </summary> public virtual void StartRecognizer() { } /// <summary> /// 结束识别 /// </summary> public virtual void StopRecognizer() { } /// <summary> /// 唤醒词回调 /// </summary> /// <param name="_msg"></param> protected virtual void OnAwakeOnVoice(string _msg) { if(OnKeywordRecognizer==null) return; OnKeywordRecognizer(_msg); } }
unity关键字识别类 UnityWakeOnVoice(我主要用关键字识别后做唤醒操作)
using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; #if UNITY_STANDALONE_WIN using UnityEngine.Windows.Speech; using Util; #endif /// <summary> /// unity内置语音唤醒 windows有效 /// </summary> public class UnityWakeOnVoice : WOV { /// <summary> /// 关键词 /// </summary> [SerializeField] private string[] m_Keywords;//要进行关键字识别的数字 如["开灯","关灯","关机"] /// <summary> /// 关键字识别器 /// </summary> #if UNITY_STANDALONE_WIN private KeywordRecognizer m_Recognizer; void Start() { //创建一个关键字识别器 m_Recognizer = new KeywordRecognizer(m_Keywords,ConfidenceLevel.Medium); Debug.Log("创建识别器成功"); m_Recognizer.OnPhraseRecognized += OnPhraseRecognized; StartRecognizer(); } private void OnDestroy() { StopRecognizer(); } /// <summary> /// 开始识别 /// </summary> public override void StartRecognizer() { if (m_Recognizer == null) return; m_Recognizer.Start(); } /// <summary> /// 结束识别 /// </summary> public override void StopRecognizer() { if (m_Recognizer == null) return; m_Recognizer.Stop(); } /// <summary> /// 识别关键词回调 /// </summary> /// <param name="args"></param> private void OnPhraseRecognized(PhraseRecognizedEventArgs args) { StringBuilder builder = new StringBuilder(); builder.AppendFormat("{0}", args.text); string _keyWord = builder.ToString(); Debug.Log("识别器捕捉到关键词:"+_keyWord); OnAwakeOnVoice(_keyWord); //处理回调 KeyWordHandle(_keyWord); //在本类里处理 } #endif private void KeyWordHandle(string keyWord) { DateTime dateTime = DateTime.Now; string strNowTime = string.Format("{0:D}-{1:D}-{2:D}-{3:D}-{4:D}-{5:D}-{6:D}", dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond); Debug.LogWarning($"识别到语音指令:{keyWord}"+" "+strNowTime ); switch (keyWord) { //识别不同的关键字后的逻辑 } } private void RecordCommandTime(string msg) { Debug.Log($"识别到语音指令:{msg}"); } }