使用无代码构建器快速部署 AI 语音代理
Source: Dev.to
TL;DR
大多数语音代理需要数周才能部署,因为团队对每个集成都进行硬编码。本指南展示了如何使用无代码自动化在 4 小时 内交付生产级语音代理。
你将构建的内容: 一个能够处理来电、触发 Zapier 工作流(CRM 更新、通知)并将通话路由到 Twilio 的语音代理——零后端代码。
技术栈: Retell AI(语音逻辑) + Zapier(工作流胶水) + Twilio(通话路由)
成果: 实时代理在 4 小时 内上线,处理真实来电并同步 CRM。
前置条件
API 访问与认证
- Retell AI API 密钥(dashboard.retellai.com),并确保有可用额度
- Twilio 账户 SID + Auth Token(console.twilio.com)
- Zapier 高级账户(需要 webhook 触发器和多步骤 Zap)
- 已购买用于语音的 Twilio 电话号码(最低 $1 / 月)
技术要求
- Node.js 18+(用于本地 webhook 测试,配合 ngrok)
- ngrok 或类似的隧道工具(免费套餐足够)
- 基础的 REST API 与 JSON 负载概念
- 熟悉 webhook(请求/响应)工作原理
系统搭建
- 用于 webhook 处理的公网 HTTPS 端点(ngrok 可提供)
- 环境变量管理(使用
.env文件,切勿硬编码密钥) - Postman 或 curl 用于 API 测试(可选但推荐)
成本提示
- Retell AI:约 $0.02 / 分钟(语音合成)
- Twilio:$0.0085 / 分钟(入站通话)
- Zapier:Zap 运行次数计入月度任务上限
Twilio Voice API: Get Twilio
配置与搭建
Retell AI 需要具备特定作用域的 API 密钥——助理的读写权限以及电话发起权限。在 Retell 仪表盘的 API Settings 中生成密钥,并将其存入环境变量。
// server.js – Express webhook handler with signature validation
const express = require('express');
const crypto = require('crypto');
const fetch = require('node-fetch'); // or native fetch in Node 18+
const app = express();
app.use(express.json());
app.post('/webhook/retell', async (req, res) => {
const signature = req.headers['x-retell-signature'];
const secret = process.env.RETELL_WEBHOOK_SECRET;
// Validate webhook signature
const hash = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(req.body))
.digest('hex');
if (hash !== signature) {
return res.status(401).json({ error: 'Invalid signature' });
}
// Process webhook event
const { event_type, call_id, transcript, call_duration_ms } = req.body;
if (event_type === 'call_ended') {
// Trigger Zapier webhook asynchronously
await fetch(process.env.ZAPIER_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
call_id,
transcript,
duration: call_duration_ms,
timestamp: new Date().toISOString(),
}),
});
}
// Return immediately to avoid Zapier timeout
res.status(200).json({ received: true });
});
app.listen(3000, () => console.log('Webhook server listening on port 3000'));
为何重要: Zapier 的超时时间为 30 秒。立即返回 200 OK,随后异步处理,以避免 CRM 重复写入。
架构与流程
- Retell AI – 处理语音交互并发送 webhook 事件。
- 你的服务器 – 验证签名、缓冲事件并转发至 Zapier。
- Zapier – 解析 JSON、更新 CRM 并触发 Twilio 通知。
- Twilio – 发送 SMS 或语音回调。
需要留意的故障模式
- Retell 会对 webhook 重试 3 次,采用指数退避。
- Zapier 对 2xx 响应 不 重试。
- Twilio 试用账户的速率限制为 1 条短信/秒。
关键竞争条件: 若用户在句子中途挂断,Retell 可能先触发 call_ended 再触发 transcript_final。请对事件进行约 2 秒的缓冲,并按时间戳排序后再处理。
步骤实现
1. Retell 助手配置
- 启用函数调用。
- 提供系统提示,使其返回结构化的 JSON(例如
{ "action": "create_lead", "data": { ... } })。 - 避免使用 “be helpful” 之类的模糊提示,这会产生不结构化的输出,导致 Zapier 映射失败。
2. 部署 webhook 端点
- 将 Express 服务器部署到公网 URL(本地调试使用 ngrok,生产可选 Railway、Render 或 Vercel)。
- 在 Retell 仪表盘中注册该 URL。
- 使用手动呼叫进行测试,检查服务器日志中的签名验证情况。
3. Zapier 工作流设计
| Zap 触发器 | 操作 | 备注 |
|---|---|---|
| Webhooks by Zapier – Catch Hook | Code by Zapier(可选) – flatten payload | Zapier 对嵌套 JSON 解析不佳,需先扁平化后再发送。 |
| — | Google Sheets – Create Row(或 Salesforce – Create Lead) | 将 transcript 与 call_id 映射。提供默认值以避免缺字段导致的失败。 |
| — | Twilio – Send SMS(可选) | 使用 Messaging Service SID 以自动处理速率限制。 |
4. Twilio 通知层
- 添加 Zapier 动作,当 transcript 中出现 “urgent” 或 “callback” 等关键词时发送 SMS。
- 在 Twilio 动作中使用 Messaging Service SID,而非单一电话号码。
错误处理与边缘情况
- Webhook 超时: 若 Retell 在 5 秒内未收到 200 响应,会进行重试。使用幂等键(
call_id)去重。 - Zapier 字段映射失败: 缺失字段会导致整个动作被跳过。请在负载中提供默认值,例如
transcript: req.body.transcript || "No transcript available"。 - Twilio 投递失败: 固定电话返回错误 21211(无效收件人)。记录日志并跳过对该错误的重试。
测试与验证
- 进行一次测试呼叫。
- 验证:
- Retell webhook 已到达你的服务器(检查日志)。
- Zapier 已收到负载(查看 Zapier 任务历史)。
- Twilio 已发送 SMS(在 Twilio 控制台查看)。
- 测量延迟;若任一步骤超过约 5 秒,检查是否有阻塞代码,并将重工作业迁移至异步/后台任务。
系统图
graph LR
Input[Microphone] --> Buffer[Audio Buffer]
Buffer --> VAD[Voice Activity Detection]
VAD --> STT[Speech-to-Text]
STT --> NLU[Intent Detection]
NLU --> LLM[Response Generation]
LLM --> TTS[Text-to-Speech]
TTS --> Output[Speaker]
VAD -->|Silence Detected| ErrorHandler[Error Handler]
STT -->|Transcription Error| ErrorHandler
NLU -->|Intent Not Found| ErrorHandler
ErrorHandler --> Log[Logging System]
本地测试
使用 ngrok 暴露 webhook 并验证签名:
// Local webhook signature test (same as production handler)
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
app.post('/webhook/retell', (req, res) => {
const signature = req.headers['x-retell-signature'];
const secret = process.env.RETELL_WEBHOOK_SECRET;
const hash = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(req.body))
.digest('hex');
if (hash !== signature) {
console.error('Signature mismatch');
return res.status(401).json({ error: 'Invalid signature' });
}
console.log('Webhook validated:', req.body.event);
res.status(200).json({ received: true });
});
app.listen(3000, () => console.log('Local webhook listening on :3000'));
运行 ngrok http 3000,将生成的 HTTPS URL 粘贴到 Retell AI 仪表盘的 webhook 设置中,然后触发一次测试呼叫。检查控制台是否出现 “Webhook validated” 信息。
Webhook 验证
- 在 Retell AI 仪表盘查看 webhook 日志。
- 401 → 签名验证失败(检查
RETELL_WEBHOOK_SECRET)。 - 200 → 接收成功;确保服务器在 5 秒内返回,以避免重试。