You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio Media Stream:如何区分播放完成与被中断的Payload?

解决方案:精准区分播放状态与统计实际收听时长

针对你用Twilio双向WebSocket构建AI语音接口时遇到的中断后Mark事件混淆、收听时长无法精准统计的问题,可通过以下方案解决:

1. 给每个音频片段绑定唯一标识并关联Mark事件

  • 发送每个句子的Media Message时,在音频payload的元数据里嵌入唯一ID(比如UUID),同时将这个ID作为对应mark事件的name字段值。
  • 本地维护一个播放队列,记录每个待播放片段的ID、音频时长、发送时间、状态(待播放/播放中/已完成/已中断)。
  • 收到mark事件时,通过ID匹配队列片段:
    • 若对应片段状态是「播放中」,说明完整播放完成;
    • 若状态是「待播放」,则判定为未开始播放就被中断,直接标记为未收听;
    • 若已触发过clear事件,当前播放中片段状态已改为「已中断」,此时收到它的mark事件即可判定为中断后的冗余事件,直接忽略。

2. 用playbackStarted事件追踪实际播放起始时间

  • 启用Twilio的playbackStarted事件通知(在WebSocket连接配置中开启对应事件),该事件会携带当前开始播放的Media Message标识,你可以将其与自定义ID关联。
  • 收到playbackStarted事件后,更新对应片段的状态为「播放中」,同时记录事件触发的时间戳(这是Twilio端实际开始播放的时间,不受网络延迟影响)。
  • 当收到clear事件时,用clear事件的时间戳减去playbackStarted的时间戳,得到的就是用户实际收听该片段的时长,直接用于AI上下文更新。

3. 优化Clear事件的同步处理逻辑

  • 发送clear事件后,立即暂停向Twilio发送后续Media Message,直到收到Twilio返回的clearCompleted事件,确认播放队列已清空。
  • 在本地队列中,直接将所有「待播放」状态的片段标记为「未播放」,避免后续收到这些片段的mark事件时产生混淆。

4. 结合用户音频流事件做中断校验

  • 监听Twilio发送的用户音频media事件:一旦收到用户的音频数据,立刻触发本地中断逻辑,同步将当前播放中片段标记为「已中断」,和clear事件形成双重校验,确保状态更新的及时性。

内容的提问来源于stack exchange,提问作者Stoica Ovidiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:03