实时多模态交互
知识库简介
实时语音 Agent 不是把 ASR、LLM 和 TTS 串起来就结束。它是一套持续接收媒体、解释轮次、允许用户打断、调用工具并在网络波动后恢复的事件系统。真正的工程边界是:
媒体帧与播放缓冲
↕
会话事件:turn / response / interruption / tool / timeout
↕
权威状态与副作用账本本课程比较级联 ASR → LLM/runtime → TTS 与直接 speech-to-speech,随后建立供应商无关的媒体面、控制面和状态面合同。重点不在某个产品的参数,而在怎样证明“旧输出确实停止”“工具结果对应正确调用”“断线没有重复副作用”和“端到端任务真的完成”。
动态事实边界
W3C/IETF 规范、论文及产品文档复核日期为 2026-07-22。W3C WebRTC Recommendation 包含标记的候选修订;Media Capture and Streams 仍是 Candidate Recommendation Draft。当前 OpenAI 文档把 voice agent、实时翻译和实时转写分成不同会话用途;Google Live 的转写与 server content 又可独立到达、没有彼此的顺序保证。这些是产品接口观察,不是本课程的稳定事件语义:必须通过适配层映射到自己的事件合同、重新核对目标版本并做集成实测。AG-UI 若在生态中出现,只视为 Agent—前端事件协议观察项,不作为本课程稳定依赖。
在总路线中的位置
建议先完成:
- 多模态 AI:媒体输入合同、时空证据和多层评测;
- 语音识别 与 语音合成:输入、输出通道的质量边界;
- Agent 核心:模型决策与确定性 runtime、状态、终止和恢复;
- Tool Calling:schema、call ID、授权、幂等与结果验证。
本课程把这些能力组成可打断的实时会话。完成后可继续研究多语言实时翻译、视频/屏幕共同输入、电话网关、具身交互或全双工模型,但应先保住事件合同与应用状态。
学习目标
- 比较级联与 speech-to-speech 架构,而不把“全双工”误当成某一种模型结构。
- 分清媒体传输、会话控制和应用权威状态,按场景选择 WebRTC、WebSocket 或 SIP 边界。
- 设计带 ID、序号、时间、关联和终态的严格事件合同。
- 把 ASR 的 partial/final/revision、应用的
turn.commit与实际扬声器播放确认分开建模。 - 区分 VAD、endpointing、语义轮次与用户主动打断。
- 在 barge-in 时停止旧生成、清空旧播放,并单独核对已经发起的工具副作用。
- 分解首包与端到端延迟,为缓冲、jitter 和背压设置有界策略。
- 用 checkpoint、resume token、幂等与 reconciliation 恢复长会话。
- 联合评测轮次行为、任务结果、工具、恢复、安全、成本与延迟。
前置知识
- 能读写 Python、JSON,理解 event ID、序号、timeout、deadline 与 hash。
- 理解音频帧、采样率、VAD、partial/final transcript 和流式播放。
- 理解工具调用的 schema、权限、审批、idempotency key 和 receipt。
- 不要求先掌握 WebRTC 实现细节或任何实时模型 SDK。
三个必须分开的平面
| 平面 | 典型对象 | 失败时不能假设 |
|---|---|---|
| 媒体面 | audio/video frame、codec、jitter buffer、playout | 连接存在就代表播放最新内容 |
| 控制面 | transcript revision、turn、response、interrupt、playout、tool call、timeout | 收到取消或文本 final 就代表已停止播放/已获授权 |
| 状态面 | event log、checkpoint、approval、receipt、terminal outcome | 供应商 session 就是业务事实源 |
传输重连、会话恢复和业务副作用核对是三个不同动作。任何设计若把它们合成一个“reconnected=true”,都不足以证明正确恢复。
推荐学习顺序
| 顺序 | 课程 | 关键问题 | 完成证据 |
|---|---|---|---|
| 1 | 架构与端到端合同 | 级联还是 speech-to-speech? | 架构 ADR 与最小合同 |
| 2 | 会话、事件与传输边界 | WebRTC、WebSocket、SIP 各负责什么? | 三平面事件表 |
| 3 | VAD、轮次与用户打断 | 怎样停止旧输出而不误回滚工具? | barge-in 时序与竞态测试 |
| 4 | 低延迟、背压与抖动 | 快、稳、完整怎样取舍? | 分段延迟预算与网络切片 |
| 5 | 工具调用与对话状态 | partial、turn、response、call 怎样关联? | 权威账本与副作用协议 |
| 6 | 断线恢复、超时与终态 | 重连后从哪一步继续? | checkpoint/reconcile 状态机 |
| 7 | 隐私、安全与信任边界 | 连续麦克风和不可信语音如何受控? | 威胁模型与审批边界 |
| 8 | 端到端评测与离线项目 | 怎样用 trial 证明系统可用? | 33 个离线合同测试 |
动手实践入口
项目仅使用 Python 3 标准库,不采集/生成音频、不联网、不调用模型、不执行真实工具:
Set-Location ".\docs\实时多模态交互"
$env:PYTHONDONTWRITEBYTECODE = "1"
python -B .\examples\realtime_session.py .\examples\session_fixture.json --pretty
python -B -W error .\examples\test_realtime_session.py
python -B -O -W error .\examples\test_realtime_session.py夹具覆盖音频帧与 turn、精确重复事件、打断旧输出、工具关联、断线 checkpoint/resume 和正常终态。测试另外覆盖错误序号、静音提交、未知/多余字段、错误关联、恢复 token、超时、输出队列上限、旧输出拒绝以及终态后的非法事件。
掌握标准
- 能为一个真实场景解释级联与 speech-to-speech 的可观测性、延迟和可替换性取舍。
- 能说明 SIP 是会话信令边界,不等于音频媒体本身。
- 能让
event_id、turn_id、response_id、call_id各自只有一个职责。 - 能解释 VAD 检出声音为何不等于判断用户说完。
- 能证明 barge-in 后旧播放缓冲被清空,旧 response 不会复活。
- 能在中断时把“工具未执行、已执行、结果未知”分开处理。
- 能报告 p50/p95/p99 分段延迟、打断质量和任务结果,而不是只有平均首包时间。
- 能从 checkpoint 恢复应用状态,并核对传输、会话与副作用三层。
- 能运行并解释 33 个标准库测试及模拟器没有证明的真实系统性质。
主要参考资料
| 主题 | 一手来源与状态 |
|---|---|
| 浏览器实时媒体 | W3C WebRTC Recommendation(页面含标记的候选修订;核验于 2026-07-22) |
| 媒体采集、track、权限与指示 | W3C Media Capture and Streams(Candidate Recommendation Draft,2025-10-09;核验于 2026-07-22) |
| WebSocket | IETF RFC 6455 |
| SIP 信令 | IETF RFC 3261 |
| 实时轮次评测 | Lin 等,Full-Duplex-Bench(ASRU 2025,arXiv v3) |
| 工具与非流利语音评测 | Lin 等,Full-Duplex-Bench v3(2026 work in progress,前沿观察) |
| 动态产品样例 | OpenAI Realtime and audio、Google Live API reference、session management 与 capabilities(均核验于 2026-07-22) |
课程边界
本课程不教授声学模型训练、电话运营商配置、具体厂商 SDK 参数或地区法律结论。真实上线还需:
- 在目标设备、网络、语言、口音和噪声下重跑评测;
- 核对供应商当前数据使用、留存、地区、模型和连接限制;
- 让法务/安全负责人判断录音通知、同意、未成年人、声纹与跨境数据要求;
- 用真实媒体栈验证 echo cancellation、codec、jitter、NAT 与电话网关行为。