使用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
相关产品推荐
相关产品推荐

