Skip to content

同步、背压、延迟与质量评估 ​

网络接收速度和播放速度不同,若无限缓存,用户会听到几秒前的回应;若随意丢包,音频会破碎。队列上限和丢弃/暂停策略属于产品协议,需要区分实时帧、关键帧和不可丢工具结果。

下面演示视频预览的“只保留最新帧”,不适用于需要完整取证的录像,也不能直接用于压缩视频码流。

python
from collections import deque
queue = deque(maxlen=2)
for timestamp in [0,33,66,99]:
    queue.append({'pts':timestamp,'frame':f'f{timestamp}'})
assert [x['pts'] for x in queue] == [66,99]
latest = queue.pop()
queue.clear()
assert latest['pts'] == 99
print(latest)

maxlen将旧帧自动移出,适用于已解码、可独立展示的帧;若问题要求“刚才发生了什么”,另有受控历史缓冲或录制链,不能只留下最新帧。音频通常按采样连续性播放,严重积压时取消整轮或调整发送速率比随机丢一段更可理解。

音画同步以时间戳对齐,用抖动缓冲吸收短期到达差异;缓冲越大抗抖动越好,但交互延迟越高。WebRTC适合浏览器实时媒体并有传输机制,WebSocket适合显式事件协议;选择取决于平台支持、网络与媒体管理,不是“哪个名字更先进”。长效服务密钥留在服务端,浏览器凭短效受限凭据建立会话。

把延迟拆开测 ​

从用户开始说话到停止、端点检测、上传完成、模型首音频、开始播放,分别打单调时钟时间。单次网络往返不等于端到端响应;模型先生成大量音频但播放器没开始,用户仍感到慢。统计首音频延迟、打断后旧音频尾长、掉帧/欠载、重连恢复、任务完成率以及成本。

转录质量可用WER/CER,但专有名词和关键数字错误需要单列;视觉问题检查定位、描述事实与不确定性;语音回复检查可懂度、内容正确和打断自然性。多模态答案的证据要落到具体帧/时间段,不能仅引用整个视频。

从离线ASR+LLM+TTS迁到原生实时模型时保留旧路径作为可比基线,记录同一音频在噪声、口音与中断场景下的结果。这里事件实验未验证麦克风、回声消除、网络、真实VAD或付费实时API,这些需要对应设备和会话证据。

练习 ​

为到达乱序的三个已解码帧选择媒体时间最大的帧,不以最后到达者为最新;输入为空返回None。

完成后查看本章答案。

返回完整学习路线。

用心记录每一步成长