Files
English/Doc/TECHNICAL-ARCHITECTURE.md

160 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技术架构:Flutter 手机优先、支持 Mac 的个人学习工具
> 当前目标:iPhone、Android 手机与 Mac;个人自用;无需发布、登录或自建服务器。
> 原则:手机优先、本地优先;每台设备都可以独立完成全部学习功能。
本文技术方向不代表已验证实现。M1 的范围、内容结构、证据实体及异常行为以 [开发与验收约定](M1-IMPLEMENTATION-CONTRACT.md) 为准;课程总量不限,阶段核心清单固定版本。
## 1. 推荐技术路线
使用 **Flutter / Dart** 构建 iPhone、Android 与 macOS 客户端,共享课程、学习引擎和对话状态代码;布局以手机为第一优先级,Mac 只是更宽的阅读和练习界面。
| 层级 | 方案 | 用途 |
|---|---|---|
| 客户端 | Flutter / Dart | iPhone、Android 优先界面,macOS 适配 |
| 状态管理 | Riverpod 或同类单向状态方案 | 课程步骤、录音状态、对话状态、复习队列 |
| 本地数据 | SQLite(Drift) | 证据、掌握、复习、会话、评估、进度和临时词条分表保存;旧版完整快照只作迁移/恢复回退,正常写入不再生成快照 |
| 课程内容 | 内置 JSON | A0 课程、场景、词句、词条释义、练习规则 |
| 录音与播放 | Flutter 跨平台音频插件 + 原生适配 | 录音、回放、慢速播放、音频缓存 |
| AI 对话 | 云端模型 API 或本地模型 | 受控情境对话、纠错、每日变式 |
| 语音转写 | 云端转写或各平台原生语音能力 | 将用户英语录音变成可确认文字 |
| 英文朗读 | 跨平台 TTS 或云端语音合成 | 播放 AI 的英语回复和标准示范音 |
| 密钥保存 | 平台安全存储 | iOS Keychain、Android Keystore、macOS Keychain |
## 2. 手机优先原则
- 单手操作:录音、重说、提示等核心按钮位于手机屏幕下方。
- 一屏一个任务:课程和对话不要求用户滚动查找下一步。
- 断网可继续内置课程、本地判题、学习记录、已有音频和模板复习;AI 动态生成、在线对话/反馈及云端语音需网络。原生 STT/TTS 离线可用性须逐设备探测;缺音频的听力题与开放答案反馈留待补做。
- 声音可选:公共场合可切换为文字输入与静音阅读,不应阻止完成练习。
- Mac 复用:Mac 端展示同一课程和本机进度,可更适合阅读、输入和查看历史,不重新设计一套学习流程。
## 3. 是否需要后台
不需要自行部署远程后台。
```text
iPhone / Android / Mac App
├─ 本地课程 JSON
├─ 本地学习数据库
├─ 本地录音与音频缓存
└─ 通过可切换的 AI 提供商调用对话 / 转写 / 语音服务
```
### 3.1 跨设备同步
M1 不做自动跨设备同步。每台设备保存自己的学习记录,但都内置相同课程并可独立使用。
如需在手机开始后在 Mac 继续,可在后续版本增加“加密导出/导入学习进度”。导出的内容包括:
- 当前课程和步骤;
- 词句掌握状态与复习到期时间;
- 对话文字摘要、错误项与重说句;
- 偏好设置;
- 不包含原始录音。
原始录音默认只保留在产生它的设备,以节省空间并减少隐私暴露。若以后必须自动同步,可选择用户自有的云盘同步或小型后台代理;这不属于 M1。
### 3.2 AI 提供商配置与网络请求
个人自用时,模型服务密钥或兼容代理 Token 可分别保存在 iPhone、Android 和 Mac 的安全存储中,由客户端直接调用选定的 AI 服务。不要把密钥写进课程 JSON、源代码或可分享的配置文件。
这只适用于你自己的设备和开发构建。若未来发布给他人使用,必须改为通过后台代理请求,以保护密钥、控制成本和处理滥用。
客户端只依赖统一的 `AIProvider` 接口,而不将课程逻辑写死到单一服务商:
```text
AIProvider
├─ GeminiProvider
├─ OpenAIProvider
└─ OpenAICompatibleProvider
```
每个提供商配置包含:提供商类型、模型名、接口地址、Token 和能力开关(文字对话、转写、语音)。设置页只显示当前选中的提供商;切换提供商不影响本地课程、掌握状态和复习队列。
### 3.3 OpenAI 兼容反代(CLIProxyAPI
CLIProxyAPI 可作为 `OpenAICompatibleProvider` 的可选接口地址,用于文字情境对话、课程变式、纠错与结构化返回。它不是 M1 的唯一依赖;不可用时可切换到 Gemini API 或 OpenAI API。
使用前必须满足:
- 手机和 Mac 都能访问该地址。手机中的 `localhost` 指向手机本身,不能访问 Mac 上运行的反代;需使用可访问的局域网地址或有效 HTTPS 地址。
- 反代须通过 App 的地址/鉴权、选定模型短文本及结构化返回测试;流式可选,可用非流式降级。测试成功仅证明当前文字能力,不证明语音或全部兼容能力。
- 反代 Token 仅保存在平台安全存储;不得使用网页 Cookie、账号密码或 OAuth 会话作为 App 凭据。
- 如果反代基于消费者订阅的登录态或令牌,使用前须自行确认授权方式与相关服务条款。
反代先只承担文字 AI。转写优先设备原生能力,朗读优先设备 TTS;设备权限、英语语言包与实际可用性验证通过后才能运行对应语音流程。文字降级允许继续学习,但不能代替口语/听力达标。
## 4. M1 数据模型
下图仅为概览。实现必须补充 StageDefinition、AbilityNode、Task/Asset、AttemptEvidence、StudySession、StageAssessment 与 ProviderConfiguration,字段和事务约束见《开发与验收约定》第 3 节。掌握度应能从有版本的分技能证据重算,AI 不直接写入升级状态。
```text
Course
└─ Lesson
├─ vocabulary / patterns
├─ listening / reading / writing tasks
└─ dialogue scenario and completion rules
LexiconEntry
├─ word or phrase, contextual Chinese meaning and example
├─ audio reference and approval/source status
└─ related ability / vocabulary / pattern IDs
LearnerProfile
├─ current level and current lesson
├─ daily study duration
└─ preferences (voice, subtitles, speed)
MasteryItem
├─ word or sentence pattern
├─ state: new / recognize / recall / use / master
├─ success and failure history
└─ next review date
SavedWord
├─ lexicon entry and saved time
└─ optional low-priority review state
ConversationSession
├─ scenario, turns and task progress
├─ transcript summary
├─ one improvement sentence
└─ review item
```
## 5. M1 的 AI 提供商与模型组合
ChatGPT 与 Gemini 的消费者订阅可用于手动编写课程、检查内容和测试提示词,但不能直接作为 Flutter App 的自动调用额度。App 需要配置各自的开发者 API Key;订阅与 API 计费/额度分开处理。
文字 AIProvider、SpeechRecognizer、SpeechSynthesizer 分别抽象;选择文字代理不意味着其也支持语音。M1 手动选择一个文字提供商,不同时调用多家或自动切换付费服务。下表为候选配置,模型名、额度及价格未在本次文档修订中联网验证,使用时以账号实际能力和连接测试为准,不把免费额度作为运行保证。
| 能力 | M1 默认方案 | 可切换方案 | 说明 |
|---|---|---|---|
| 情境对话、课程变式、纠错、结构化 JSON | Gemini API 免费层(先用于个人原型) | OpenAI API 的 GPT-5 mini | 两者均须各自 API Key;先用已有 Google 账号可访问的免费额度验证流程,额度或质量不够时切换 OpenAI |
| 兼容反代文字对话 | 不默认启用 | CLIProxyAPI 的 OpenAI 兼容地址 | 在设置中手动填写 Base URL、Token 和模型名;只在接口能力与授权边界明确时启用 |
| 英语语音转写 | 设备原生语音识别 | OpenAI API 的 GPT-4o mini Transcribe | 先避免增加 API 成本;低可信度时必须允许确认、修改或重说 |
| 英文朗读 | 设备 TTS | 云端语音合成 | M1 优先本机朗读,减少成本并支持基础离线使用 |
| 实时全双工语音 | 暂不使用 | 后续单独评估 | 当前采用 3–5 轮的轮流对话,实时打断不是 M1 需求 |
每次 AI 对话都应传入当前等级、场景、允许词句、用户已回答内容和任务完成条件;不要用模型决定课程顺序。模型用量主要来自对话和反馈,因此应限制为 3–5 轮短对话,并缓存已生成的课程音频和练习变式。
官方参考:[OpenAI API Key 快速开始](https://developers.openai.com/api/docs/quickstart)、[GPT-5 mini](https://developers.openai.com/api/docs/models/gpt-5-mini)、[OpenAI API 定价](https://developers.openai.com/api/docs/pricing)、[Gemini API Key](https://ai.google.dev/gemini-api/docs/api-key)、[Gemini API 计费](https://ai.google.dev/gemini-api/docs/billing)。
## 6. M1 实现顺序
1. 完成一课听说读写、本地证据与恢复流程。
2. 加入文字 AI 对话、结构校验、反馈与本地降级。
3. 加入 TTS、录音、语音转写与确认;分别记录听说读写证据。
4. 完成每日推荐、复习、变式生成、A0 出口评估与全部种子内容审校。
5. 完成 iPhone、Android 真机及 macOS 同流程验证,覆盖《开发与验收约定》的异常测试。加密导出/导入留到 M2。
## 7. 当前不做
- 自建后端、账号、公开用户数据库;
- Web、多人共享、社交匹配与自动跨设备同步;
- 支付、订阅、通知、运营分析;
- 云端长期保存原始录音;
- 实时全双工电话式 AI 通话。
- 加密导出/导入、个性化音素诊断;前者留到 M2,后者须另行验证。