本帖最后由 zoey不种土豆 于 2024-10-16 15:00 编辑
1 项目前言
本文介绍了一款基于行空板(UNIHIKER)制作的智能配饰,旨在通过AI角色扮演的方式提供有趣的交互并表达用户的个性。项目中借用了《小王子与玫瑰》中的“小王子”这一角色作为本项目AI角色原型,用户可以选择两种主要的互动模式:
- One-agent模式:用户作为小王子唯一的玫瑰,AI小王子会通过理解用户的对话,将生活中的点滴转化为鼓励和夸奖,提供情感支持。
- Multi-agents模式:小王子和玫瑰通过温暖且有趣的对话进行故事叙事,展示他们之间的互动。
本项目将分为两个主要部分:基础模块构建与作品创作部分。第一部分基础模块构建将侧重于技术实现和模块的复用,帮助用户搭建项目的基础结构。第二部分作品创作将展示如何将技术模块组合起来,逐步实现创意灵感。这个项目目前仍在不断探索中,预留了后续拓展和未来计划,以进一步丰富这个智能配饰的功能,使其更有趣。
2 视频展示
在项目正式开始前,为了让大家更直观地了解这个项目,请先观看一段展示视频。
3 材料清单
- 行空板 x 1
- USB Speaker x 1
- 5V充放电电池 x 1
- 开关 x 1
- USB-TypeC 数据线 x 1
- TypeC-TypeC 数据线 x 1
- 3D打印模型 x 1
- 80mm直径凸透镜 x 1
- 电工黑胶带 x 1
- M2自攻螺丝 x 2
4 基础模块构建
4.1 在行空板(UNIHIKER)上创建并管理虚拟环境
- 由于行空板(UNIHIKER)的默认环境是Python 3.7,但在运行某些开源模块时,可能需要配置其他版本的Python环境以避免版本兼容性问题。因此,本项目利用Conda来创建和配置所需的环境。
- 大致步骤:通过USB连接行空板 > 登陆终端 > 安装Miniforge Conda,并初始化和激活环境 > 创建新虚拟环境。
- 参考资料包括DFRobot论坛的相关教程:
How to Install Multiple Python Versions on Unihiker in the Simplest Way? For example , Python 3.10
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作为基础模型。以下代码整合了多个功能模块,实现从语音录制到语音播报的完整流程,涵盖语音输入、语音识别、大模型调用、语音播报和异步处理等知识点。
- 语音输入&识别: 利用Silero & Whisper模块实现持续语音识别,捕捉用户的语音输入。
- 大模型调用&AI对话生成: 使用Deepseek大模型,通过Prompt Engineering设计提示,引导AI模仿“小王子”的角色进行互动对话。
- 语音播报: 使用Edge-tts将AI生成的文字转换为语音,进一步增强用户体验。
- 异步处理: 通过asyncio实现多任务并发,确保语音识别和AI对话生成的高效运行。
- https://github.com/deepseek-ai/DeepSeek-V2
- 完整代码:【见文末压缩包】
5.1.2 云端调用版
实践证明,在本地计算版中发现对话不够流畅的问题,因此这里将原来使用Whisper和Edge-tts的代码改成使用百度的 API,将语音识别与播报换成云端调用。
- 获取令牌: 使用 get_baidu_access_token 函数从百度获取访问令牌。
- 语音转文本: 使用 baidu_speech_to_text 函数替代Whisper模型来处理音频文件。
- 文本转语音: 使用 baidu_text_to_speech 函数替代Edge-tts模型来生成音频文件。
装配顺序:
5.4.2 两块行空板(UNIHIKER)连接
由于现在是2块行空板(UNIHIKER),所以我们用wifi的方式来远程连接。
- 确保2块行空板(UNIHIKER)和你的电脑连接到同一个网络
- 在行空板上查看ip地址
- 在电脑上打开2个终端窗口,一个窗口连接一个行空板
- 分别在2个窗口输入以下命令连接到行空板:在这里把10.1.2.3改成行空板的ip地址
ssh root@10.1.2.3
密码:dfrobot
- 激活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 大功告成
未来展望
- USB摄像头实现多模态大模型,结合视觉进行互动对话。
- 个性化与Dify自定义Agent工作流
- 让人类用户参与两块行空板(UNIHIKER)的互动
完整代码见文末压缩包
|