当动作链路不可用时,纯音频降级应继续播放已经批准的回复,并让用户的任务继续进行。它不是隐藏在底层的异常,而是一个明确的产品状态:告诉用户发生了什么,保留暂停、停止和文字选项,并在恢复视觉前确认不会重复播放重要内容。
关键结论
- 把纯音频视为正式状态,而不是临时补丁。
- 保留对话上下文、控制权和可访问性。
- 只恢复视觉,不重新执行工具或重新播放关键回答。
- 记录进入降级、恢复和最终结果。
1. 用状态机定义行为
最小状态可以包括:Connecting、Visual、Audio-only、Recovering、Ended。每次转换都应有明确触发条件和允许操作。Stately 的状态机说明可以帮助团队避免用多个布尔值拼出矛盾状态。
例如,动作连接失败后,产品进入 Audio-only,但对话轮次和已批准音频保持不变。用户仍能停止播放、查看文字或退出。恢复时只重新建立动作和渲染,不应再次调用工具,也不应再次提交购买、发送消息或更新记录。
2. 让用户知道发生了什么
提示应简短、具体,例如:“Visual animation is unavailable. Audio will continue.” 不要把底层错误码直接显示给用户,也不要假装一切正常。状态变化可以通过 ARIA live region通知辅助技术,但应避免反复播报。
播放控制仍要可用。网页端可以根据 HTMLMediaElement状态展示暂停、继续和静音。纯音频模式还应提供文字通道,以符合团队的可访问性要求;WCAG可作为评审基线。
3. 按风险决定恢复方式
低风险说明或帮助内容可以在动作连接恢复后直接返回 Visual。涉及支付、权限、提交表单或外部工具时,应先检查当前轮次是否已经完成,再询问用户是否继续。HTTP 幂等语义解释了为什么重复操作在不同请求类型下风险不同。
页面进入后台也可能暂停渲染。使用 Page Visibility API区分“用户切换标签页”和“动作服务故障”,否则正常节能行为可能被误记为异常。
4. 监控产品结果而不只监控连接
记录降级原因、发生阶段、持续时间、是否恢复、用户是否继续任务、是否转为文字,以及最终是否完成功能目标。用 OpenTelemetry把同一轮次的音频、动作和产品事件串联起来。
WebSocket 关闭时应保留 CloseEvent信息,但分析中要区分正常退出、网络中断和服务端拒绝。不要把所有关闭都计为“Avatar 失败”。
5. 对 Spatius Direct Mode 的处理
当前 Spatius Direct Mode 文档说明:AvatarKit 在客户端连接 Motion Server,发送 Avatar 语音音频、接收动作并本地渲染;若 WebSocket 在 15 秒内连接失败,SDK 会进入纯音频降级,音频继续但不显示动画。
产品仍需决定提示文案、控件、文字替代、重试时机和业务操作的重复保护。可以结合断网恢复指南和等待、错误与人工接管设计完成端到端方案。