Commit Graph
21 Commits
Author SHA1 Message Date
shenleiandClaude Opus 5 be70ad2a29 refactor: 将课程各步骤拆分到 features/lesson/steps/
lesson_flow.dart 保留流程状态、公共脚手架与小组件,预习/听/说/读/写/独立表达
六个步骤各自成为 part 文件。代码仅搬移并经 dart format 格式化,无用户可见变化。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:23:26 +09:00
shenleiandClaude Opus 5 8302977351 refactor: 按领域将 AppState 拆分为 mixin
- app_state.dart 只保留持久化字段(_AppStateData)、加载/存档、设置项和清空进度
- app_state_review.dart:复习队列与掌握度
- app_state_lesson.dart:课程解锁、分段与课内步骤流程
- app_state_assessment.dart:阶段测评
- app_state_ai_content.dart:临时释义、句子分析缓存与补练课
- 后台同步调用统一为 _syncInBackground()

纯搬移,方法体未改,无用户可见变化。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:22:19 +09:00
shenleiandClaude Opus 5 4142af09e1 refactor: 抽出语音作答与录音回听的公共逻辑
对话页、AI 补练页、课程跟读步骤、独立表达步骤和评估页各自复制了一套
"录音 → AI 转写 → 填入答案"的流程,其中 3 页还复制了"录音回听/播放/删除"
的按钮和方法。现在统一到 lib/widgets/voice_answer.dart:
- VoiceAnswerMixin:startVoiceInput / finishVoiceInput / toggleRecording /
  playRecording / deleteRecording / disposeVoiceAnswer,状态字段名沿用各页原名,
  页面的 build 代码基本不动;
- RecordingControls:录音回听按钮行。

用户可见的变化:
- "未识别到语音"提示统一为「未识别到清晰语音,请再试一次或直接输入文字。」
  (对话页、补练页、独立表达步骤、评估页原本各有不同说法;跟读步骤保留
  原来提示"播放示范音"的文案)。麦克风不可用、开始录音的提示保持各页原样。
- 对话页的录音回听按钮与播放按钮之间增加 8px 间距,与其他页面一致。
- 删除录音时先停止正在播放的录音(原来只有跟读步骤这样做)。
- 离开页面时,如果还在录音或设备识别中,会先停止;不保留录音时一并删除
  这段录音文件。原来课程两个步骤离开时不停止录音,各页离开时也不停止
  "录音回听"的录音。

flutter analyze 无问题,flutter test 142 个测试通过;现有测试未覆盖麦克风流程。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:18:45 +09:00
shenleiandClaude Opus 5 f1a5bb8999 refactor: 合并 AiService 各文本接口重复的请求流程
8 个文本接口原本各自重复一套:取 API Key、校验模型与地址、按服务商拼请求头和请求体、
超时、判断 2xx、提取回复内容。现在统一到 _requestContent / _requestPrompt,
底层发送逻辑为 _postJson,请求体由 _buildTextPayload 构造(testConnection 和
transcribeAudio 也改用它们)。各接口只保留提示词和结果解析。

纯重构,不改变行为。已用临时测试录下 3 种服务商、4 种响应(成功、500、401、
网络异常)以及配置无效时的全部请求:共 134 个请求的地址、请求头、请求体和
所有返回值,重构前后逐字节一致。ai_service.dart 从 1291 行减为 1051 行。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:14:32 +09:00
shenleiandClaude Opus 5 5faeda5e2d refactor: 将 AppState 本地存档序列化拆分到 app_state_snapshot.dart
纯代码搬移,不改行为:_restore、快照 JSON 构建及相关解析函数移入 part 文件。
已用覆盖全部存档字段的快照比对验证,重构前后写出的存档逐字节一致。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:07:23 +09:00
shenleiandClaude Opus 5 8ed52312fb fix: 登录同步后首页恢复课程位置与复习卡片
- 拉取合并时还原当前课程与分段位置,位置只前进不后退,跳过其他设备已完成的课
- 由云端掌握项重建复习卡片,并纠正旧客户端写坏的首次复习到期时间
- 同 checkpoint 时以证据更多的一方为准;推送缺卡片项时不再用当前时间作到期时间
- 登录/注册及合并逻辑升级后强制全量拉取一次

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:05:15 +09:00
shenleiandClaude Opus 5 6710a80fa5 chore: 联网测试端点变量接受完整地址
应用里配置的地址本身就带 /v1/responses,直接当基址拼接会变成
.../v1/responses/v1/responses。改用 KOUYU_AI_ENDPOINT,填完整端点或
基址都可以,内部归一化后再拼出待测的两个端点,并补一条不联网的归一化测试。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 16:42:58 +09:00
shenleiandClaude Opus 5 d04a4903e8 chore: 联网测试密钥改从环境变量读取
live_endpoint_test.dart 里硬编码了一个真实 API key。改为读取
KOUYU_AI_API_KEY(可选 KOUYU_AI_BASE_URL、KOUYU_AI_MODEL),未设置时
整组测试跳过,不再把缺少凭据的联网测试当成通过。

注意:旧 key 仍留在提交历史中,需要在服务端作废并重新签发。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 16:40:54 +09:00
shenleiandClaude Opus 5 61abc69037 feat: 重做阅读找答案题与 AI 情境对话,并归拢本地识别、查词等既有改动
阅读"在对话里找到答案":
- 16 道题全部重写,干扰项真实出现在对话里,靠说话人归属或否定句才能作答
- 选项按题目内容确定性打乱,答案不再固定排第一;听力环节同样处理
- 去掉超纲干扰项、重复题干,收紧自由作答匹配(过去单个字母也能判对)

AI 情境对话:
- 提示词区分"AI 这一句要做什么"与"学习者随后要完成什么",并下发已教词句清单
- JSON 只强制 reply,translation/feedback 可选;不再索要用不上的 slots/evidence
- AI 不可用时页面明确提示当前回复来自内置示范脚本
- 删掉按 stage 下标猜中文翻译的兜底,避免译文与英文对不上
- 整课对话改用逐轮必需表达校验,替换"关键词沾边就算过";修正自由场景正则误伤
- 总结的"完成任务"按实际通过的轮次生成;模型点评只在结束页呈现一次
- 自由场景支持草稿续练(独立存储槽);修正回答轮数文案与永不解锁的场景标注

同时提交此前工作区中累积的改动:SenseVoice 本地识别、查词/句型解析卡、
复习与测评页调整等,并补充对话校验、选项分布和句子解析的测试。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 16:38:23 +09:00
shenlei 0c16394b5a feat: install_app.sh 脚本支持打包安装 macOS 桌面版 2026-09-16 10:36:57 +09:00
shenandshen eda5dfce62 feat: 完善芽说英语品牌Logo与图标配置,完成跨平台云端同步服务开发与自动化部署 2026-09-16 09:15:53 +08:00
shenandshen 293b838341 feat: save repeat audio on mic record and rename button to play repeat 2026-09-15 22:52:49 +08:00
shenandshen 042e867521 feat: upgrade local speech recognition engine to SenseVoice-Small with hardware audio enhancements 2026-09-15 22:36:10 +08:00
shenandshen be5075fa3d feat: integrate Sherpa-ONNX local offline speech recognition engine 2026-09-15 22:22:32 +08:00
shenandshen db7ec7404f feat: set default reasoning effort to low for all AI requests 2026-09-15 22:06:52 +08:00
shenandshen 503f1d8d1d feat: add AI voice transcription fallback for domestic Android ROMs 2026-09-15 22:02:26 +08:00
shenandshen c8964b9b60 config: 将默认AI配置端点切换为 /v1/responses 2026-09-15 21:33:18 +08:00
shenandshen 24930ca9ec fix: 支持明文网络请求,增强安装脚本自动卸载冲突签名,优化设置页AI配置响应 2026-09-15 21:30:56 +08:00
shenandshen 524788291b feat: 原生支持 /v1/responses 接口与 Chat Completions 双协议自适应,增加端到端联调测试 2026-09-15 20:44:27 +08:00
shenlei a717365c10 feat: 增加AI配置文件与TTS自动朗读,修复二级页面返回按钮与音频播放 2026-09-15 19:11:39 +09:00
shenandshen 37c86f7ecb feat: complete kouyu_english app codebase, A0 specifications and .gitignore 2026-09-15 15:58:33 +08:00