跳到正文

架构与核心流程 ​

系统组成与边界 ​

组件责任代码入口(相对源码根目录)
React SPA音频采集、字幕、控制、历史记录frontend/src/session/useSession.ts
api-serverWebSocket 接入、PBX 桥接、翻译编排internal/api-server/httpapi/
PBXWebRTC 音频接入及媒体处理internal/pbx/
AI provider识别、翻译、配音等服务适配internal/ai/
注册与调度节点发现及新会话节点选择internal/registry/registry.go、pkg/client/balancer.go
SQLite会话、字幕等持久化internal/store/sqlite/

核心请求流程 ​

  1. 用户开始会话,前端建立 WebSocket,交换握手、SDP 和 ICE。
  2. 浏览器采集媒体,经 WebRTC 发送给选中的 PBX;音频不以字幕 WebSocket 为主要传输路径。
  3. PBX 执行切句、识别与快翻,api-server 转发事件并编排模型纠错。
  4. 前端按 utteranceId 合并结果,区分识别终态、翻译草稿和纠错结果,更新字幕与画中画。
  5. 配音通过媒体链路下行;用户停止时,前端关闭连接、停止媒体轨道并撤销订阅。

数据模型与接口 ​

  • 前端协议入口: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 与真实云服务。

理解机制,讲清取舍,用复盘检验掌握。