外观
架构与核心流程
系统组成与边界
| 组件 | 责任 | 代码入口(相对源码根目录) |
|---|---|---|
| React SPA | 音频采集、字幕、控制、历史记录 | frontend/src/session/useSession.ts |
| api-server | WebSocket 接入、PBX 桥接、翻译编排 | internal/api-server/httpapi/ |
| PBX | WebRTC 音频接入及媒体处理 | internal/pbx/ |
| AI provider | 识别、翻译、配音等服务适配 | internal/ai/ |
| 注册与调度 | 节点发现及新会话节点选择 | internal/registry/registry.go、pkg/client/balancer.go |
| SQLite | 会话、字幕等持久化 | internal/store/sqlite/ |
核心请求流程
- 用户开始会话,前端建立 WebSocket,交换握手、SDP 和 ICE。
- 浏览器采集媒体,经 WebRTC 发送给选中的 PBX;音频不以字幕 WebSocket 为主要传输路径。
- PBX 执行切句、识别与快翻,api-server 转发事件并编排模型纠错。
- 前端按
utteranceId合并结果,区分识别终态、翻译草稿和纠错结果,更新字幕与画中画。 - 配音通过媒体链路下行;用户停止时,前端关闭连接、停止媒体轨道并撤销订阅。
数据模型与接口
- 前端协议入口:
frontend/src/types/protocol.ts;关注asr_result、translation_result、asr_final、tmt_final、llm_tmt_final,它们有兼容分支,不能只依据 README 推断全部运行协议。 - 字幕字段:
utteranceId、en/enFinal、zh/zhFinal、engine、revised、seq。seq按前端创建行时递增,不等同于服务端全局句序。 - 字幕索引和列表同步维护,并在超过保留上限时一起裁剪。
- 历史 API 与节点查询入口:
frontend/src/api/history.ts、frontend/src/api/system.ts。 - 异常边界:媒体授权失败、握手超时、连接关闭、模型失败、节点失效需分别验证;不能把“有处理代码”写成“所有异常验证通过”。
验证与证据
源码根目录:SimulSpeak1。上述路径均相对该目录。
- 现有测试:
frontend/src/state/subtitles.test.ts、frontend/src/rtc/RtcClient.test.ts、frontend/src/ws/WsClient.test.ts、frontend/src/pip/documentPiP.test.ts;本次未执行。 - 演示顺序:开始采集 → 草稿字幕 → 纠错字幕 → 画中画 → 停止并检查麦克风释放。
- 延迟待测:固定音频与网络,分别记录句尾到首译、纠错、首段配音的 P50 / P95,并区分 Mock 与真实云服务。