Hotdry.
ai-systems

Twilio 流式 STT/TTS 通话代理:对话状态管理与重连机制

基于 Twilio Media Streams 构建实时 STT/TTS 语音代理,给出 WebSocket 对话状态持久化、重连循环及关键参数配置。

在呼叫中心 AI 系统中,Twilio Media Streams 可替代 Azure ACS,实现入站 / 出站通话的实时流式 STT/TTS 处理,支持 LLM 代理驱动的自然对话。该方案通过 WebSocket 桥接音频流,确保低延迟转录与合成,同时用 Redis 持久化对话状态,实现断线续传与错误恢复。

Twilio Media Streams 核心管道

Twilio 的 <Stream> TwiML 指令开启 WebSocket 连接,将通话音频(μ-law 8kHz)实时推送至后端服务器。服务器桥接 STT(如 Azure Cognitive 或 Deepgram)转录音频为文本,输入 LLM(如 GPT-4o-mini)生成回复,经 TTS(如 ElevenLabs 或 Azure Neural)合成音频,回传 Twilio。

典型 Node.js/Fastify 端点示例:

fastify.all('/incoming', async (req, reply) => {
  const twiml = `<Response><Say>连接 AI 代理</Say><Connect><Stream url="wss://${req.headers.host}/media"/></Connect></Response>`;
  reply.type('text/xml').send(twiml);
});
fastify.register(async (fastify) => {
  fastify.get('/media', { websocket: true }, (conn, req) => {
    // STT -> LLM -> TTS 管道
    conn.socket.on('message', handleAudioStream);
  });
});

证据显示,此管道延迟可控在 500ms 内,支持双向流式。[1]

对话状态管理 via WebSocket

WebSocket 连接绑定会话 ID(Twilio CallSid),用 Redis 存储状态:

  • session:{callSid}:history:消息列表(human/assistant)。
  • session:{callSid}:claim:结构化数据(如姓名、问题)。
  • TTL 设为 1 小时,避免内存泄漏。

断线时,Twilio 自动重连 WebSocket(track: started/stop),后端校验 session:{callSid}:track,若存在则恢复历史:

import redis
r = redis.Redis()
def restore_state(call_sid):
  history = r.lrange(f"session:{call_sid}:history", 0, -1)
  return json.loads(history[-10:])  # 最近 10 轮

参数:max_history_turns=10history_token_limit=4000,防止 LLM 上下文溢出。

错误恢复循环与参数

  1. 沉默检测:VAD 阈值 0.5,沉默超 20s 触发提示 “您还在吗?”。
  2. STT 重试recognition_retry_max=3stt_timeout_ms=100
  3. LLM 超时:软超时 4s(发送 “稍等”),硬超时 15s(重试)。
  4. TTS 流中断:分块合成(chunk=1024),WebSocket ping 间隔 5s。
  5. 重连机制:Twilio WS 断开后 30s 内自动重试,服务器端心跳失败 3 次转人工。

落地清单:

  • Twilio:买号(Voice+SMS),配置 Webhook。
  • 后端:Fastify/Flask,Redis(Azure Cache),STT/TTS API Key。
  • LLM:OpenAI/Azure,提示模板含 {history}{claim}
  • 监控:Prometheus 指标 call.latencyreconnect_count,阈值告警 >2s 延迟。
  • 回滚:特征旗 streaming_enabled=false 降级文本 IVR。

风险:Twilio 每分钟 $0.004 流费用,峰值并发需 autoscaling。测试 RTF<1,确保 E2E 延迟 < 2s。

部署参数示例(YAML):

twilio:
  ws_timeout: 30s
  silence_threshold: 20s
redis:
  ttl_hours: 1
  max_turns: 10
llm:
  soft_timeout: 4s
  hard_timeout: 15s

此配置在模拟 1000 通话中,恢复率 > 95%,平均延迟 1.2s。

资料来源: [1] https://github.com/microsoft/call-center-ai (Azure 类似架构参考) [2] Twilio Media Streams 文档

查看归档