用 Claude Code 复盘老项目 之 腾讯开心鼠 口语秀

之前在在腾讯时期做的一个了老项目,最近用 Claude Code 根据我之前写的代码,生成一个项目文档。
腾讯放弃启蒙教育业务,官宣开心鼠英语停止售卖_ABCmouse
项目负责人:ezli(lijianfei)
项目概述
SpeakShow 是一个基于 iOS 的口语学习应用模块,主要功能是为用户提供口语练习、录制、评分和视频合成的学习体验。该项目采用状态机管理模式,通过多个状态节点控制整个学习流程。
- 目标用户:儿童/小朋友
- 核心功能
- 左侧播放教师示范视频,右侧实时显示孩子摄像头画面。
- 系统依次播报英文单词,让孩子跟读并即时评分(对/错)。
- 根据评分给出正向或负向反馈,鼓励多读几遍。
- 游戏共三轮,完成后将所有录制片段与原示范视频合成一段完整的视频供分享。
- 技术挑战
- 多状态管理和流程分支的复杂性。
- 视频录制、编辑与最终合成的实现。
项目结构
SpeakShow/
├── ABCSpeakShowJSMessageForwarder.h/m # JS消息转发器
├── ABCSpeakShowPreviewVC.h/m # 预览视图控制器
├── ABCSpeakShowRecordVideoVC.h/m # 录制视频视图控制器
├── Model/ # 数据模型层
│ ├── ABCOralShowNetModel.h/m # 网络数据模型
│ ├── ABCSpeakShowUserModel.h/m # 用户数据模型
│ ├── ABCSpeakShowVideoComposeManager.h/m # 视频合成管理器
│ └── AVAsset+WSChecker.h/m # 视频资产检查工具
└── View/ # 视图层
├── ABCCompositeLoadingView.h/m # 合成加载视图
├── ABCFadeInAnimate.h/m # 淡入动画
├── ABCIsBackTipsView.h/m # 返回提示视图
├── ABCNotReachableTipsView.h/m # 网络不可达提示视图
└── WSCameraMetalView.h/m # 相机Metal渲染视图
核心组件
1. 视图控制器 (View Controllers)
ABCSpeakShowRecordVideoVC
- 职责: 主要录制界面,管理整个口语学习流程
- 关键功能:
- 状态机管理
- 相机录制
- 音频录制
- 贴纸动画效果
- 口语评分
ABCSpeakShowPreviewVC
- 职责: 视频预览和编辑界面
- 关键功能:
- 视频播放
- 视频合成
- 上传管理
- 用户交互
2. 数据模型 (Data Models)
ABCOralShowNetModel
- 职责: 网络数据模型,处理服务器返回的数据
- 主要结构:
- Payload: 包含游戏结果ID和引擎信息
- EngineInfo: 包含活动信息和内容信息
- ContentInfo: 包含卡片信息、视频信息、音频资源
ABCSpeakShowUserModel
- 职责: 用户数据模型,管理用户学习数据
- 主要结构:
- ABCSpeakShowComposeGeneralModel: 通用合成模型
- ABCSpeakShowComposeModel: 具体合成模型
ABCSpeakShowVideoComposeManager
- 职责: 视频合成管理器,单例模式
- 主要功能:
- 后台视频合成
- 视频上传
- 缓存管理
3. 视图组件 (View Components)
WSCameraMetalView
- 职责: 相机专用渲染视图
- 特点: 使用Metal进行高性能渲染
ABCCompositeLoadingView
- 职责: 视频合成加载提示视图
- 功能: 显示合成进度和状态
状态机设计
状态定义
// 初始化状态
STATUS_INIT = @"STATUS_INIT"
// 欢迎状态
STATUS_WELCOME = @"STATUS_WELCOME"
// 提问题状态
STATUS_ASK = @"STATUS_ASK"
// 教学状态
STATUS_TEACH = @"STATUS_TEACH"
// 引导状态
STATUS_GUIDE = @"STATUS_GUIDE"
// 跟读录制且打分状态
STATUS_FOLLOW_RECORD_SCORE = @"STATUS_FOLLOW_RECORD_SCORE"
// 正反馈状态
STATUS_FEEDBACK_GOOD = @"STATUS_FEEDBACK_GOOD"
// 负反馈状态
STATUS_FEEDBACK_BAD = @"STATUS_FEEDBACK_BAD"
// 结束语状态
STATUS_END = @"STATUS_END"
// 预览视频状态
STATUS_PREVIEW_OUTPUT_VIDEO = @"STATUS_PREVIEW_OUTPUT_VIDEO"
// 应用中断状态
STATUS_APP_RESIGN_ACTIVE = @"STATUS_APP_RESIGN_ACTIVE"
// 应用恢复状态
STATUS_APP_BECOME_ACTIVE = @"STATUS_APP_BECOME_ACTIVE"
项目流程图
graph TD
A[开始] --> B[STATUS_INIT]
B --> C[STATUS_WELCOME]
C --> D[STATUS_ASK]
D --> E[STATUS_TEACH]
E --> F[STATUS_GUIDE]
F --> G[STATUS_FOLLOW_RECORD_SCORE]
G --> H{评分结果}
H -->|良好| I[STATUS_FEEDBACK_GOOD]
H -->|较差| J[STATUS_FEEDBACK_BAD]
I --> K[STATUS_END]
J --> F
K --> L[STATUS_PREVIEW_OUTPUT_VIDEO]
L --> M[结束]
N[应用中断] --> O[STATUS_APP_RESIGN_ACTIVE]
O --> P[STATUS_APP_BECOME_ACTIVE]
P --> Q{恢复前状态}
Q -->|各状态| R[继续学习流程]
泳道图 - 角色职责分工
graph LR
subgraph 用户
A[用户操作] --> B[点击开始学习]
B --> C[跟读录制]
C --> D[查看反馈]
D --> E[预览成果]
end
subgraph 视图控制器
F[ABCSpeakShowRecordVideoVC] --> G[管理状态机]
G --> H[处理用户交互]
H --> I[控制相机录制]
I --> J[显示动画效果]
end
subgraph 数据模型
K[ABCSpeakShowUserModel] --> L[存储用户数据]
L --> M[管理合成参数]
M --> N[处理评分结果]
end
subgraph 视频管理
O[VideoComposeManager] --> P[合成视频]
P --> Q[上传服务器]
Q --> R[缓存管理]
end
A --> F
F --> K
K --> O
J --> D
N --> E
关键状态转换
1. 正常学习流程
INIT → WELCOME → ASK → TEACH → GUIDE → FOLLOW_RECORD_SCORE → FEEDBACK_GOOD/FEEDBACK_BAD → END → PREVIEW_OUTPUT_VIDEO
2. 负反馈重试流程
FOLLOW_RECORD_SCORE → FEEDBACK_BAD → GUIDE (重新开始当前卡片)
3. 应用中断处理
任意状态 → APP_RESIGN_ACTIVE → APP_BECOME_ACTIVE → 恢复到原状态
数据流转图
graph TD
A[服务器数据] --> B[ABCOralShowNetModel]
B --> C[ABCSpeakShowUserModel]
C --> D[ABCSpeakShowRecordVideoVC]
D --> E[录制视频/音频]
E --> F[口语评分]
F --> G[ABCSpeakShowComposeModel]
G --> H[VideoComposeManager]
H --> I[视频合成]
I --> J[上传服务器]
J --> K[缓存结果]
技术特点
1. 状态机管理
- 使用TransitionKit框架管理复杂状态
- 支持状态转换时的回调处理
- 处理应用中断和恢复
2. 视频处理
- 使用TAVKit进行视频录制和合成
- 支持Metal渲染,提高性能
- 后台合成,不阻塞主线程
3. 音频处理
- 集成口语评分功能
- 支持多种音效播放
- 音频会话管理
4. 网络处理
- 网络状态监控
- 离线提示和重试机制
- 数据上传和下载管理
核心算法
1. 口语评分算法
- 实时音频录制
- 语音识别和评分
- 根据分数给出正负反馈
2. 视频合成算法
- 多段视频拼接
- 音频合成
- 特效添加
- 格式转换
3. 缓存管理算法
- 视频缓存策略
- 内存管理优化
- 磁盘空间管理
项目优势
- 架构清晰: MVC架构,职责分明
- 状态管理: 使用状态机,逻辑清晰
- 性能优化: Metal渲染,后台合成
- 用户体验: 丰富的动画效果和交互
- 稳定性: 完善的错误处理和中断恢复
可改进点
- 代码重构: 部分方法过长,可以进一步拆分
- 测试覆盖: 增加单元测试和UI测试
- 文档完善: 添加更多注释和文档
- 性能监控: 添加性能监控和优化
- 模块化: 进一步解耦,提高可维护性
总结
SpeakShow项目是一个功能完整的口语学习应用模块,通过状态机管理复杂的学习流程,结合视频录制、音频处理、口语评分等技术,为用户提供沉浸式的学习体验。项目架构清晰,技术选型合理,具有良好的扩展性和维护性。
整体下来,我认为 Claude Code 还是把整个项目说清楚了,因为这个项目的复杂点在于有限状态机的设计,我特意让 Cladue Code 生成了 流程图和泳道图,方便理解。
补充视频
只补充了一个结尾,之前完整的视频弄丢了。