Skip to content

fix: 修复课堂 ASR 链路故障(降级链断裂 / Redis 未连接 / 音频静音无回退) - #5

Merged
Aparencia merged 4 commits into
mainfrom
dev
Jul 30, 2026
Merged

Aparencia merged 4 commits into
mainfrom
dev

Conversation

@Aparencia

Copy link
Copy Markdown
Owner

变更概述

修复课堂 ASR 链路的服务端与客户端故障,恢复语音转录可用性。

服务端(f7ddf96)

  • 修复降级链末端断裂:FallbackProvider.transcribe 缺少 **kwargs,call_with_fallback 透传的 _feature 撞到签名抛 TypeError,导致 ASR 请求返回 503 而非友好降级响应(已补 2 条回归测试,并用"移除修复→测试失败"验证有效性)
  • 修复 Redis 从未连接:get_cache() 以无参构造忽略 REDIS_URL,容器内恒连 localhost 失败;限流与响应缓存自部署起从未生效。main.py 原先无论成败都打印"连接已建立",掩盖了该故障
  • transcribe 限流路径由 /api/v1/ai/ 更正为 /api/v1/asr/;配额 30→600 并豁免全局每日总量(段级高频调用)
  • 开启 Qwen ASR 的 ITN;上游 429 不再误报为本地配额耗尽

客户端(dd996ba)

  • 新增 useAudioRecovery:窗口源在 Windows 上可能"成功但返回纯静音轨"(不抛错,异常降级永不触发),改为静音检测驱动自动回退系统环回 + 输出设备不匹配提示 + 设备变更自动重启
  • 修复仅音频模式误截图:此前仍启动截图采集且帧 watchdog 会保底重启,导致"帧"计数持续增长
  • VAD 在 loopback 源跳过无意义的背景噪声校准;静音断句 1500ms→800ms,新增 28s 强制分段兼容 GLM-ASR 段长上限
  • 网关健康探测 HEAD→GET,消除每次启动的 405 误报

验证

检查 结果
pytest 158/158
ruff 全绿
vitest 349/349
tsc(渲染端 + 主进程) 通过

部署影响

合并后触发 deploy-server(server/** 变更),服务端修复生效后才能验证 ASR 是否恢复。

FallbackProvider.transcribe 缺少 **kwargs,call_with_fallback 透传的
_feature 撞到签名抛 TypeError,导致降级链末端失败、ASR 请求返回 503
而非友好降级响应(已补两条回归测试锁定)。

get_cache 以无参构造 RedisCache,忽略 REDIS_URL 环境变量,容器部署下
恒连 localhost 失败,限流与响应缓存自部署起从未生效;main.py 原先无论
成败都打印'连接已建立'掩盖了该故障。

其余:transcribe 限流路径由 /api/v1/ai/ 更正为 /api/v1/asr/,配额
30->600 并豁免全局每日总量(段级高频调用);开启 Qwen ASR 的 ITN;
上游 429 不再误报为本地配额耗尽。
窗口源(方案A)在 Windows 上 getUserMedia 可能成功但返回纯静音轨,不抛错
故异常降级永不触发。新增 useAudioRecovery:静音检测驱动自动回退系统环回、
输出设备不匹配提示、设备变更自动重启捕获。

仅音频模式此前仍启动截图采集且帧 watchdog 会保底重启,导致'帧'计数持续
增长;现按 mode 跳过截图并清空重启回调。

其余:VAD 在 loopback 源跳过无意义的背景噪声校准(数字信号无底噪,不再
显示'正在校准音频阈值'),静音断句 1500ms->800ms 并新增 28s 强制分段以
兼容 GLM-ASR 段长上限;网关健康探测 HEAD->GET 消除 405 误报。
@Aparencia
Aparencia merged commit ffcd193 into main Jul 30, 2026
5 checks passed
@Aparencia

Copy link
Copy Markdown
Owner Author

🎉 This PR is included in version 0.26.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Aparencia added a commit that referenced this pull request Aug 4, 2026
- #5: Gemini generate_stream iteration moved into thread pool via
  asyncio.to_thread, unblocking the event loop during streaming
- #6: providers return real input/output token split; fallback cost
  tracking prefers it and falls back to 60/40 estimate instead of
  the misleading 50/50 split (output priced 2-3x higher)
- #7: balance queries use Key pool primary key (plural env vars),
  DeepSeek balance no longer silently skipped
- #8: JWKS fetch distinguishes network failures (stale cache reuse
  with 60s retry backoff) from HTTP/key errors (fail-closed),
  preventing whole-site 401 on transient Supabase hiccups
- #9: import_concept registered in TIMEOUT_CONFIG/RATE_LIMITS plus
  startup validation warning for unregistered features
- #10: error_pattern cache key includes user_id and hashes full
  content, preventing cross-user result reuse
Aparencia pushed a commit that referenced this pull request Aug 11, 2026
## [0.36.0](v0.35.2...v0.36.0) (2026-08-11)

### ✨ 新功能

* **3d:** Dashboard 深海世界新增 LeviathanShadow 远景巨影 ([8f86127](8f86127))
* **3d:** switch rendering backend from WebGL to WebGPU and restore Chronos 3D sphere ([1ec8b37](1ec8b37))
* **ai-gateway:** ASR 热词增强全链路透传 ([bf2c882](bf2c882))
* **ai:** AI hooks 流式化改造——苏格拉底追问/救援打字机渐进展示 ([5d2318c](5d2318c))
* **assistant:** F3 睡前复习气泡拉起 5 卡迷你复习 + T4 孵化呼吸引导 ([5004b44](5004b44))
* **assistant:** 水母受惊弹开+右键固定+用户活跃检测(10min空闲阈值) ([cf76a18](cf76a18))
* **beta:** 客户端付费体系——设备指纹/付费状态/AI 用量卡 ([3b4d6c3](3b4d6c3))
* **classroom:** 课堂模块增强——热词/转录编辑/章节导航/视觉模式 ([2f1a644](2f1a644))
* **dashboard:** D5 热力图效率维度 + R3 结束仪式 + R9 成就证书 ([e2e4b85](e2e4b85))
* **dashboard:** 主页三视图认知重构与双方案视觉系统 ([7d76b6e](7d76b6e))
* **dashboard:** 学习脉搏加入非番茄钟折算(笔记/复习/费曼)(内测反馈) ([af9a867](af9a867))
* **electron:** G7 全局快捷键框架 + E2 录音持久化 IPC 白名单 ([0ab8f2a](0ab8f2a))
* **feynman:** E2 录音关联持久化与跨会话回放(userData/recordings) ([76241a3](76241a3))
* **flashcards:** 批量管理(选择/重学/搁置/删除)+牌组重命名+会话上限可配置 ([1119e79](1119e79))
* **inbox:** 统一收件箱——剪贴板/灵感/导入三路合并 + 24h 去重 ([3c725ed](3c725ed))
* **innovation:** 创新功能目录四期实施 + 全量审查修复 ([7504119](7504119))
* **license:** AI 网关付费授权体系 ([9f7ed90](9f7ed90))
* **notes,flashcards,feynman:** 未接线组件全量接入 + DashboardPage 编译修复 ([4990849](4990849))
* **notes:** N5 闪卡只取核心层文本 + N2 合书测试答后 diff 高亮 ([7eff581](7eff581))
* **notes:** 搜索栏重构为笔记内筛选+批量删除+模板筛选+文件夹树删除 ([40d7366](40d7366))
* **notes:** 珊瑚礁视图与视口锚定——笔记深潜增强 ([2b82b5e](2b82b5e))
* **notes:** 笔记功能创新全面实施——7阶段25文件 ([d0e0776](d0e0776))
* **notes:** 笔记模块 P0-P2 改进 — 14 项功能实施 ([a081bf6](a081bf6))
* **notes:** 第一轮头脑风暴剩余5项构建完成 ([df90cf2](df90cf2))
* **notes:** 第一轮头脑风暴剩余创新点构建 ([9f6838b](9f6838b))
* **payment:** 临时收入方案全栈实现(数据库+UI+AI网关tier分级) ([acf72e3](acf72e3))
* **pomodoro:** Chronos 时间生物可视化(P0-P2) ([1d7ab71](1d7ab71))
* **pomodoro:** Chronos 液态金属形态与完整状态指示系统 ([dd34528](dd34528))
* **pomodoro:** Chronos 粒子球全面修复与 TimerFace 高频区重构 ([2f96df2](2f96df2))
* **pomodoro:** 修复计时状态机与数据一致性问题,接线体验增强功能 ([74f1893](74f1893))
* **pomodoro:** 深潜设置页下潜档案重构与番茄钟体验增强 ([317d84b](317d84b))
* **pomodoro:** 表盘与预设标签 UI 增强 ([3a91f24](3a91f24))
* **sop:** SOP 系统 MVP——四表落库/模板运行状态机/三页面/5 条 lint 规则 ([77064a4](77064a4))
* **ui:** 命令面板集成全局内容搜索(content类别)+Tag可交互+work-area属性 ([410d582](410d582))
* **ui:** 设置页升级引导 + 每日色相微调对抗感觉适应 ([400e650](400e650))
* **wiki:** 侧边栏独立折叠与自动保存状态提示 + 命令面板 SOP 入口 ([dd812b9](dd812b9))

### 🐛 缺陷修复

* **3d:** add forceWebGL=true to WebGPURenderer for async init compatibility ([5c3b01c](5c3b01c))
* **3d:** revert WebGPURenderer to THREE.WebGLRenderer for R3F compatibility ([0832b21](0832b21))
* **3d:** 主题切换/场景切换手动渲染修复(docked冻结)+routeToModuleId抽离 ([b6735e2](b6735e2))
* add cleanup to showTime timer effect to prevent stale timeout ([2a5cf31](2a5cf31))
* **ai-asr:** 重构 ASR 引擎为 zipformer-transducer 单引擎 ([3522567](3522567))
* **ai-gateway:** Python 3.12 部署启动修复(Any 导入 + BOM 清理 + F401) ([96ac0f5](96ac0f5))
* App启动初始化番茄钟+设置页返回按钮+API本地模式401不踢登录+批量选择hook ([9958306](9958306))
* **audit3:** resolve deferred findings X1-X6 ([9e625ca](9e625ca))
* **audit3:** resolve round-3 review findings on round-2 fixes ([beed8b4](beed8b4))
* **chronos:** eliminate per-frame THREE.Color allocation in useFrame ([6f2411b](6f2411b))
* **client:** resolve frontend medium-risk issues FRONT2-M1~M8 ([c00c087](c00c087))
* **client:** 同步引擎高危修复——resume死锁/冲突循环/localData空对象/synced类型不一致 ([7ef8ad8](7ef8ad8))
* **client:** 学习算法修复——FSRS初始稳定性对齐权重/sm2缺失字段防御/复习写失败可恢复 ([0d43362](0d43362))
* **client:** 客户端中危修复——IPC批处理返回值/流式超时与连接释放/代理路径校验/MCP最小环境/采集源校验/备份保护/watchdog上限 ([b572994](b572994))
* **client:** 客户端低危修复——文件读写限制/更新状态机/崩溃恢复/迁移可诊断/preload白名单统一 ([af1b353](af1b353))
* **client:** 客户端高危修复——采集stop挂起/迁移列错位/搜索全量返回/FTS阻塞/复习双击竞态 ([1feb466](1feb466))
* **electron:** resolve ELEC2-M1/L1/L2 ([064f636](064f636))
* **electron:** SSEServerTransport 类型注解修复 ([b999e05](b999e05))
* **gateway:** AI网关中低危修复——熔断器语义/探活超时/JWKS安全/Key冷却/重试策略/错误脱敏/Redis重连/限流原子化 ([d3be873](d3be873))
* **gateway:** AI网关高危修复——并发信号量/预算记账/流式限流/SSE资源释放/事件循环阻塞/请求体限制/降级链容错 ([8e78b6f](8e78b6f))
* **gateway:** JWT 算法自动适配消除 HS256/ES256 错位 401,学习计划认证就绪前不发请求 ([ed5c55a](ed5c55a))
* **gateway:** resolve high-risk issues [#1](https://github.com/Aparencia/Entropydecrease/issues/1)-[#4](https://github.com/Aparencia/Entropydecrease/issues/4) ([1aeeac5](1aeeac5))
* **gateway:** resolve low-risk issues [#11](https://github.com/Aparencia/Entropydecrease/issues/11)-[#14](https://github.com/Aparencia/Entropydecrease/issues/14) ([12a6e68](12a6e68))
* **gateway:** resolve medium-risk issues [#5](https://github.com/Aparencia/Entropydecrease/issues/5)-[#10](https://github.com/Aparencia/Entropydecrease/issues/10) ([f0b92a9](f0b92a9))
* **misc:** vite base 动态导入 504 / 流式路径正则 / mcpEnv 转义 / AuthGuard 依赖修正 ([7658c81](7658c81))
* **misc:** 杂项修复与文档更新 ([5e43dd8](5e43dd8))
* **notes:** 修复 EchoDiscovery 未使用导入并完成全量验证 ([c1d2a3d](c1d2a3d))
* **perf:** 性能模式变更即时生效,活跃采集优雅重启 ([71304db](71304db))
* **pomodoro:** Chronos 交互补齐与构建级类型修复 ([d8adfb5](d8adfb5))
* remove stale audioPrefs reference in PomodoroAudioLayer ([cad2ad4](cad2ad4))
* replace remaining audioPrefs references in PomodoroControls JSX ([62e8255](62e8255))
* restore skip on break click in ImmersiveTimer ([336ee8a](336ee8a))
* **sync:** OfflineQueue 版本排序改内存排序(Dexie Table 无 sortBy) ([60d72a3](60d72a3))
* **sync:** resolve low-risk logic issues SYNC2-L1~L5 ([b82668d](b82668d))
* **sync:** 同步服务修复——版本冲突判定/WS查询洪泛/Resolve安全/CRDT幂等/广播完整性 ([c7bdb7b](c7bdb7b))
* **tokens:** 材质类层叠顺序 - 深色段移至浅色段后,修复深色主题错误显示浅色材质 ([3bb49b9](3bb49b9))
* **website:** 下载页版本信息拉取超时与重试——消除源站挂起时的无限等待 ([7753dc7](7753dc7))

### ⚡ 性能优化

* **3d:** migrate 6 particle systems to GPU vertex shader and consolidate useFrame ([0e9dc4a](0e9dc4a))
* **client:** 性能优化第二批次——笔记投影/课堂内存/订阅治理/3D 算法优化 ([a734883](a734883))
* **ui:** split whole-store subscriptions and fix effect re-registration ([1f2308b](1f2308b))

### ♻️ 重构

* **chronos:** 粒子渲染 WebGL 单网格→Canvas 2D 伪 3D 重构 ([45e2752](45e2752))
* **dashboard:** Dashboard 重构——移除深海主题死代码 ([32f84b3](32f84b3))
* **pomodoro:** usePomodoroStore 拆分为 timer/settings/session/preset 四 slice ([a7d69de](a7d69de))
* 大规模死代码清理——移除未使用组件/钩子/工具 ([1432871](1432871))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant