merge qwen-agent

This commit is contained in:
朱潮 2025-11-04 22:38:42 +08:00
parent 644bbbf1ad
commit 0253a06d11
7 changed files with 802 additions and 3 deletions

View File

@ -5,6 +5,6 @@
"voice": "ICL_zh_male_youmodaye_tob",
"max_tokens": 500,
"greeting": "你好!我是爱因斯坦。想象力比知识更重要,因为知识是有限的,而想象力概括着世界的一切。",
"nfc_uid": "1DCAC90D0D1080",
"nfc_uid": "1DCDC90D0D1080",
"author": "Claude"
}

View File

@ -5,6 +5,6 @@
"voice": "ICL_zh_male_huzi_v1_tob",
"max_tokens": 500,
"greeting": "吾乃李白,字太白,号青莲居士。今天有幸与君相会,让我们畅谈诗词人生吧!",
"nfc_uid": "1DC6C90D0D1080",
"nfc_uid": "1DCCC90D0D1080",
"author": "Claude"
}

171
scratch/DESIGN.md Normal file
View File

@ -0,0 +1,171 @@
# Scratch语音助手设计文档
## 项目概览
基于原Python多进程语音系统的简化版专为Scratch平台设计的教育性质AI助手。
## 核心功能
### 1. 语音交互系统
- **输入**: Scratch内置语音识别
- **输出**: Scratch文本转语音
- **触发**: 点击绿旗或按键触发录音
### 2. 角色扮演系统
基于原项目的角色设定创建4个可切换的AI角色
#### 李白 (libai)
- **性格**: 浪漫诗人,豪放不羁
- **说话风格**: 文言文,经常引用诗句
- **特征回复**:
- "吾乃李白,字太白,号青莲居士"
- "喝酒写诗,人生一大乐事"
- "飞流直下三千尺,疑是银河落九天"
#### 猪八戒 (zhubajie)
- **性格**: 贪吃懒做,幽默风趣
- **说话风格**: 口语化,喜欢谈论吃的
- **特征回复**:
- "嘿嘿,俺老猪来也"
- "肚子饿了,有没有好吃的?"
- "师父,我们休息一下吧"
#### 唐僧 (tangseng)
- **性格**: 慈悲为怀,说话文雅
- **说话风格**: 温文尔雅,经常念经
- **特征回复**:
- "阿弥陀佛,善哉善哉"
- "出家人以慈悲为怀"
- "悟空,不得无礼"
#### 沙僧 (shaseng)
- **性格**: 忠厚老实,沉默寡言
- **说话风格**: 简洁朴实,忠诚可靠
- **特征回复**:
- "大师兄说得对"
- "师父,我来扛行李"
- "二师兄,你又偷懒了"
### 3. 关键词匹配系统
设计简单的关键词触发回复:
#### 通用问候
- "你好" → "你好!很高兴见到你"
- "谢谢" → "不客气,这是应该的"
- "再见" → "再见,下次见"
#### 角色特色回复
- 李白 + "诗" → 谈论诗歌创作
- 猪八戒 + "吃" → 谈论美食
- 唐僧 + "佛" → 谈论佛法
- 沙僧 + "行李" → 谈论挑担子
## 技术实现
### 变量设计
```
当前角色 (current_character) = "libai"
对话状态 (conversation_state) = "idle"
录音状态 (recording_state) = "stopped"
对话历史 (conversation_history) = []
回复内容 (response_text) = ""
```
### 列表设计
```
角色列表 (characters) = ["libai", "zhubajie", "tangseng", "shaseng"]
角色名称 (character_names) = ["李白", "猪八戒", "唐僧", "沙僧"]
关键词列表 (keywords) = ["你好", "谢谢", "再见", "诗", "吃", "佛", "行李"]
回复模板 (response_templates) = [...]
```
### 广播消息
```
开始录音 (start_recording)
停止录音 (stop_recording)
切换角色 (change_character)
显示回复 (show_response)
清除对话 (clear_conversation)
```
## 视觉设计
### 背景设计
- 主背景:简洁的界面,包含标题和状态显示
- 角色选择区4个角色头像按钮
- 对话显示区:显示对话历史
- 控制按钮:录音、清除、帮助
### 角色造型
每个角色设计2-3个造型
- 默认造型(正常状态)
- 说话造型(张嘴状态)
- 思考造型(皱眉状态)
## 积木逻辑流程
### 主程序流程
```
当绿旗被点击
初始化变量
显示角色选择按钮
设置为待机状态
等待用户操作
```
### 录音处理流程
```
当点击录音按钮
广播"开始录音"
侦听语音并等待
识别结果 → 存储到变量
分析关键词
生成回复
广播"显示回复"
说出回复内容
```
### 角色切换流程
```
当点击角色头像
设置当前角色变量
切换角色显示
播放切换音效
显示角色介绍
```
## 扩展功能
### 1. 对话历史
- 保存最近10轮对话
- 支持查看历史记录
- 支持清除历史
### 2. 表情动画
- 根据回复内容切换角色造型
- 添加简单的动画效果
- 增加互动趣味性
### 3. 音效系统
- 角色切换音效
- 录音开始/结束提示音
- 错误提示音
## 部署建议
### 开发环境
- Scratch 3.0 桌面版
- 需要网络连接(语音功能)
- 麦克风和扬声器设备
### 测试建议
- 先测试语音识别功能
- 再测试角色切换逻辑
- 最后测试整体交互流程
### 优化方向
- 增加更多角色
- 优化关键词匹配算法
- 添加更多动画效果
- 支持多语言
这个简化版本保留了原项目的核心AI交互体验同时适合在Scratch平台实现和教育场景使用。

313
scratch/IMPLEMENTATION.md Normal file
View File

@ -0,0 +1,313 @@
# Scratch项目实现指南
## 开始使用
### 1. 创建新项目
1. 打开 Scratch 3.0 (https://scratch.mit.edu 或桌面版)
2. 创建新项目,命名为 "Scratch语音助手"
3. 删除默认的猫咪角色
### 2. 创建角色
#### 主控制角色 (Main Controller)
```
造型:
- controller.png: 控制面板图标
```
**积木代码:**
```
当绿旗被点击
隐藏
初始化变量 :: custom
广播 [setup v]
当接收到 [setup v]
显示角色按钮 :: custom
设置对话状态为 "idle" :: custom
定义 初始化变量
设置 [当前角色 v] 为 "libai"
设置 [对话状态 v] 为 "idle"
设置 [录音状态 v] 为 "stopped"
删除 [对话历史 v] 的全部项目
设置 [回复内容 v] 为 ""
```
#### 李白角色 (Li Bai)
```
造型:
- libai_normal.png: 正常状态
- libai_speaking.png: 说话状态
- libai_thinking.png: 思考状态
```
**积木代码:**
```
当角色被点击
广播 [切换到李白 v] 并等待
切换造型到 [libai_normal v]
显示回复 "吾乃李白,字太白,号青莲居士。今天有幸与君相会!"
当接收到 [切换到李白 v]
设置 [当前角色 v] 为 "libai"
切换造型到 [libai_normal v]
说 "李白" (2) 秒
```
#### 猪八戒角色 (Zhu Bajie)
```
造型:
- zhubajie_normal.png: 正常状态
- zhubajie_speaking.png: 说话状态
- zhubajie_hungry.png: 饥饿状态
```
**积木代码:**
```
当角色被点击
广播 [切换到猪八戒 v] 并等待
切换造型到 [zhubajie_normal v]
显示回复 "嘿嘿,俺老猪来也!有什么好吃的吗?"
当接收到 [切换到猪八戒 v]
设置 [当前角色 v] 为 "zhubajie"
切换造型到 [zhubajie_normal v]
说 "猪八戒" (2) 秒
```
#### 唐僧角色 (Tang Monk)
```
造型:
- tangseng_normal.png: 正常状态
- tangseng_speaking.png: 说话状态
- tangseng_praying.png: 念佛状态
```
**积木代码:**
```
当角色被点击
广播 [切换到唐僧 v] 并等待
切换造型到 [tangseng_normal v]
显示回复 "阿弥陀佛,善哉善哉。贫僧唐三藏,有何指教?"
当接收到 [切换到唐僧 v]
设置 [当前角色 v] 为 "tangseng"
切换造型到 [tangseng_normal v]
说 "唐僧" (2) 秒
```
#### 沙僧角色 (Sha Monk)
```
造型:
- shaseng_normal.png: 正常状态
- shaseng_speaking.png: 说话状态
- shaseng_carrying.png: 挑担状态
```
**积木代码:**
```
当角色被点击
广播 [切换到沙僧 v] 并等待
切换造型到 [shaseng_normal v]
显示回复 "大师兄说得对。我来扛行李!"
当接收到 [切换到沙僧 v]
设置 [当前角色 v] 为 "shaseng"
切换造型到 [shaseng_normal v]
说 "沙僧" (2) 秒
```
### 3. 背景设计
#### 主背景 (Main Background)
```
创建文本显示区域:
- 标题: "Scratch语音助手"
- 状态显示: "当前角色: [变量]"
- 对话历史显示区域
- 控制按钮区域
```
### 4. 核心功能实现
#### 语音处理功能
```
当接收到 [开始录音 v]
设置 [录音状态 v] 为 "recording"
切换造型到 [speaking v]
侦听语音并等待
设置 [识别结果 v] 为 (侦听结果)
设置 [录音状态 v] 为 "processing"
分析回复 :: custom
显示回复 :: custom
设置 [录音状态 v] 为 "stopped"
定义 分析回复
如果 <(当前角色) = "libai"> 那么
李白回复 :: custom
否则
如果 <(当前角色) = "zhubajie"> 那么
猪八戒回复 :: custom
否则
如果 <(当前角色) = "tangseng"> 那么
唐僧回复 :: custom
否则
如果 <(当前角色) = "shaseng"> 那么
沙僧回复 :: custom
否则
默认回复 :: custom
结束
结束
结束
结束
```
#### 角色回复逻辑
**李白回复:**
```
定义 李白回复
如果 <([识别结果 v] 包含 [诗]) 那么
设置 [回复内容 v] 为 "诗歌乃吾之最爱!李白斗酒诗百篇,长安市上酒家眠。"
否则
如果 <([识别结果 v] 包含 [酒]) 那么
设置 [回复内容 v] 为 "人生得意须尽欢,莫使金樽空对月!来,共饮一杯!"
否则
如果 <([识别结果 v] 包含 [朋友]) 那么
设置 [回复内容 v] 为 "桃花潭水深千尺,不及汪伦送我情。友情珍贵啊!"
否则
设置 [回复内容 v] 为 "吾乃李白,今天诗兴大发,想听什么诗?"
结束
结束
结束
```
**猪八戒回复:**
```
定义 猪八戒回复
如果 <([识别结果 v] 包含 [吃]) 那么
设置 [回复内容 v] 为 "嘿嘿,说到吃俺老猪就来劲了!有没有包子馒头?"
否则
如果 <([识别结果 v] 包含 [睡觉]) 那么
设置 [回复内容 v] 为 "睡个好觉真舒服!师父说我又偷懒了,嘿嘿。"
否则
如果 <([识别结果 v] 包含 [师父]) 那么
设置 [回复内容 v] 为 "师父真是的,老让俺老猪干活。大师兄呢?"
否则
设置 [回复内容 v] 为 "俺老猪饿了,有没有好吃的?"
结束
结束
结束
```
**唐僧回复:**
```
定义 唐僧回复
如果 <([识别结果 v] 包含 [佛]) 那么
设置 [回复内容 v] 为 "阿弥陀佛。佛法无边,普度众生。善哉善哉。"
否则
如果 <([识别结果 v] 包含 [徒弟]) 那么
设置 [回复内容 v] 为 "为师有三个徒弟,虽然各有缺点,但都是好心肠。"
否则
如果 <([识别结果 v] 包含 [经]) 那么
设置 [回复内容 v] 为 "真经取来不易,我们要好好研读,弘扬佛法。"
否则
设置 [回复内容 v] 为 "阿弥陀佛,施主有何烦心事?"
结束
结束
结束
```
**沙僧回复:**
```
定义 沙僧回复
如果 <([识别结果 v] 包含 [行李]) 那么
设置 [回复内容 v] 为 "行李我来扛!大师兄打妖怪,二师兄吃东西,我干活。"
否则
如果 <([识别结果 v] 包含 [大师兄]) 那么
设置 [回复内容 v] 为 "大师兄孙悟空最厉害了!七十二变,火眼金睛!"
否则
如果 <([识别结果 v] 包含 [二师兄]) 那么
设置 [回复内容 v] 为 "二师兄猪八戒又偷懒了,师父让他去化缘。"
否则
设置 [回复内容 v] 为 "我在,我来扛行李。"
结束
结束
结束
```
### 5. 用户界面元素
#### 录音按钮
```
当角色被点击
如果 <(录音状态) = "stopped"> 那么
广播 [开始录音 v]
否则
广播 [停止录音 v]
结束
```
#### 清除对话按钮
```
当角色被点击
删除 [对话历史 v] 的全部项目
隐藏所有对话气泡
说 "对话已清除" (1) 秒
```
### 6. 列表和变量设置
#### 变量:
```
当前角色 (current_character) - 文本
对话状态 (conversation_state) - 文本
录音状态 (recording_state) - 文本
识别结果 (recognition_result) - 文本
回复内容 (response_text) - 文本
```
#### 列表:
```
对话历史 (conversation_history) - 文本列表
角色名称 (character_names) - 文本列表
关键词列表 (keywords) - 文本列表
```
## 测试建议
### 1. 基础功能测试
- 测试角色切换
- 测试录音功能
- 测试回复显示
### 2. 角色特色测试
- 测试李白的诗词语境
- 测试猪八戒的吃货特色
- 测试唐僧的佛语特色
- 测试沙僧的朴实特色
### 3. 交互体验测试
- 测试连续对话
- 测试切换角色的流畅性
- 测试错误处理
## 扩展功能
### 1. 动画效果
- 角色说话时的嘴型动画
- 切换角色时的过渡效果
- 录音时的视觉反馈
### 2. 音效系统
- 角色切换音效
- 录音开始/结束提示音
- 错误提示音
### 3. 更多角色
- 添加孙悟空角色
- 添加其他历史人物
- 添加现代角色
这个实现指南提供了详细的Scratch积木代码结构可以直接在Scratch中实现一个功能完整的语音助手。

51
scratch/README.md Normal file
View File

@ -0,0 +1,51 @@
# Scratch语音助手项目说明
## 项目概述
这是一个基于Python项目的简化版Scratch语音助手保留了原项目的核心交互功能。
## 原项目功能分析
- 多进程音频录音系统
- 语音检测与识别
- AI角色扮演李白、猪八戒等
- 文本转语音
- NFC角色切换
- LED灯光效果
## Scratch简化版本功能
1. **基础语音对话** - 使用Scratch内置语音功能
2. **角色切换系统** - 通过按钮切换不同AI角色
3. **简单对话逻辑** - 关键词匹配和预设回复
4. **状态显示** - 显示当前角色和系统状态
## 角色设定基于原项目characters/
- **李白** (libai) - 诗人风格,浪漫诗意
- **猪八戒** (zhubajie) - 幽默贪吃性格
- **唐僧** (tangseng) - 慈悲为怀,说话文雅
- **沙僧** (shaseng) - 忠厚老实,简洁回应
## 实现思路
1. 使用Scratch的"语音识别"和"文本转语音"积木
2. 用变量存储当前角色和对话状态
3. 用列表存储不同角色的性格特征和回复模板
4. 用广播消息控制状态切换
## Scratch项目结构建议
```
角色1: 主角 - 负责语音交互
角色2: 李白 - 显示诗人形象和说话
角色3: 猪八戒 - 显示八戒形象和说话
角色4: 唐僧 - 显示唐僧形象和说话
角色5: 沙僧 - 显示沙僧形象和说话
背景: 主界面 - 显示状态和控制按钮
```
## 核心积木逻辑
1. **开始录音**: `当绿旗被点击``侦听语音并等待`
2. **角色切换**: `当角色被点击``切换当前角色变量`
3. **回复生成**: `根据关键词和当前角色选择回复`
4. **语音输出**: `说出回复内容`
## 注意事项
- Scratch的语音功能需要网络连接
- 不同设备的语音识别支持度不同
- 建议在桌面版Scratch中开发测试

264
scratch/project-config.json Normal file
View File

@ -0,0 +1,264 @@
{
"project_name": "Scratch语音助手",
"description": "基于Python多进程语音系统的简化版Scratch实现",
"version": "1.0.0",
"target_platform": "Scratch 3.0",
"complexity": "初级",
"estimated_time": "2-3小时",
"skills_required": [
"Scratch基础操作",
"变量使用",
"广播消息",
"角色造型切换",
"语音识别和合成"
],
"project_structure": {
"roles": [
{
"name": "MainController",
"type": "controller",
"description": "主控制角色,负责初始化和状态管理",
"costumes": ["controller"],
"scripts": ["initialization", "event_handling"]
},
{
"name": "LiBai",
"type": "character",
"description": "李白角色,诗人风格",
"costumes": ["libai_normal", "libai_speaking", "libai_thinking"],
"personality": {
"style": "文言文,诗意",
"keywords": ["诗", "酒", "朋友", "月亮"],
"greeting": "吾乃李白,字太白,号青莲居士"
},
"responses": {
"诗": "诗歌乃吾之最爱!李白斗酒诗百篇,长安市上酒家眠。",
"酒": "人生得意须尽欢,莫使金樽空对月!来,共饮一杯!",
"朋友": "桃花潭水深千尺,不及汪伦送我情。友情珍贵啊!",
"default": "吾乃李白,今天诗兴大发,想听什么诗?"
}
},
{
"name": "ZhuBajie",
"type": "character",
"description": "猪八戒角色,幽默贪吃",
"costumes": ["zhubajie_normal", "zhubajie_speaking", "zhubajie_hungry"],
"personality": {
"style": "口语化,幽默",
"keywords": ["吃", "睡觉", "师父", "大师兄"],
"greeting": "嘿嘿,俺老猪来也!有什么好吃的吗?"
},
"responses": {
"吃": "嘿嘿,说到吃俺老猪就来劲了!有没有包子馒头?",
"睡觉": "睡个好觉真舒服!师父说我又偷懒了,嘿嘿。",
"师父": "师父真是的,老让俺老猪干活。大师兄呢?",
"default": "俺老猪饿了,有没有好吃的?"
}
},
{
"name": "TangMonk",
"type": "character",
"description": "唐僧角色,慈悲为怀",
"costumes": ["tangseng_normal", "tangseng_speaking", "tangseng_praying"],
"personality": {
"style": "温文尔雅,经常念经",
"keywords": ["佛", "徒弟", "经", "阿弥陀佛"],
"greeting": "阿弥陀佛,善哉善哉。贫僧唐三藏,有何指教?"
},
"responses": {
"佛": "阿弥陀佛。佛法无边,普度众生。善哉善哉。",
"徒弟": "为师有三个徒弟,虽然各有缺点,但都是好心肠。",
"经": "真经取来不易,我们要好好研读,弘扬佛法。",
"default": "阿弥陀佛,施主有何烦心事?"
}
},
{
"name": "ShaMonk",
"type": "character",
"description": "沙僧角色,忠厚老实",
"costumes": ["shaseng_normal", "shaseng_speaking", "shaseng_carrying"],
"personality": {
"style": "简洁朴实,忠诚可靠",
"keywords": ["行李", "大师兄", "二师兄", "干活"],
"greeting": "大师兄说得对。我来扛行李!"
},
"responses": {
"行李": "行李我来扛!大师兄打妖怪,二师兄吃东西,我干活。",
"大师兄": "大师兄孙悟空最厉害了!七十二变,火眼金睛!",
"二师兄": "二师兄猪八戒又偷懒了,师父让他去化缘。",
"default": "我在,我来扛行李。"
}
}
],
"backgrounds": [
{
"name": "MainBackground",
"description": "主界面背景",
"elements": ["title", "character_selector", "conversation_area", "control_buttons"]
}
]
},
"variables": {
"current_character": {
"type": "text",
"default": "libai",
"description": "当前选择的角色"
},
"conversation_state": {
"type": "text",
"default": "idle",
"description": "对话状态idle/recording/processing"
},
"recording_state": {
"type": "text",
"default": "stopped",
"description": "录音状态stopped/recording/processing"
},
"recognition_result": {
"type": "text",
"default": "",
"description": "语音识别结果"
},
"response_text": {
"type": "text",
"default": "",
"description": "生成的回复内容"
}
},
"lists": {
"conversation_history": {
"type": "text",
"description": "对话历史记录"
},
"character_names": {
"type": "text",
"items": ["libai", "zhubajie", "tangseng", "shaseng"],
"description": "角色标识列表"
},
"keywords": {
"type": "text",
"items": ["你好", "谢谢", "再见", "诗", "酒", "吃", "佛", "行李", "师父", "大师兄"],
"description": "关键词列表"
}
},
"broadcasts": {
"setup": "初始化系统",
"start_recording": "开始录音",
"stop_recording": "停止录音",
"change_character": "切换角色",
"show_response": "显示回复",
"clear_conversation": "清除对话",
"switch_to_libai": "切换到李白",
"switch_to_zhubajie": "切换到猪八戒",
"switch_to_tangseng": "切换到唐僧",
"switch_to_shaseng": "切换到沙僧"
},
"implementation_steps": [
{
"step": 1,
"title": "创建项目和角色",
"description": "创建新项目删除默认角色创建5个主要角色",
"tasks": [
"创建MainController控制角色",
"创建李白角色并添加3个造型",
"创建猪八戒角色并添加3个造型",
"创建唐僧角色并添加3个造型",
"创建沙僧角色并添加3个造型"
]
},
{
"step": 2,
"title": "设计背景和界面",
"description": "创建主背景添加UI元素",
"tasks": [
"设计主背景界面",
"添加标题和状态显示区域",
"创建角色选择按钮区域",
"设计对话显示区域"
]
},
{
"step": 3,
"title": "实现变量和列表",
"description": "创建所需的变量和列表",
"tasks": [
"创建5个主要变量",
"创建3个列表并初始化",
"设置变量初始值"
]
},
{
"step": 4,
"title": "实现核心功能",
"description": "实现语音识别和回复生成逻辑",
"tasks": [
"实现主控制器的初始化功能",
"实现语音识别功能",
"实现角色回复逻辑",
"实现角色切换功能"
]
},
{
"step": 5,
"title": "添加交互功能",
"description": "完善用户交互和界面反馈",
"tasks": [
"实现录音按钮功能",
"实现清除对话按钮",
"添加角色点击事件",
"实现对话历史显示"
]
},
{
"step": 6,
"title": "测试和优化",
"description": "测试所有功能并优化用户体验",
"tasks": [
"测试角色切换功能",
"测试语音识别和回复",
"测试对话历史功能",
"优化动画和过渡效果"
]
}
],
"tips": {
"development": [
"建议使用Scratch桌面版开发",
"确保设备有麦克风和扬声器",
"测试时先测试基本功能",
"逐步添加复杂功能"
],
"testing": [
"测试不同网络环境下的语音识别",
"测试角色切换的流畅性",
"验证关键词匹配的准确性",
"测试对话历史功能"
],
"optimization": [
"优化关键词匹配算法",
"添加更多角色回复内容",
"改进语音识别的错误处理",
"增加动画和音效"
]
},
"troubleshooting": {
"voice_recognition_not_working": [
"检查麦克风权限",
"确认网络连接正常",
"尝试重新启动Scratch",
"检查设备音频设置"
],
"character_switch_not_working": [
"检查广播消息拼写",
"确认角色变量设置正确",
"验证角色点击事件",
"检查角色造型存在"
],
"response_generation_slow": [
"简化关键词匹配逻辑",
"减少回复内容的长度",
"优化广播消息处理",
"检查变量和列表使用"
]
}
}

View File

@ -78,7 +78,7 @@ update_code() {
# 复制新代码到目标目录
log "复制新代码到 $LOCAL_VOICE_DIR..."
cp -r Local-Voice-extracted/* "$LOCAL_VOICE_DIR"/ || error_exit "复制代码失败"
cp -r Local-Voice-extracted/Local-Voice/* "$LOCAL_VOICE_DIR"/ || error_exit "复制代码失败"
# 恢复文件权限
log "恢复文件权限..."