问题现象:OpenClaw 无法响应 ElevenLabs 电话呼叫
当你尝试使用 ElevenLabs 的 phone_call 功能触发 OpenClaw Agent 时,可能出现以下典型现象:
- ElevenLabs 控制台显示「Call initiated」但无后续日志;
- OpenClaw 服务未收到任何 Webhook 请求(
/v1/elevenlabs/webhook无访问记录); - 收到
401 Unauthorized或403 Forbidden响应(常见于 JWT 验证失败); - 音频流中断、延迟高或仅单向通话(如 ElevenLabs 能听 OpenClaw,但无法识别用户语音)。
常见原因
该集成失败通常不源于代码逻辑,而在于环境与协议层配置缺失:
- Webhook 地址未公网可达:ElevenLabs 要求回调 URL 必须是 HTTPS、可被外网访问(不能是
localhost或内网 IP); - JWT 验证密钥不匹配:ElevenLabs 在 Webhook 请求头中携带
X-ElevenLabs-Signature,需用你配置在 ElevenLabs Dashboard 的Webhook Signing Secret验证; - 音频编解码不兼容:ElevenLabs 默认发送
audio/wav; codec=pcm(16-bit, 24kHz, mono),OpenClaw 若未启用对应解码器会静音; - 缺少 STUN/TURN 配置:当 OpenClaw 运行在 NAT 后(如 Docker 容器、云函数),需显式配置 STUN 服务器(如
stun:stun.l.google.com:19302)以建立 WebRTC 音频通道; - 超时设置过短:ElevenLabs 要求 Webhook 响应必须在 3 秒内返回
200 OK,否则视为失败并终止呼叫。
分步解决方案
1. 配置公网可访问的 Webhook Endpoint
确保你的 OpenClaw 实例暴露在公网,并使用有效 HTTPS 证书(推荐 Let’s Encrypt)。例如:
https://agent.yourdomain.com/v1/elevenlabs/webhook
在 ElevenLabs Dashboard → Phone Settings → Webhook URL 中填写该地址。
2. 启用并验证 JWT 签名
在 OpenClaw 启动时传入环境变量:
ELEVENLABS_WEBHOOK_SECRET=your_secret_from_dashboard
并在 Webhook 处理逻辑中校验签名(Python 示例):
import hmac, hashlib
def verify_signature(payload_body: bytes, signature: str, secret: str) -> bool:
expected_signature = "sha256=" + hmac.new(
secret.encode(), payload_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected_signature, signature)
3. 配置音频流支持
确认 OpenClaw 已启用 pydub 和 librosa,并在配置中声明:
audio:
input_format: "wav"
sample_rate: 24000
channels: 1
bit_depth: 16
4. 设置 STUN 服务器(如部署在 Docker/K8s)
在 OpenClaw 的 webrtc_config.yaml 中添加:
stun_servers:
- "stun:stun.l.google.com:19302"
- "stun:stun1.l.google.com:19302"
如何验证是否修复成功
执行以下三步验证:
- 用
curl -X POST https://agent.yourdomain.com/v1/elevenlabs/webhook -H "X-ElevenLabs-Signature: fake" -d '{}' -v检查服务是否响应200且无报错; - 在 ElevenLabs Dashboard 触发一次测试呼叫,查看 OpenClaw 日志是否输出
Received phone_call event: connected; - 拨打测试号码后,监听 OpenClaw 是否调用
speech_to_text并生成text_to_speech响应 —— 可通过ffmpeg -i /tmp/latest_input.wav -ar 24000 -ac 1 -f wav -检查原始音频文件。
解决不了时的补充建议
若仍失败,请检查:
- 防火墙/CDN 是否拦截了
X-ElevenLabs-Signature头(Cloudflare 默认丢弃自定义头,需在 Rules → Transform Rules 中放行); - ElevenLabs 电话区域限制:当前仅支持美国号码(+1)呼入,国际号码需申请白名单;
- OpenClaw 版本兼容性:确认使用
v0.8.3+(旧版不支持phone_call事件类型),运行openclaw --version验证; - 查看 ElevenLabs Webhook Logs(Dashboard → Phone → Webhook Logs),获取真实错误码与响应体。
如所有配置无误但仍失败,建议在 OpenClaw GitHub Issues 提交 [elevenlabs-phone] 标签 issue,并附上脱敏后的 Webhook 日志与 curl -v 测试结果。请以官方最新文档为准。
