外观
面试追问
状态:未准备;以下为模板对应的答题提纲,完整口述参考现有面经。本人贡献需确认后再使用第一人称。
1. 为什么同时使用 WebRTC 和 WebSocket?
- 我的方案:WebRTC 承担媒体传输,WebSocket 承担信令、字幕和控制。
- 选择理由:音频与业务消息的职责和处理方式不同。
- 替代方案与适用边界:WebSocket 传音频更容易原型化,但要自行处理更多媒体时序问题;不声称它一定更慢。
- 实际结果与证据:浏览器两条连接和 PBX 日志待演示。
- 关联代码:
frontend/src/rtc/RtcClient.ts、internal/api-server/httpapi/pbx_bridge.go,相对源码根目录。 - 后续追问:ICE 失败如何定位?麦克风拒绝授权如何提示?
2. 字幕迟到和乱序怎么处理?
- 我的方案:以句子 ID 合并,结合 final 与引擎优先级阻止特定覆盖,限制保留行数。
- 选择理由:让同句草稿与纠错有稳定对应关系。
- 替代方案与适用边界:更强协议可引入服务端版本号;当前
seq是本地创建顺序,不保证任意网络乱序后的句序。 - 实际结果与证据:
frontend/src/state/subtitles.test.ts的覆盖场景需运行并展示。 - 关联代码:
frontend/src/state/subtitles.ts。 - 后续追问:重复 final 怎么办?LLM 先到、TMT 后到会怎样?数组和 Map 如何一起裁剪?
3. 停止采集为什么不能只关页面状态?
- 我的方案:会话层同时清理订阅、媒体连接、音频轨道、可视化资源。
- 选择理由:异步授权完成后仍可能继续创建资源,需要检查停止标记。
- 替代方案与适用边界:可以引入更明确的取消令牌,但需核对每个异步入口;现有实现不等于所有竞态均已验证。
- 实际结果与证据:在授权弹窗期间停止并观察浏览器麦克风占用,待验证。
- 关联代码:
frontend/src/session/useSession.ts、frontend/src/rtc/RtcClient.ts。 - 后续追问:React 卸载时怎样清理?画中画窗口关闭后如何卸载 root?
4. 为什么快翻后还要纠错?
- 我的方案:先返回快翻草稿,再用模型结合上下文修订,前端区分展示状态。
- 选择理由:分别满足尽早看到内容和改善术语表达的需求。
- 替代方案与适用边界:只用 LLM 流程更简单;两阶段会增加成本、修订频率和状态管理复杂度。
- 实际结果与证据:固定语料对比首译和终译延迟、术语表现,数据待测。
- 关联代码:
internal/api-server/httpapi/interpreter.go。 - 后续追问:LLM 超时如何降级?后一句先完成时配音怎么办?