zoey不种土豆 发表于 2024-9-12 15:10:39

行空板AI智能配饰项目:打造沉浸式“小王子”互动体验

本帖最后由 zoey不种土豆 于 2024-12-5 16:05 编辑

# 1 项目前言
本文介绍了一款基于行空板(UNIHIKER)制作的智能配饰,旨在通过AI角色扮演的方式提供有趣的交互并表达用户的个性。项目中借用了《小王子与玫瑰》中的“小王子”这一角色作为本项目AI角色原型,用户可以选择两种主要的互动模式:
1. **One-agent模式**:用户作为小王子唯一的玫瑰,AI小王子会通过理解用户的对话,将生活中的点滴转化为鼓励和夸奖,提供情感支持。
2. **Multi-agents模式**:小王子和玫瑰通过温暖且有趣的对话进行故事叙事,展示他们之间的互动。
本项目将分为两个主要部分:基础模块构建与作品创作部分。第一部分基础模块构建将侧重于技术实现和模块的复用,帮助用户搭建项目的基础结构。第二部分作品创作将展示如何将技术模块组合起来,逐步实现创意灵感。这个项目目前仍在不断探索中,预留了后续拓展和未来计划,以进一步丰富这个智能配饰的功能,使其更有趣。

# 2 视频展示
在项目正式开始前,为了让大家更直观地了解这个项目,请先观看一段展示视频。
https://dfrobot.loll.cc/video/2%20%E8%A7%86%E9%A2%91.mp4

# 3 材料清单
1. [行空板](https://www.dfrobot.com.cn/goods-3404.html) x 1
2. USB 扬声器 x 1
3. 5V充放电电池 x 1
4. 开关 x 1
5. USB-TypeC 数据线 x 1
6. TypeC-TypeC 数据线 x 1
7. 3D打印模型 x 1
8. 80mm直径凸透镜 x 1
9. 电工黑胶带 x 1
10. M2自攻螺丝 x 2

# 4 基础模块构建
## 4.1 在行空板(UNIHIKER)上创建并管理虚拟环境
- 由于行空板(UNIHIKER)的默认环境是Python 3.7,但在运行某些开源模块时,可能需要配置其他版本的Python环境以避免版本兼容性问题。因此,本项目利用Conda来创建和配置所需的环境。
- 大致步骤:通过USB连接行空板 > 登陆终端 > 安装Miniforge Conda,并初始化和激活环境 > 创建新虚拟环境。
- 参考资料包括DFRobot论坛的相关教程:
(https://www.dfrobot.com/forum/topic/322359)
## 4.2 用行空板(UNIHIKER)实现语音输入自动化(Silero)
- 本项目使用的是Silero模型上实现自然语音交互。这包括自动识别用户何时开始说话、自动进行录音,以及在用户停止说话后自动发送语音数据,广泛应用于智能家居控制、交互式学习和其他需要解放双手操作的场景。
- 大致步骤:导入必要的库 > Silero VAD设置 > 加载Silero VAD模型 > 初始化音频流 > 音频保存函数 > 主录音循环 > 清理和资源释放。
- 参考资料:(https://github.com/snakers4/silero-vad)
- 完整代码:01_silero_test.py【见文末压缩包】
## 4.3 在行空板(UNIHIKER)上本地部署大模型(Ollama)
- Ollama 是一个轻量级且可扩展的框架,专为在本地计算机上构建和运行大型语言模型(Large Language Models, LLMs)而设计。本项目将在行空板的环境中完成 Ollama 的安装与配置,确保它能够顺利运行并满足特定的应用需求。这一过程包括从下载和安装 Ollama 所需的依赖项到配置本地环境,以及进行必要的调试和测试。通过这些步骤,即可行空板(UNIHIKER)上实现高效的本地部署,为后续的开发和应用提供支持。
- 以下脚本实现了一个简单的聊天应用,可以通过本地运行的 Ollama 语言模型进行对话。用户输入消息,程序将这些消息发送给模型,并实时显示模型的响应。对话记录保存在 messages 列表中,确保上下文连续传递。
- 参考资料:(https://github.com/ollama/ollama)
- 完整代码:02_2_ollama_test.py【见文末压缩包】
## 4.4 在行空板(UNIHIKER)上持续进行语音识别(Silero & Whisper)
- 行空板(UNIHIKER)上的语音输入自动化,这项技术包括自动检测用户开始说话的时刻、自动进行录音,以及在用户停止说话后自动处理和发送语音数据。本文将在此基础上,进一步利用 Whisper 技术进行语音识别,以实现持续性的语音转文字功能。Whisper 是一种功能强大的语音识别工具,适用于各种语言和任务,能够在多种应用场景中提供高效的语音转文字服务。
- 通过以下代码,即可观察到:当你对着行空板(UNIHIKER)的麦克风说话,就可以在终端中看到实时语音识别的结果。
- 参考资料:(https://github.com/openai/whisper)
- 完整代码:02_1_silero_whisper.py 【见文末压缩包】
## 4.5 行空板(UNIHIKER)本地部署语音播报模块(Edge-tts)
- Edge-tts 是一个 Python 模块,可以在行空板(UNIHIKER)上实现本地部署的文字转语音(TTS)功能。通过使用 Edge-tts 模块,即可在行空板(UNIHIKER)环境中直接调用 Microsoft Edge 提供的在线文本转语音服务,实现高质量的语音播报。
- 通过以下代码即可学习如何将文本转换为语音,处理流式音频数据,并通过 Python 进行异步编程和系统命令执行。
- 参考资料:(https://github.com/openai/whisper)
- 完整代码:02_5_edge_tts_stream.py 【见文末压缩包】
# 5.作品创作
## 5.1 角色设定 & 服务器搭建
完成上述的基础模块构建后,我们将通过本地部署和云端调用这两种不同的方式来实现AI与用户的语音互动。为了避免对话延迟的问题,采用异步策略进行持续对话记录,以确保小王子的每一句回复都不会遗漏。小王子可以聆听所有的语音输入并逐一回应,为用户提供身边有人对话的陪伴感。
### 5.1.1 本地计算版
我们计划首先将本地模型部署到行空板上,以测试其极限算力。在这里,我们选用Deepseek作为基础模型。以下代码整合了多个功能模块,实现从语音录制到语音播报的完整流程,涵盖语音输入、语音识别、大模型调用、语音播报和异步处理等知识点。
!(https://imagemc.dfrobot.com.cn/data/attachment/album/202409/12/112003otb2fabzxzubydzv.png)
1. **语音输入&识别**: 利用Silero & Whisper模块实现持续语音识别,捕捉用户的语音输入。
2. **大模型调用&AI对话生成**: 使用Deepseek大模型,通过Prompt Engineering设计提示,引导AI模仿“小王子”的角色进行互动对话。
3. **语音播报**: 使用Edge-tts将AI生成的文字转换为语音,进一步增强用户体验。
4. **异步处理**: 通过asyncio实现多任务并发,确保语音识别和AI对话生成的高效运行。
- (https://github.com/deepseek-ai/DeepSeek-V2)
- 完整代码:【见文末压缩包】
### 5.1.2 云端调用版
实践证明,在本地计算版中发现对话不够流畅的问题,因此这里将原来使用Whisper和Edge-tts的代码改成使用百度的 API,将语音识别与播报换成云端调用。
1. **获取令牌**: 使用 get_baidu_access_token 函数从百度获取访问令牌。
2. **语音转文本**: 使用 baidu_speech_to_text 函数替代Whisper模型来处理音频文件。
3. **文本转语音**: 使用 baidu_text_to_speech 函数替代Edge-tts模型来生成音频文件。
https://dfrobot.loll.cc/video/5-1-2.mp4
百度智能云:(https://login.bce.baidu.com/?redirect=https%3A%2F%2Fkeyue.cloud.baidu.com%2Funit%2Fflow)
完整代码:【见文末压缩包】
## 5.2 多AI通信
在以上项目中,我们重现了小王子在星球上的孤独与思念。他每天向地球上的玫瑰发送消息,却无回应。为了缓解他的孤独,我们创建了一个赛博玫瑰,通过Flask服务器让两块行空板(UNIHIKER)实现通信。本次程序的编写涉及2个py文件:小王子和玫瑰。小王子端主要负责接收来自玫瑰端的消息,处理这些消息,并将处理后的结果发送回玫瑰端。它在整个系统中充当了一个客户端的角色,向其他服务发出请求并接收响应。在玫瑰端的代码中,Flask 的相关部分用于创建一个简单的 web 服务器,用于处理接收到的消息并进行相应的操作。

https://dfrobot.loll.cc/video/5-2.mp4

- 需要将上述2个程序分别保存到2个行空板的`/root/silero-vad-master/` 目录下,并命名为 04_5_deepseek_baidu_flask_prince.py 和 04_6_deepseek_baidu_flask_Rose.py
- 小王子端代码:04_5_deepseek_baidu_flask_prince.py【见文末压缩包】
- 玫瑰端代码:04_6_deepseek_baidu_flask_rose.py【见文末压缩包】
## 5.3 为AI角色创建可视化面孔
为了缓解小王子的孤独,已经为他创建一个赛博玫瑰来回应他的消息。接下来,我们将在自建的虚拟环境里,我们使使用GUI并动态切换GIF动画实现生动表情,主要想实现显示单个或多个 GIF 动图,并通过按键切换显示的 GIF,为AI角色创建各自可视化面孔。
https://dfrobot.loll.cc/video/5-3-1.mp4
https://dfrobot.loll.cc/video/5-3-2.mp4
https://dfrobot.loll.cc/video/5-3-3.mp4

- 完整代码:【见文末压缩包】
## 5.4 成品组装&冲突处理
### 5.4.1 硬件组装
完成以上步骤后,我们最终将解决GUI、Flask与原先asyncio异步处理之间的逻辑冲突,并介绍造型设计、制作装配的详细过程。
!(https://imagemc.dfrobot.com.cn/data/attachment/album/202409/12/142152hbcyby6bz69c6c6j.png?)
以上是我们已经准备好的完整硬件与材料,为了适配项目,需要对现有的材料进行一些简单改造。
1. 修改电池的电源输出线,改成细的TypeC-TypeC 数据线(工艺:焊接)
2. 把开关焊接在正极接线上
3. 为了使整体造型尽可能小巧,我们需要在这里做一个取舍:剪掉行空板的金手指两个角(工艺:手持切割机)
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202409/12/142152fqqqjgzqlccgc7w1.png?)

装配顺序:
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202409/12/142152gkgcu8bsb8kgag81.png?)
### 5.4.2 两块行空板(UNIHIKER)连接
由于现在是2块行空板(UNIHIKER),所以我们用wifi的方式来远程连接。
1. 确保2块行空板(UNIHIKER)和你的电脑连接到同一个网络
2. 在行空板上查看ip地址
3. 在电脑上打开2个终端窗口,一个窗口连接一个行空板
4. 分别在2个窗口输入以下命令连接到行空板:在这里把10.1.2.3改成行空板的ip地址
`ssh root@10.1.2.3`
密码:`dfrobot`
5. 激活chat_agents环境:
`conda activate chat_agents`
### 5.4.3 运行程序
- 此处提供修改后的完整代码,GUI、Flask与原先asyncio异步处理之间的逻辑冲突较为细节,后续补充教学。
- 代码:05_5_2_deepseek_baidu_flask_prince_gif_scale_tutorial
               05_6_deepseek_baidu_flask_rose_gif_tutorial【见文末压缩包】
- 将上述程序分别保存到2块行空板的 `/root/silero-vad-master/` 目录下,并命名为:prince.py和Rose.py并运行
# 6 大功告成

https://dfrobot.loll.cc/video/61.mp4
https://dfrobot.loll.cc/video/62.mp4


## 未来展望
- USB摄像头实现多模态大模型,结合视觉进行互动对话。
- 个性化与Dify自定义Agent工作流
- 让人类用户参与两块行空板(UNIHIKER)的互动

# 完整代码见文末压缩包


页: [1]
查看完整版本: 行空板AI智能配饰项目:打造沉浸式“小王子”互动体验