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

Twilio呼叫自动断开求助:基于Lambda的TwiML语音交互问题

解决Twilio呼叫在Lambda2响应后自动断开的问题

我来帮你排查这个问题!核心原因是你的第二个Lambda返回的TwiML执行完<say>指令后没有后续逻辑,Twilio会默认结束呼叫。另外代码里还有几个小问题需要先修正,下面一步步来:

首先修正代码里的基础错误

  1. 拼写错误:Lambda2里的textReponse应该是VoiceResponse,这是Twilio TwiML的核心类,拼写错了会导致生成无效的TwiML。
  2. 依赖缺失:确保你已经引入了querystring模块,不然解析event.body会报错。
  3. 响应格式:要确保返回的响应头包含Content-Type: application/xml,Twilio才能正确解析TwiML。

核心解决方案:让Twilio有持续执行的指令

要让呼叫持续到用户主动挂断,你需要在Lambda2返回的TwiML中添加不会自动终止的逻辑,以下两种常用方案:

方案1:说完问候后继续收集用户输入

如果需要用户继续交互,在<say>之后添加<gather>指令,让Twilio继续等待用户的语音输入,这样呼叫就不会断开。修正后的Lambda2代码:

// 确保引入必要的模块
const { VoiceResponse } = require('twilio').twiml;
const querystring = require('querystring');

module.exports.submit = (event, context, callback) => {
  const twiml = new VoiceResponse();
  // 解析请求体里的语音结果
  const body = querystring.parse(event.body);
  console.log('收到的语音结果:', body.SpeechResult);

  // 先回复问候
  twiml.say(`Hello, Kshitiz how may i help you`);
  
  // 添加gather继续收集用户后续的语音输入,指向当前Lambda或者其他处理函数
  const gather = twiml.gather({
    input: 'speech',
    finishOnKey: '',
    action: '你的Lambda2的URL' // 可以继续指向自己,或者新的处理函数
  });
  
  // 如果用户没有输入,这里可以添加默认提示(可选)
  twiml.say('没有收到你的输入,请继续说话。');

  // 返回正确格式的响应
  callback(null, {
    statusCode: 200,
    headers: { 'Content-Type': 'application/xml' },
    body: twiml.toString()
  });
};

方案2:创建单用户会议保持通话

如果不需要用户继续交互,只是想保持通话直到用户主动挂断,可以用<Conference>创建一个单用户会议(会议会在所有参与者离开后才结束),代码示例:

const { VoiceResponse } = require('twilio').twiml;
const querystring = require('querystring');

module.exports.submit = (event, context, callback) => {
  const twiml = new VoiceResponse();
  const body = querystring.parse(event.body);
  console.log('收到的语音结果:', body.SpeechResult);

  twiml.say(`Hello, Kshitiz how may i help you`);
  
  // 创建一个单用户会议,设置结束静音和等待静音,保持通话
  const conference = twiml.conference({
    endConferenceOnExit: true, // 用户挂断后结束会议
    waitUrl: 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient' // 可选:等待音乐
  });
  conference.value('My Conference');

  callback(null, {
    statusCode: 200,
    headers: { 'Content-Type': 'application/xml' },
    body: twiml.toString()
  });
};

额外检查点

  • 确认你的Lambda函数返回的HTTP响应状态码是200,并且Content-Type设置为application/xml,Twilio对响应格式要求很严格。
  • 检查Twilio控制台的调试日志(在"Monitor" -> "Logs"里),看看有没有返回错误的TwiML或者HTTP响应错误,这能帮你快速定位问题。

内容的提问来源于stack exchange,提问作者Kshitiz Jaiswal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:43