使用无代码构建器快速部署 AI 语音代理

发布: (2025年12月15日 GMT+8 08:43)
8 min read
原文: Dev.to

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 重复写入。


架构与流程

  1. Retell AI – 处理语音交互并发送 webhook 事件。
  2. 你的服务器 – 验证签名、缓冲事件并转发至 Zapier。
  3. Zapier – 解析 JSON、更新 CRM 并触发 Twilio 通知。
  4. 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 HookCode by Zapier(可选) – flatten payloadZapier 对嵌套 JSON 解析不佳,需先扁平化后再发送。
Google Sheets – Create Row(或 Salesforce – Create Lead)transcriptcall_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(无效收件人)。记录日志并跳过对该错误的重试。

测试与验证

  1. 进行一次测试呼叫。
  2. 验证:
    • Retell webhook 已到达你的服务器(检查日志)。
    • Zapier 已收到负载(查看 Zapier 任务历史)。
    • Twilio 已发送 SMS(在 Twilio 控制台查看)。
  3. 测量延迟;若任一步骤超过约 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 秒内返回,以避免重试。
Back to Blog

相关文章

阅读更多 »