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

使用Twilio Programmable Voice外呼时采集语音转写的问题求助

解决Twilio外呼语音采集与转写问题

问题分析

你当前的代码存在两个核心问题:

  • 外呼的TwiML配置虽包含<Gather>,但后端处理action回调的代码没有正确接收并解析Twilio传递的语音转写结果,只是生成了空的<Gather>标签,自然不会输出有效内容。
  • 没有正确配置<Gather>的语音转写相关参数,确保Twilio能准确采集并返回转写数据。

完整实现步骤

1. 外呼发起代码优化

调整TwiML的<Gather>配置,明确指定语音模型、语言,提升转写准确率与灵活性:

client.calls
  .create({
    twiml: `
      <Response>
        <Gather 
          input="speech" 
          action="https://ngrok-url-for-my-local-server/voice" 
          method="POST" 
          speechTimeout="auto"
          speechModel="phone_call"
          language="zh-CN"
        >
          <Say language="zh-CN">你好,请问你最近过得怎么样?</Say>
        </Gather>
        <!-- 用户未说话时的兜底逻辑 -->
        <Say>没有收到你的语音,通话即将结束。</Say>
      </Response>
    `,
    to: toPhoneNumber,
    from: myPhoneNumber,
  })
  .then((call) => {
    console.log(`呼叫SID: ${call.sid}`)
  })
  .catch((e) => {
    console.error(`呼叫失败: ${e.message}`)
  })
  • speechTimeout="auto":让Twilio自动检测用户停止说话的节点,比固定时长更适配实际场景。
  • speechModel="phone_call":针对电话通话场景优化的语音模型,提升转写准确率。
  • language:明确指定语音语言,避免转写偏差。

2. 后端回调处理代码

后端的/voice端点需要接收Twilio的POST请求,提取SpeechResult(转写后的文本)与SpeechConfidence(转写置信度)参数,而非生成空的<Gather>:

const express = require('express');
const twiml = require('twilio').twiml;
const app = express();

// 解析Twilio的POST请求体
app.use(express.urlencoded({ extended: false }));

app.post('/voice', (req, res) => {
  // 从请求体中提取转写结果
  const speechResult = req.body.SpeechResult;
  const confidence = req.body.SpeechConfidence;

  // 输出有效内容到控制台
  if (speechResult) {
    console.log(`用户语音转写结果: ${speechResult}`);
    console.log(`转写置信度: ${confidence}`);
  } else {
    console.log('未采集到有效语音');
  }

  // 生成结束通话的TwiML响应
  const voiceResponse = new twiml.VoiceResponse();
  voiceResponse.say(`我听到你说:${speechResult || '没有内容'},通话结束。`);
  voiceResponse.hangup();

  res.type('text/xml');
  res.send(voiceResponse.toString());
});

app.listen(3000, () => {
  console.log('服务器运行在端口3000');
});
  • 必须通过express.urlencoded解析请求体,才能正确获取Twilio传递的参数。
  • 处理完成后需返回TwiML指令,告知Twilio后续操作(如挂断通话)。

3. 关键注意事项

  • 确保ngrok公网URL可正常映射到本地服务器,Twilio需能访问到你的/voice端点。
  • 检查Twilio控制台的语音设置,确认语音转写功能处于启用状态(默认启用)。
  • 若需长时间采集语音,可替换为<Record>标签,<Gather>更适合短语音交互场景。

内容的提问来源于stack exchange,提问作者ashutosh sHisodia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:10:33