如何将WinUI与ChatGPT、摄像头手势识别及TTS技术结合,打造更智能的机器人?
摘要:前言 之前写过一篇基于ML.NET的手部关键点分类的博客,可以根据图片进行手部的提取分类,于是我就将手势分类和摄像头数据结合,集成到了我开发的电子脑壳软件里。 电子脑壳是一个为稚晖君开源的桌面机器人ElectronBot提供一些软件功能的桌
前言
之前写过一篇基于ML.NET的手部关键点分类的博客,可以根据图片进行手部的提取分类,于是我就将手势分类和摄像头数据结合,集成到了我开发的电子脑壳软件里。
电子脑壳是一个为稚晖君开源的桌面机器人ElectronBot提供一些软件功能的桌面程序项目。它是由绿荫阿广也就是我开发的,使用了微软的WASDK框架。
电子脑壳算是本人学习WinUI开发的练习项目了,通过根据一些开源的项目的学习,将一些功能进行整合,比如手势识别触发语音转文本,然后接入ChatGPT结合文本转语音的方式,实现机器人的对话。
此博客算是实战记录了,替大家先踩坑。
下图链接为机器人的演示视频,通过对话,让ChatGPT给我讲了一个骆驼祥子的故事,只不过这个故事有点离谱,本来前部分还正常,后面就开始瞎编了,比如祥子有了一头驴,最后还成为了商人。
大家观看觉得不错的话给点个赞。
具体的实现方案
1. 方案思路叙述
整体的流程如下图,图画的不一定标准,但是大体如图所示:
处理摄像头帧事件,通过将摄像头的帧数据处理进行手势的匹配。
手势识别结果处理方法调用语音转文本逻辑。
转的文本通过调用ChatGPT API实现智能回复。
将回复结果文本通过TTS播放到机器人上的扬声器,完成一次对话。
2. 所用技术说明
WASDK
MediaPipe offers open source cross-platform, customizable ML solutions for live and streaming media.
ML.NET 开放源代码的跨平台机器学习框架
上面的技术栈在我上面文章里有讲述,这里就不展开了,大家有兴趣的可以点击之前的文章查看。
WinUI(WASDK)使用MediaPipe检查手部关键点并通过ML.NET进行手势分类
代码讲解
1. 项目介绍
电子脑壳项目本身是一个标准的MVVM的WinUI项目,使用微软的轻量级DI容器管理对象的生命周期,MVVM使用的是社区工具包提供的框架,支持代码生成,简化VM的代码。
2. 核心代码讲解
实时视频流解析手势,通过命名空间Windows.Media.Capture下的MediaCapture类和Windows.Media.Capture.Frames命名空间下的MediaFrameReader类,创建对象并注册帧处理事件,在帧处理事件中处理视频画面并传出到手势识别服务里进行手势识别,主要代码如下。
//帧处理结果订阅
private void Current_SoftwareBitmapFrameCaptured(object? sender, SoftwareBitmapEventArgs e)
{
if (e.SoftwareBitmap is not null)
{
if (e.SoftwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
e.SoftwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight)
{
e.SoftwareBitmap = SoftwareBitmap.Convert(
e.SoftwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
}
//手势识别服务获取
var service = App.GetService<GestureClassificationService>();
//调用手势分析代码
_ = service.HandPredictResultUnUseQueueAsync(calculator, modelPath, e.SoftwareBitmap);
}
}
涉及到的代码如下:
MainViewModel
CameraFrameService
语音转文本的实现,WinUI(WASDK)继承了UWP的现代化的UI,也可以很好的使用WinRT的API进行操作。主要涉及的对象为命名空间Windows.Media.SpeechRecognition下的SpeechRecognizer对象。
