先定义系统真正处理哪些模态
端到端 Speech-to-Speech 以较少中间边界换取低延迟和自然韵律;STT→LLM→TTS 级联允许替换、审计和缓存各段,但增加延迟、转写误差传播和状态协调。选择前写清文本、音频、图像的输入/输出组合、何时切换,以及哪些 Tool 只接受结构化确认。
协议记录采样率、编码、声道、帧时长、图像尺寸、MIME、时间戳、媒体 ID 与生命周期。转写是辅助 Artifact,不必等于模型真正接收或内部表征的音频;用户纠正转写也不自动改写已经发生的听觉决策,应显式触发重新理解。
传输选择决定延迟、控制权和信任边界
架构评审同时画媒体面、控制面和高权限 Tool 面。媒体可以直达模型以降低延迟,但身份、业务授权和敏感动作仍由应用服务掌握。选择不能只比较握手与吞吐,还要检查凭据暴露、企业代理、录音、地域和恢复能力。
浏览器直连 WebRTC
适合低延迟双向音频,浏览器使用应用后端签发的短期客户端凭据建立会话。不要向浏览器下发长期 Provider Key;DataChannel 可承载事件,但高权限 Tool 仍调用应用后端并重新授权。WebRTC 内建媒体抖动与拥塞处理,但业务 Run 恢复仍需自行设计。
服务端 WebSocket
适合自定义音频管线、集中策略、录音或多个 Provider 路由。服务端自行处理编码、双向背压、播放序列与断线,链路增加一跳;若 WebSocket 只传 JSON base64 音频,还会增加编码开销。媒体和控制消息要分优先级,取消不能排在大音频队列后。
SIP/电话接入
电话引入运营商、号码归属、来电身份、录音同意、DTMF、转接与地区合规。Call 的 ringing/connected/ended 与 Agent Run 的 listening/tool-waiting/completed 是两套状态;挂断要取消后续音频和不必要 Tool,但已提交业务动作仍需对账。
实时会话是一组可关联的事件和媒体状态
Session 配置、Conversation Item、Response、Input Audio Buffer、转写和 Tool Call 都有稳定 ID 与因果关系。配置更新记录版本与生效边界,例如下一 Response 或下一 Item,避免在途音频被新旧 VAD、声音或 Tool 集合混合解释。
传输重连、会话恢复和创建新会话必须区分。断线后若 Provider 不支持恢复,应用创建新实时会话,并用安全摘要、已确认事实和业务 Run ID 重建 Context;不能把旧音频全部重放导致重复理解或再次触发 Tool。
轮次与打断是实时 Agent 的核心状态机
轮次检测
Server VAD 根据语音活动与静音阈值结束轮次,延迟低但易受噪声和长停顿影响;Semantic VAD 结合语义判断是否说完,可能更自然但等待更久;Push-to-Talk 把控制交给用户,适合噪声、高风险或无障碍场景。OpenAI Realtime 当前 API Reference对 server_vad 和 semantic_vad 分别暴露配置,具体字段应按目标版本核验。
用户打断
检测到用户开口后,停止浏览器未播放音频、取消对应 Response,并上报实际已播放到的位置。服务端截断旧 Assistant Item,使后续 Context 不包含用户从未听到的内容。若旧回复已触发 Tool,取消生成不等于撤销副作用,需要按 Tool 状态处理。
双工状态
listening、thinking、speaking和 tool-waiting可组合,不能压成一个 Loading。全双工允许用户边听边说,但回声消除、抢话和 Tool 结果播报更复杂;默认可从半双工或自动打断开始,以任务成功与打断数据决定是否放开。
端到端延迟需要逐段预算
分别记录采集缓冲、编码、上行网络、模型首事件、首音频、下行、Jitter Buffer 和实际播放,不用一个“响应时间”掩盖瓶颈。Chunk 越小通常越快产生首包,但协议开销和调度频率增加;Chunk 越大吞吐更好,却增加等待和打断损失。
播放队列设置最大可缓冲时长,控制消息和取消优先于音频。浏览器主线程繁忙时 AudioWorklet 与渲染隔离,队列超限则丢弃已取消 Response 的音频,而不是任意丢当前语音。弱网按策略降低音频质量、暂停图像、切到文本或明确结束;无边界自动重连可能重复回复。
Tool 与 Handoff 不能破坏对话实时性
明确 Tool 在浏览器、Agent 服务还是业务后端执行。浏览器仅处理低权限设备交互;业务写入在服务端。长 Tool 调用给出可打断的非欺骗反馈,例如“正在查询订单,仍可取消”,并用状态事件更新,不用生成填充语音假装有进展。
敏感动作暂停自动说话,展示或朗读关键参数,并要求结构化审批与幂等保护。Handoff 传递用户身份、会话目标、已确认事实、未决 Tool 和媒体偏好;不盲目复制全部录音。人工接管时明确告知角色变化、录音状态和 Agent 是否仍在监听。
多模态扩大输入面、设备权限和隐私风险
图像中的文字、屏幕内容、环境语音和附件均可能承载间接 Prompt Injection。模型提取的信息先作为不可信数据,不能覆盖系统策略或直接授权 Tool;高风险实体通过独立 UI 回显与用户确认。
麦克风、摄像头、屏幕、录音和转写分别请求目的明确、可撤销的权限。媒体进入 Provider、Trace、评测集和存储前做分类与最小化,记录保留和删除策略。客户端短期凭据还要绑定会话与 Origin;Provider 会话能力不等于业务 Tool 权限。
实时体验必须允许用户确认系统状态并随时退出
界面明确显示正在监听、处理、说话、调用 Tool 或等待审批,并始终提供静音、停止、设备切换和文字模式。字幕与文本记录可编辑纠正,但保留原识别、修正者和生效范围,避免审计事实被静默改写。
键盘可完成 Push-to-Talk、打断和退出;不以声音作为唯一状态通道。设备权限失败、听障、口音、噪声或公共场所都能切换文本。拟人化声音不能模糊不确定性、录音事实或责任边界。
评测完整对话任务,而不只测转写准确率
延迟指标覆盖首响应、轮次结束判断、打断生效和任务完成;交互指标覆盖抢话、沉默、重复回复、打断成功、用户纠错与降级成功;行动指标覆盖 Tool 参数、审批、幂等、权限违规和业务后置条件。转写错误率只是其中一个诊断维度。
| 条件 | 关键风险 | 验收证据 |
|---|---|---|
| 长停顿/口音/噪声 | 抢话或长沉默 | 轮次、VAD 与纠错 Trace |
| 说话中途打断 | 旧音频继续、Context 含未听内容 | 播放位置、取消与截断事件 |
| 弱网/切设备 | 重复回复、队列堆积 | 背压、降级与恢复记录 |
| 图像/语音注入 | 越权 Tool 或泄露 | 策略拒绝、审批与负向测试 |
| 超长会话 | 成本、记忆漂移、资源泄漏 | 单位会话成本、Context 与内存曲线 |
评测按设备、网络、语言/口音、噪声和任务风险分层,报告分位数而非只报均值。上线门禁比较文字或 Push-to-Talk 基线;实时体验若不能在关键任务上提高成功或可访问性,就应保留更简单模式。
主动提取:用户打断后为什么还要上报“实际播放位置”?
架构判断:浏览器直连模型后,业务 Tool 能否也在浏览器执行?
资料与事实边界
以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。
- OpenAI API Reference:Realtime — Session、Conversation Item、Response、音频 Buffer 与 VAD 事件的当前官方接口
- OpenAI Realtime Guide:WebRTC — 浏览器 WebRTC 与短期客户端凭据的官方架构
- OpenAI Realtime Guide:WebSocket — 服务端 WebSocket 连接与事件处理
- W3C WebRTC 1.0 — 浏览器实时媒体连接标准
- W3C Media Capture and Streams — 摄像头、麦克风、设备与权限的标准基础