当前位置: 首页 > news >正文

Unity关键词语音识别

       一、背景

        最近使用unity开发语音交互内容的时候,遇到了这样的需求,就是需要使用语音关键字来唤醒应用程序,然后再和程序做交互,有点像智能音箱的意思。具体的技术方案方面,也找了一些第三方的服务,比如百度AI开放平台,讯飞开放平台等,这些都提供有语音唤醒的服务,基本上能够满足我的项目开发需求。

        不过,我是想,先找一个免费且可以离线的方案的,从huggingface上倒是可以找到一些开源的模型可以做到,包括在github上也找到一些开源项目,比如snowboy。但是自己去部署服务的方式,我还是觉得有点重,又想白嫖,又想简单,呵呵。

        后来发现,其实unity本身就带有一个库,可能实现关键词的语音识别,也就是【UnityEngine.Windows.Speech】这个库,是可以做到设定关键词,然后通过语音识别,判断是否说的是设定的关键词。有了这个,就可以制作一个又简单,又能白嫖的离线关键词识别了。当然,这里要注意,这个库只能在windows平台使用。

        二、代码实现

        废话少说,直接上代码:

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
#if UNITY_STANDALONE_WIN
using UnityEngine.Windows.Speech;
#endif
/// <summary>
/// unity内置语音唤醒 windows有效
/// </summary>
public class UnityWakeOnVoice : MonoBehaviour
{/// <summary>/// 关键词/// </summary>[SerializeField]private string[] m_Keywords = { "关键词" };//关键字/// <summary>/// 关键字识别器/// </summary>
#if UNITY_STANDALONE_WINprivate KeywordRecognizer m_Recognizer;// Use this for initializationvoid Start(){//创建一个关键字识别器m_Recognizer = new KeywordRecognizer(m_Keywords);Debug.Log("创建识别器成功");m_Recognizer.OnPhraseRecognized += OnPhraseRecognized;}/// <summary>/// 开始识别/// </summary>public void StartRecognizer(){if (m_Recognizer == null)return;m_Recognizer.Start();}/// <summary>/// 结束识别/// </summary>public 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);}#endif
}

        这里还有一点要注意,这个关键词识别库,只有当你准确的说出某个关键词时,才能触发识别事件 ,一句话里包含关键词,实测是没能检测出来的。


三、结束语:

        这个示例已经用在我的一个AI二次元女友的项目里,可以实现在windows平台的实时语音唤醒和对话的功能,感兴趣的朋友可以移步到B站,收看实际效果,相关代码已经开源咯。

[Unity+AI聊天]语音唤醒+AI二次元老婆实时聊天,摆脱键盘开始聊嗨~

http://www.lryc.cn/news/192977.html

相关文章:

  • SpringBoot的配置文件——.yml和.properties
  • Retrieve Anything To Augment Large Language Models
  • 什么是面向对象编程
  • c++视觉处理----固定阈值操作:Threshold()函数,实时处理:二值化,反二值化,截断,设为零,反向设为零
  • KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(8)
  • 【问题解决】Ubuntu 安装 SeisSol 依赖 easi 报错解决: undefined reference to `H5free_memory‘
  • 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)rust解法
  • [GAMES101]透视投影变换矩阵中为什么需要改变z值
  • sklearn处理离散变量的问题——以决策树为例
  • QT 数据库表格----QSqlTableModel
  • Vue_Bug Failed to fetch extension, trying 4 more times
  • 缩短从需求到上线的距离:集成多种工程实践的稳定框架 | 开源日报 No.55
  • 基于秃鹰优化的BP神经网络(分类应用) - 附代码
  • C++笔记之std::future的用法
  • openssl学习——消息认证码原理
  • Netty使用SslHandler实现加密通信-单向认证篇
  • Jetpack:007-Kotlin中的Button
  • opencv图形绘制2
  • “华为杯”研究生数学建模竞赛2019年-【华为杯】A题:无线智能传播模型(附优秀论文及Pyhton代码实现)(续)
  • 爬虫 | 正则、Xpath、BeautifulSoup示例学习
  • nginx的location的优先级和匹配方式
  • 深入了解Spring Boot Actuator
  • 【SQL】NodeJs 连接 MySql 、MySql 常见语句
  • SSH 基础学习使用
  • JavaFX: 使用本地openjfx包
  • 【HCIA】静态路由综合实验
  • Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能
  • 获取本地缓存数据修改后,本地缓存中的值也修改问题
  • 云开发校园宿舍/企业/部门/物业故障报修小程序源码
  • K邻近算法(KNN,K-nearest Neighbors Algorithm)