feat(v2.2): 剧情纯语音演绎 + 单端口 8080 托管前端

- StoryPlayer 移除文字展示区,改为纯语音逐句推进(角色+表情+跳过)
- 每句 speak 追加估时兜底(onEnd 缺失时按文本长度放行,不卡死)
- SceneTheater 开场按文本估时自动进入(兜底 15s → max(4000, len*320+2000))
- main.go SetServerRoot 托管 ui-src/dist(AddStaticPath("/") 前缀守卫只服务根路径),
  /static 前缀挂载 ui-src/static 素材目录,前后端同端口 8080

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 09:06:19 +08:00
co-authored by Claude Opus 4.7
parent 8c19e826b3
commit a775fc7b5c
7 changed files with 214 additions and 50 deletions
@@ -124,6 +124,27 @@
---
## v2.2 修订(2026-08-13):纯语音演绎 + 单端口托管
> 用户走查反馈(v2.1 落地后):① **「必须点跳过按钮才显示出选项」**——StoryPlayer 自然播完不触发 donespeak onEnd 在部分浏览器环境不回调,逐句推进只能靠 20s forceNext 兜底,体验像卡死);② **「剧情也不应该显示文字,直接语音播放就可以了不需要文字展示区」**;③ **「前端应该跟后端共用端口」**(后端 :8080,前端产物由后端托管)。
### 核心转变
| 维度 | v2.1 | v2.2 |
|---|---|---|
| 剧情呈现 | 气泡文字 + 逐字高亮 + 拼音 | 纯语音演绎:无文字展示区,角色立绘 + mood 表情 + 逐句朗读 |
| 句推进 | speak onEnd + 逐字高亮双门控 | speak onEnd 驱动 + **文本长度估时兜底**320ms/字 + 1.2s,最短 2.5s);20s forceNext 保留为最后防线 |
| 部署 | H5 dev server 5173(开发代理) | 前端产物 `ui-src/dist` 由后端 :8080 `AddStaticPath` 托管(生产单端口) |
### 验收标准(v2.2
1. 剧情无任何文字展示:只有角色 + 表情徽章 + 语音
2. 台词播完后选项自动出现(无需点跳过);跳过按钮仅作可选的手动加速
3. speak onEnd 不回调的环境(模拟浏览器静音策略/无语音)下按估时兜底自动推进,不卡死
4. `http://localhost:8080` 直接打开应用(前后端同端口)
---
## 设计总览
每关 = 一部 2-3 分钟儿童小剧场,三幕结构: